在应用程序崩溃期间获取堆栈跟踪 - c / c ++

时间:2016-05-19 15:14:37

标签: c++ c visual-studio-2012 dll stack-trace

我是一名java开发人员,正在尝试使用C-C ++代码。 基本上我有一些使用Visual Studio组件构建应用程序库的构建脚本--dll。我们不使用Visual Studio IDE进行调试。

但是每当我们在应用程序中遇到崩溃时,我们必须逐行输入调试语句,并且需要检查崩溃的确切代码行。

C / C ++中是否有任何API会在程序崩溃期间将堆栈跟踪写入文件?

在程序退出期间调用的某种事件侦听器,可以将堆栈跟踪和错误信息打印到日志文件中。

我见过许多与此相关的问题,但我无法在代码而不是调试工具中处理这个问题。我觉得Java在错误处理方面非常先进。

提前致谢!

3 个答案:

答案 0 :(得分:4)

标准没有为您提供任何设施。也就是说,您可以使用特定于操作系统的API来获得所需的内容。在Windows上,最简单的可能是使用StackWalker。你需要自己照顾SEH的怪异。我建议this article了解更多信息。

在POSIX平台上,您可以使用glibc中的backtrace函数。

通常,两者都要求使用调试信息编译程序。也可以创建没有符号名称的崩溃转储(请参阅Windows上的Minidumps),但是您需要对它们进行解码(例如Visual Studio为您提供的解码,但您在帖子中提到您没有#39} ;使用它。)

另外,请记住,从崩溃进程中编写崩溃转储 非常容易出错(因为您实际上不知道当时应用程序处于什么状态)。如果从其他进程编写故障转储,则可能会获得更可靠的结果。之前我已经整理了一个简单的example out-of-process crash handler,演示了如何实现它。

答案 1 :(得分:1)

您可以使用std::set_terminate定义在异常离开main()时要调用的函数,此外您还可以为SIGSEGV安装信号处理程序以捕获分段错误。

您可以使用libunwind(http://www.nongnu.org/libunwind/)获取堆栈跟踪(在Linux上)或使用libc中的backtrace()函数。

我有时在自己的异常类中做的一件事就是在构造函数中抓取并存储一个堆栈跟踪,然后我可以获取异常,并在其中捕获异常并打印出它的位置。

答案 2 :(得分:-1)

您可以在C中使用<errno.h>来处理错误并将其记录到日志文件中。错误的标准通量为stderr

获得错误的一个解决方案是使用<errno.h>中包含的函数perror来显示确切的错误。

要使用它,请将其放入错误捕获器中。

if (!fileIsOpen())
   perror("File not opened");

我希望它有所帮助。