捕获等同于捕获所有段故障的所有信号?

问题描述

我想知道是否有办法捕获所有段故障/核心转储,并打印其调用堆栈?捕获所有信号似乎是可行的方法,但是根据我的一些经验,我不太确定它是如何工作的,它并不总是能提供我想要的结果,有时它只是无法捕获核心转储,也许我做了有问题。

之所以这样问,是因为我通常使用非常复杂的系统进行调试,并且许多段错误都很难重现,并且无法逐行与gdb一起运行。因此,如果我可以捕获所有segmentfault并打印一些调用堆栈或其他信息,那将对我的调试很有帮助。

解决方法

我想知道是否有一种方法可以捕获所有段故障...

当然。这可以通过使用std::signal注册信号处理程序来实现。

...并打印其调用堆栈?

这非常棘手。没有标准方法可以检查C ++中的调用堆栈。 Linux有几种方法,但是不幸的是,使用POSIX标准backtrace函数的最传统的方法不是异步信号安全的,因此不能保证它可以在信号处理程序中工作。

一种更简单的方法是不在信号处理程序中执行此操作,而是将Linux配置为生成核心转储。您将获得更多的信息。

...核心转储,并打印其调用堆栈?

当然。您可以使用调试器:

gdb /path/to/executable /path/to/corefile

(gdb) bt

逐行与gdb一起运行并不实用。

然后在gdb中运行它,而不是逐行运行。只需在gdb中运行该程序直到出现段错误,然后打印回溯即可。