У меня есть игра, которая продается в Steam, и в качестве таковой используется Steamworks SDK. Это имеет автоматический инструмент сбора ошибок как кратко описано здесь.
Каждый раз, когда моя игра генерирует необработанное исключение, она регистрируется на веб-сайте инструмента. Я заметил, что когда происходит сбой в моей сборке разработки, регистрируемый сбой включает имена файлов и номера строк. Однако, когда происходит сбой на пользовательском компьютере, эта информация отсутствует.
Я понимаю, что это небольшой вопрос, который задают в связи с конкретным инструментом. Я спросил, потому что я надеюсь, что есть общие знания (о флагах компиляции и т. Д.), Которые я могу применить к моей конкретной ситуации.
Я не знаю 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__
сам — включить это в любую строку сообщения, которую вы передаете движку (или к тем исключениям, которые вы можете выбросить).
Я предполагаю, что вы экспортируете код в Release Mode в Visual Studio, а не в Debug.
Visual Studio удаляет (путем оптимизации) некоторые элементы отладки, такие как ведение журнала памяти (_CrtDumpMemoryLeaks), но я не эксперт в том, что он делает и не удаляет. Я хотел бы начать с ссылки ниже, которая охватывает отладку в режиме выпуска.