如何编译使文件名/行号可用于错误报告工具
How to compile so that filenames / line numbers are available for error-reporting tool?
我有一款在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相关文章:
- 需要帮助在 c++ 中将字符串转换为字符 ----错误 "const char *" 类型的值不能用于初始化 "char" 类型的实体
- Arduino 用于语句错误。令牌之前的预期')' ';'。如何解决这个问题?
- 将 SFML 用于代码块C++出现错误库 SFML
- 用于查找数组中最大元素的出现次数的代码,给出分段错误
- 为什么这个分配器不适用于"std::allocate_shared"?奇怪的模板替换错误
- 我正在尝试学习如何在 c++ 中传递指针,但出现错误:没有用于调用"test"的匹配函数。我做错了什么?
- 谁能告诉我,程序中的错误是什么?该程序仅用于获取文件扩展名
- 我已经安装了用于c++编程的升华3,但在编写了一个简单的程序后,我遇到了以下错误
- 如何修复用于根据参数返回不同类型的模板类中的错误C2679?
- 致命错误:cuda.h:没有用于 c++ 的此类文件或目录
- 卤化物:较大图像的去马赛克算法错误.似乎适用于 16x16 图像
- 向量迭代器不兼容的错误,用于保存另一个向量的迭代器的向量
- MFC 对话框属性表用法在 VS 2017 中产生错误,适用于 VS 2013
- G++ (C++14) 链接器错误,用于处理 C++03 代码
- 回调方法显示错误,类型为"void(*)"的值不能用于初始化类型的实体
- C++天鹅座的错误;没有用于调用"std::basic_fstream..."的匹配函数
- 为什么使用适用于C++的 AWS 开发工具包创建 EC2Client 段错误
- 自定义删除器,用于shared_ptr<>给出"无上下文错误"
- 流输入运算符导致分段错误与 clang 但适用于 gcc
- 如何编译使文件名/行号可用于错误报告工具