2016-07-01 3 views
0

У меня есть программа, работающая на Windows cmd, и когда программа выдает ошибку, она продолжает ждать ввода пользователем, игнорируя/продолжая или отменяя, но у меня есть этот командный файл, который автоматически перезапускает программу по ошибке, но поскольку она продолжает ждать пользовательский ввод я должен туда и нажать кнопкуКак игнорировать запрос на ошибку Windows при выполнении программы?

:unturned 

echo (%time%) Unturned started. 

cd masterserver 
cd VisualStudio 
cd Debug 
masterserver.exe 

@echo All done! 
@echo Masterserver listening on port: 23466 

echo (%time%) WARNING: Unturned closed or crashed, restarting. >>c:\crashlog.txt 

ping 1.1.1.1 -n 1 -w 10000 >nul 

goto unturned 

Как сделать так, чтобы это проигнорировать ошибку и продолжить движение автоматически?

Вот образ строки:

image

+0

Поскольку в самом скрипте нет такого приглашения, он должен быть сам мастер-мастер, выполняющий приглашение перед выходом. Есть ли параметр командной строки для отключения приглашения? –

+0

Я загружаю его здесь http: // unity3d.com/master-server и скомпилировать с визуальной студией, тогда я просто запускаю exe с этой партией, не знаю о параметре командной строки – xlee

ответ

1

отображается всплывающее сообщение, что, когда сбой происходит утверждение в masterserver.exe. Ошибка указывает на ошибку кода, поскольку она проверяет условие во время компиляции, которое, как ожидается, всегда будет истинным во время выполнения, но вместо этого условие было фактически неверным.

В этом случае ошибка произошла в CCRakNetUDT::OnAck() в ccraknetudt.cpp на линии 528. Эта линия звонит RakAssert(rtt < 10000000);, где rtt является входным параметром для OnAck(). Утверждение состоит в том, что значение rtt всегда должно быть меньше 10000000, но на самом деле этого не было.

void CCRakNetUDT::OnAck(CCTimeType curTime, CCTimeType rtt, bool hasBAndAS, BytesPerMicrosecond _B, BytesPerMicrosecond _AS, double totalUserDataBytesAcked, bool isContinuousSend, DatagramSequenceNumberType sequenceNumber) 
{ 
#if CC_TIME_TYPE_BYTES==4 
    RakAssert(rtt < 10000); 
#else 
    RakAssert(rtt < 10000000); // <-- line 528 
#endif 

При компиляции отладочной сборки masterserver.exe для других, чем Xbox платформ, RakAssert() карты к assert(), в противном случае она является не-оп:

RakAssert.h

#include <assert.h> 
#include "RakNetDefines.h" 

RakNetDefines. h

#ifndef RakAssert 
#if defined(_XBOX) || defined(X360) 

#else 
#if defined(_DEBUG) 
#define RakAssert(x) assert(x); 
#else 
#define RakAssert(x) 
#endif 
#endif 
#endif 

За assert() documentation:

Вычисляет выражение и, когда результат является ложным, печатает диагностическое сообщение и прерывает программу.

...

утверждают макрос обычно используется для определения логических ошибок в процессе разработки программы. Используйте его, чтобы остановить выполнение программы, когда возникли непредвиденные условия, реализовав аргумент выражения для вычисления false, только когда программа работает некорректно. Проверки утверждений можно отключить во время компиляции, определяя макрос NDEBUG. Вы можете отключить макрос assert без изменения исходных файлов с помощью параметра командной строки /DNDEBUG. Вы можете отключить макрос assert в исходном коде, используя директиву #define NDEBUG до того, как <assert.h> включен.

Утверждающий макрос распечатывает диагностическое сообщение, когда выражение оценивает значение false (0) и вызывает abort, чтобы завершить выполнение программы. Никакое действие не выполняется, если выражение истинно (отличное от нуля). Диагностическое сообщение включает в себя несостоявшееся выражение, имя исходного файла и номер строки, где утверждение не выполнено.

...

Пункт назначения диагностического сообщения зависит от типа приложения, вызывающего эту процедуру. Консольные приложения всегда получают сообщение через stderr. В приложении на базе Windows assert вызывает функцию Windows MessageBox, чтобы создать окно сообщения, отображающее сообщение вместе с кнопкой OK. Когда пользователь нажимает OK, программа прерывается сразу.

Когда приложение связано с отладочной версии библиотек времени выполнения, assert создает окно сообщения с тремя кнопками: Abort, Retry и Ignore. Если пользователь нажимает Abort, программа прерывается немедленно. Если пользователь нажимает Retry, вызывается отладчик, и пользователь может отлаживать программу, если включена отладка «точно в срок» (JIT). Если пользователь нажимает Ignore, assert продолжает свое нормальное выполнение: создание окна сообщения с помощью кнопки OK. Обратите внимание, что нажатие Ignore, когда существует условие ошибки, может привести к неопределенному поведению.

...

assert макрос включен в обоих версиях выпуска и отладки библиотек времени выполнения C, когда NDEBUG не определен. Когда определено значение NDEBUG, макрос доступен, но не оценивает его аргумент и не имеет эффекта. Когда он включен, макрос assert вызывает _wassert для его реализации. Другие макросы утверждения, _ASSERT, _ASSERTE и _ASSERT_EXPR, также доступны, но они только оценивают выражения, переданные им, когда макрос _DEBUG был определен и когда они находятся в коде, связанном с версией отладки библиотек времени выполнения C.

Итак, если вы хотите отключить эту конкретную всплывающее сообщение об ошибке, вам необходимо либо:

  1. найти причину ошибки и исправить ее (или обратитесь к автору Unity, чтобы исправить это) , так как это ошибка кода.

  2. скомпилировать masterserver.exe для выпуска вместо отладки, поэтому RakAssert() не является оператором.

  3. определяет NDEBUG в исходном коде, в решении проекта, или с помощью переключателя /D компилятора в командной строке, так assert() является не оп.

Просто знайте, что отключение утверждения может привести к сбою или неправильному действию приложения, если ошибка повторится.

+0

wow, спасибо. Я уже опубликовал на форуме единства, но, поскольку я видел, что код из самого raknet не единства, и raknet fórum, похоже, отключен. Поскольку я исправляю код, это не вариант. Думаю, мне нужно будет жить с ошибкой на время, я пытаюсь выполнить командную строку/d, я посмотрю, что произойдет. – xlee

0

Обновление в случае, если у кого-то есть эта проблема: Я скомпилировал его в режиме выпуска, как сказал Реми, и проблема полностью исчезла, приложение теперь работает правильно без каких-либо ошибок.