我正在研究在Qt,Windows中开发的项目,我使用Qt版本4.1.4和VC6 IDE来编译项目,大部分产品的使用都在WindowsXp上.
我经常收到测试人员和客户的崩溃报告,这些报告没有修复模式,也没有在我的开发环境中重现.
所以我得出结论,我需要从程序中写一个崩溃日志,以便在程序崩溃时我总是得到调用堆栈.
在linux中我知道它可以通过一些信号处理分段故障来做到这一点.但是如何在windows/C++中做同样的事情呢?
我试图在谷歌搜索找到一些现成的解决方案,但没有任何运气.
关于任何第三方工具/库(免费或许可)的建议也被接受,但请不要建议我必须修改模块中的每个功能以获取日志的任何方法,因为项目很大,我负担不起.
提前致谢.
更新.我现在已经将StackWalker附加到我的代码中(有点麻烦的_MBCS和UNICODE)但至少设法附加它.
我的主文件如下所示,
class MyStackWalker : public StackWalker
{
FILE *sgLogFile;
public:
MyStackWalker() : StackWalker()
{
sgLogFile = fopen("ThisIsWhatIcallLog.log", "w");
}
MyStackWalker(DWORD dwProcessId, HANDLE hProcess) : StackWalker(dwProcessId, hProcess)
{
}
virtual void OnOutput(LPCSTR szText)
{
printf(szText);
fprintf(sgLogFile, "%s",szText);
fclose(sgLogFile);
StackWalker::OnOutput(szText);
}
};
LONG Win32FaultHandler(struct _EXCEPTION_POINTERS * ExInfo)
{
MyStackWalker sw;
sw.ShowCallstack();
return EXCEPTION_EXECUTE_HANDLER;
}
void InstallFaultHandler()
{
SetUnhandledExceptionFilter((LPTOP_LEVEL_EXCEPTION_FILTER) Win32FaultHandler);
}
Run Code Online (Sandbox Code Playgroud)
但是,由于找不到符号,我得到链接器错误,
main.obj : error LNK2001: unresolved external symbol "public: int __thiscall StackWalker::ShowCallstack(void *,struct _CONTEXT const *,int (__stdcall*)(void *,unsigned __int64,void *,int,unsigned long *,void *),void *)" (?ShowCallstack@StackWalker@@QAEHPAXPBU_CONTEXT@@P6GH0_K0HPAK0@Z0@Z)
main.obj : error LNK2001: unresolved external symbol "protected: virtual void __thiscall StackWalker::OnDbgHelpErr(char const *,int,unsigned __int64)(?OnDbgHelpErr@StackWalker@@MAEXPBDH_K@Z)
main.obj : error LNK2001: unresolved external symbol "protected: virtual void __thiscall StackWalker::OnLoadModule(char const *,char const *,unsigned __int64,int,int,char const *,char const *,unsigned __int64)" (?OnLoadModule@StackWalker@@MAEXPBD0_KHH001@Z)
main.obj : error LNK2001: unresolved external symbol "protected: virtual void __thiscall StackWalker::OnSymInit(char const *,int,char const *)" (?OnSymInit@StackWalker@@MAEXPBDH0@Z)
main.obj : error LNK2001: unresolved external symbol "public: __thiscall StackWalker::StackWalker(int,char const *,int,void *)" (??0StackWalker@@QAE@HPBDHPAX@Z)
release/Prog.exe : fatal error LNK1120: 5 unresolved externals
Error executing link.exe.
Run Code Online (Sandbox Code Playgroud)
我修改了StackWalker.cpp文件以适应UNICODE支持,将"_tcscat_s"替换为"wcscat".
你能看到,这里出了什么问题?
Google Breakpad是一个跨平台的崩溃报告库,看起来很有用。
另请参阅StackWalker,了解一些用于获取堆栈跟踪的仅限 Windows 的代码。
QCoreApplication::notify此外,通过覆盖和捕获所有异常(包括 Windows 上的堆栈溢出和访问冲突等异步异常)来安装事件过滤器也是一个好主意。