Как скомпилировать так, чтобы имена файлов / номера строк были доступны для инструмента сообщения об ошибках?

У меня есть игра, которая продается в Steam, и в качестве таковой используется Steamworks SDK. Это имеет автоматический инструмент сбора ошибок как кратко описано здесь.

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

  • Возможно, это потому, что у меня есть PDB на моей машине, а не на машине пользователя?
  • Существуют ли какие-либо флаги компиляции, которые могут запекать ограниченную информацию в EXE-файл, чтобы инструмент сообщения об ошибках мог ее получить?

Я понимаю, что это небольшой вопрос, который задают в связи с конкретным инструментом. Я спросил, потому что я надеюсь, что есть общие знания (о флагах компиляции и т. Д.), Которые я могу применить к моей конкретной ситуации.

1

Решение

Я не знаю Steamworks SDK, но, по крайней мере, попытаюсь объяснить общее использование препроцессора NDEBUG, _DEBUG, __FILE__ а также __LINE__ по классике assert.h (взяты из Windows SDK / VC включают):

#include <crtdefs.h>

#undef  assert

#ifdef  NDEBUG

#define assert(_Expression)     ((void)0)

#else

#ifdef  __cplusplus
extern "C" {
#endif

_CRTIMP void __cdecl _wassert(_In_z_ const wchar_t * _Message, _In_z_ const wchar_t *_File, _In_ unsigned _Line);

#ifdef  __cplusplus
}
#endif

#define assert(_Expression) (void)( (!!(_Expression)) || (_wassert(_CRT_WIDE(#_Expression), _CRT_WIDE(__FILE__), __LINE__), 0) )

#endif  /* NDEBUG */

Release Build обычно отключает утверждения, определяя NDEBUG в то время как Debug Build обычно уходят NDEBUG undefined (чтобы включить подтверждения) и включить _DEBUG для дополнительных проверок (пока Work Build может иметь оба неопределенных). Посмотрите на определение assert:

#define assert(_Expression) (void)( (!!(_Expression)) \
|| (_wassert(_CRT_WIDE(#_Expression), \
_CRT_WIDE(__FILE__), __LINE__), 0) )

Если все остальное терпит неудачу (Определение / не определенное NDEBUG / _DEBUG) ты можешь использовать __FILE__ а также __LINE__ сам — включить это в любую строку сообщения, которую вы передаете движку (или к тем исключениям, которые вы можете выбросить).

2

Другие решения

Я предполагаю, что вы экспортируете код в Release Mode в Visual Studio, а не в Debug.

Visual Studio удаляет (путем оптимизации) некоторые элементы отладки, такие как ведение журнала памяти (_CrtDumpMemoryLeaks), но я не эксперт в том, что он делает и не удаляет. Я хотел бы начать с ссылки ниже, которая охватывает отладку в режиме выпуска.

http://msdn.microsoft.com/en-us/library/fsk896zz.aspx

1

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector