c++ - 如何让QT Application写入崩溃日志

标签 c++ windows qt

我正在从事使用 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”。

你能看到这里出了什么问题吗?

最佳答案

Google Breakpad是一个看起来很有用的跨平台崩溃报告库。

另见 StackWalker对于一些用于获取堆栈跟踪的仅限 Windows 的代码。

此外,通过覆盖 QCoreApplication::notify 安装事件过滤器并捕获所有异常(包括异步异常,例如 Windows 上的堆栈溢出和访问冲突)是一个好主意。

关于c++ - 如何让QT Application写入崩溃日志,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6978675/

相关文章:

c++ - 使用 QHash 和 QList 提高性能

c++ - Win32 SendInput mousemove滞后和卡住

c++ - 将图像保存到 Qt 中动态创建的目录中

javascript - 将 javascript 转换为 exe,WScript 尚未声明

windows - 查找并删除 Windows 中的不良符号链接(symbolic link)

c++ - Qt中应该使用哪种内存管理方式?

c++ - 为什么cmake的安装文件与实际构建的二进制文件不同?

c++ - header 中定义的 constexpr 变量在编译时多次求值

ruby-on-rails - 权限被拒绝(公钥)。致命的 : Could not read from remote repository

c++ - Qt - 跟踪 QAbstractAnimation 运动