在应用程序崩溃期间获取stacktrace-c/c++
get stacktrace during an application crash - c/c++
我是一名java开发人员,正在尝试C-C++代码。基本上,我有一些构建脚本,它使用Visual Studio组件来构建应用程序库-dll。我们不使用Visual Studio IDE进行调试。
但是,每当我们在应用程序中遇到崩溃时,我们都必须逐行输入调试语句,并需要检查崩溃的确切代码行。
C/C++中是否有API会在程序崩溃时将堆栈跟踪写入文件?
在程序退出期间调用的某种事件侦听器,可以将堆栈跟踪和错误信息打印到日志文件中。
我看到了许多与此相关的问题,但我不知道如何在代码中而不是调试工具中处理此问题。我觉得Java在错误处理方面非常先进。
提前感谢!
标准没有为此提供任何便利。也就是说,您可以使用特定于操作系统的API来获得您想要的东西。在windows上,最简单的可能是使用StackWalker。你确实需要自己照顾SEH的怪癖。我建议这篇文章了解更多信息。
在POSIX平台上,您可以使用glibc中的回溯函数。
通常,两者都要求使用调试信息编译程序。也可以创建没有符号名称的崩溃转储(请参阅Windows上的Minidumps),但您需要对它们进行解码(例如,Visual Studio为您提供了解码,但您在文章中提到您不使用它)。
此外,请记住,从崩溃进程中写入崩溃转储非常容易出错(因为您当时真的不知道应用程序的状态)。如果您从另一个进程写入崩溃转储,您可能会得到更可靠的结果。早些时候,我整理了一个简单的进程外崩溃处理程序示例,演示了如何实现它。
您可以使用std::set_terminate
来定义异常离开main()
时要调用的函数。此外,您还可以为SIGSEGV安装一个信号处理程序来捕获分段错误。
您可以使用libunfold()获取堆栈跟踪(在Linux上)http://www.nongnu.org/libunwind/)或使用libc中的backtrace()
函数。
有时,我在自己的异常类中会做一件事,那就是在构造函数中获取并存储一个stacktrace,然后我就可以获得捕获异常的位置,并打印它从哪里抛出的跟踪。
您可以在C中使用<errno.h>
来处理错误并将其记录到日志文件中。误差的标准通量为stderr
。
获取错误的一种解决方案是使用<errno.h>
中包含的函数perror,该函数将显示确切的错误。
要使用它,请将它放入错误捕获器中。
if (!fileIsOpen())
perror("File not opened");
我希望它能有所帮助。
- 尝试将 boost::stacktrace 添加到 CMake 项目时出现构建错误
- boost::stacktrace on Windows MSVS 2017
- 获取stacktrace for Crash,而无需在调试器中运行该应用程序
- 如何在C 程序的StackTrace中查看有用的信息(文件名,编号)
- 交叉编译时,Boost stacktrace不会对名称进行解映射
- Glog库(Google Log)在StackTrace中打印出`(未知)
- 在应用程序崩溃期间获取stacktrace-c/c++
- StackTrace c++应用程序
- C++编译器异常-StackTrace为空
- 使用MinGW在C++中生成异常时的Stacktrace