正在创建故障日志
Creating a Crash Log
当我想找到导致程序崩溃的segfault或任何其他错误时,我总是用gdb检查核心转储。当这样的应用程序在没有安装gdb的计算机上运行时,这是非常痛苦的。
所以几天前,我使用了一个程序(JDownloader),该程序编写了一个崩溃日志文件,该文件包含一个堆栈跟踪。我认为这将是对我的应用程序的一个很大的增强。但我还没有找到任何关于如何在崩溃前编写一个包含stacktrace的文件的信息。
这可能吗?如何在Linux/Windows上执行此操作?我正在使用C/C++。
我相信JDownloader是用Java编写的。我认为该语言允许您在任何时候检索完整的纯文本堆栈跟踪。C++无法做到这一点,因为编译后的可执行文件通常不会保存任何关于生成它的代码的信息
Windows API允许您捕获致命异常并创建进程的转储(如果您不想处理大型文件,则创建进程的一部分)。然后可以使用windbg、Visual Studio或您选择的调试器来检查此转储。
这样做的缺点是必须具有用于生成转储可执行文件的确切源代码,以及在生成过程中生成的符号数据库(PDB文件)。除此之外,一些代码的优化方式使调试器无法为您提供准确的堆栈跟踪,即使使用符号数据也是如此。
有关详细信息,请参阅MiniDumpWriteDump。如果要采用此路线,最佳做法是而不是在崩溃过程中生成转储,而是生成一个子进程来转储父进程。
还有一些C和C++库可以"手动"记录调用堆栈,并在运行时为您提供它的文本表示,但我还没有遇到任何建议。
相关文章:
- 分段故障(堆芯转储)矢量
- C++中的动态铸造故障
- 数组的指针从不分段故障
- vscode g++链路故障:体系结构x86_64的未定义符号
- 访问被拒绝后,c++中的故障保护代码
- Windows 10-使用gtkmm-3.0库和g++[包括再现]的分段故障
- EvtExportLogneneneba API正在将远程计算机的事件日志保存到远程PC本身.如何将其保存到主机
- 调试 CUDA MMU 故障
- 是否可以配置提升日志刷新?
- Geeksforgeeks C 程序故障排除:IEE 754 表示法为十进制
- 跟踪日志中的T.11803()是什么意思?
- Arch Linux.AUR 包 mysql 不能用 makepkg 构建.错误:构建 () 中出现故障
- 加快在C++中读取/处理日志文件的速度
- 正在处理故障(堆芯转储)
- 如何将消息时间戳写入日志文件?
- 在 Boost::fiber 中引发的BOOST_ASSERT故障 Visual Studio "Debug" 构建
- 如何进行故障排除:未定义对"非虚拟 thunk to ..."的引用
- 当程序遇到故障时,如何在信号处理函数中写入日志和上传日志到MYSQL
- 正在创建故障日志
- 如何在C++中读取系统调用失败时显示的故障日志消息