如何编译使文件名/行号可用于错误报告工具

How to compile so that filenames / line numbers are available for error-reporting tool?

本文关键字:用于 错误 工具 报告 文件名 何编译 编译      更新时间:2023-10-16

我有一款在Steam上销售的游戏,因此使用了Steamworks SDK。它有一个自动错误收集工具,如下所述。

每次我的游戏产生一个未处理的异常,它被记录在工具的网站上。我注意到,当在我的开发构建中发生崩溃时,记录的崩溃包括文件名和行号。但是,当在用户计算机上发生崩溃时,此信息将不存在。

  • 这可能是因为我的机器上有pdb,而不是用户的机器?
  • 是否有任何编译标志可能将有限的信息烘烤到EXE中,以便错误报告工具可能能够抓取它?

我意识到这是一个有点冒险的问题,并且与一个特定的工具有关。我问,因为我希望有一般的知识(关于编译标志等),我可以应用到我的具体情况。

我不知道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未定义(以启用断言)并包括_DEBUG进行额外检查(而Work Build可能两者都未定义)。看一下assert的定义:

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

如果一切都失败(定义/取消定义NDEBUG/_DEBUG) 你可以使用__FILE____LINE__自己 -包括在任何消息字符串你传递给引擎(或那些你可能抛出的异常)

我假定您在Visual Studio中以发布模式导出代码,而不是调试模式。

Visual Studio删除(通过优化)一些调试元素,如内存日志记录(_CrtDumpMemoryLeaks),但我不是它做什么和不删除的专家。我将从下面的链接开始,它涵盖了发布模式下的调试。

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

相关文章: