应用程序崩溃时如何获取堆栈跟踪 - C/C++

4
我是一名Java开发人员,正在尝试编写C-C++代码。基本上,我们有一些构建脚本,使用Visual Studio组件来构建应用程序库 - dlls。我们不使用Visual Studio IDE进行调试。
但是每当我们遇到应用程序崩溃时,我们必须逐行输入调试语句并需要检查它崩溃的确切代码行。
在C/C++中是否有任何API可以在程序崩溃时将堆栈跟踪写入文件?某种事件侦听器,在程序退出期间被调用,并能够将堆栈跟踪和错误信息打印到日志文件中。
我见过许多相关的问题,但我无法理解如何在代码中处理这个问题,而不是使用调试工具。我认为Java在错误处理方面非常先进。
提前致谢!

1
在调试器中运行它,你可以从中获取堆栈跟踪。 - Galik
2
你不使用Visual Studio IDE进行调试真是太可惜了,因为它可以说是用于用户模式Windows程序的最佳调试器。如果必要,你可以使用WinDbg,它比Visual Studio更加强大和功能丰富,但代价是使用起来相当复杂(但如果你能克服这一点,它可以做一些惊人的事情)。 - WhozCraig
3个回答

5
标准库没有提供此功能。不过,您可以使用操作系统特定的API来实现。在Windows上,最简单的方法可能是使用StackWalker。您需要自己处理SEH异常。建议参考this article获取更多信息。
在POSIX平台上,您可以使用glibc的backtrace函数。
一般来说,这两种方法都需要在编译程序时加入调试信息。也可以创建没有符号名称的崩溃转储(例如Windows上的Minidumps),但您需要对其进行解码(例如Visual Studio会为您执行此操作,但您在帖子中提到您不使用它)。
同时,请记住从崩溃进程中编写崩溃转储非常容易出错(因为您真的不知道应用程序在那个时候的状态)。如果您从另一个进程编写崩溃转储,则可能获得更可靠的结果。之前,我已经组合了一个简单的 out-of-process crash handler示例,演示了如何实现这一点。

2
您可以使用std::set_terminate来定义一个在异常离开main()时调用的函数,此外您还可以安装一个SIGSEGV信号处理程序以捕获分段错误。
您可以使用libunwind(http://www.nongnu.org/libunwind/)来获取Linux上的堆栈跟踪,或者使用libc中的backtrace()函数。
在我的异常类中,我有时会在构造函数中抓取并存储堆栈跟踪,在捕获异常并打印出异常抛出的跟踪时,我可以获得这个信息。

0
你可以在C语言中使用<errno.h>来处理错误并将它们记录到日志文件中。标准的错误流是stderr
获取错误的一种解决方案是使用<errno.h>中包含的函数perror,它将显示确切的错误信息。
要使用它,请将其放置在错误捕获器中。
if (!fileIsOpen())
   perror("File not opened");

希望它有所帮助。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接