在应用程序崩溃期间获取stacktrace-c/c++

get stacktrace during an application crash - c/c++

本文关键字:stacktrace-c c++ 获取 应用程序 崩溃      更新时间:2023-10-16

我是一名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");

我希望它能有所帮助。