【发布时间】:2011-08-08 06:52:51
【问题描述】:
我正在从事在 Qt、Windows 中开发的项目, 我使用 Qt Version 4.1.4 和 VC6 IDE 编译项目,产品的大部分使用都在 WindowsXp 上。
我经常收到来自测试人员和客户的崩溃报告,这些报告没有修复模式并且无法在我的开发环境中重现。
所以我得出的结论是,我需要从我的程序中编写崩溃日志,以便在程序崩溃时始终获得调用堆栈。
在 linux 中,我知道可以通过一些分段错误的信号处理来做到这一点。但是如何在 windows/C++ 中做同样的事情呢?
我尝试在 Google 上搜索以找到一些现成的解决方案,但没有任何运气。
也接受有关任何第三方工具/库(免费或许可)的建议,但请不要建议任何我必须修改模块中的每个函数才能获取日志的方法,因为项目很大,我不能买得起。
提前致谢。
更新。 我现在已将 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);
}
但由于找不到符号,我得到链接器错误,
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.
我已修改 StackWalker.cpp 文件以适应 UNICODE 支持,将“_tcscat_s”替换为“wcscat”。
你能看出来,这里出了什么问题吗?
【问题讨论】:
-
请记住,您的用户可能会将任何意外操作称为“崩溃”。这包括挂起、图形损坏,甚至数据错误。崩溃日志只会记录真正的崩溃。
-
您好 MSalters,感谢您的回复,是的,我明白,只有“真正的崩溃”是可以的,其余的我可以使用错误跟踪系统中用户提供的信息进行管理