问题描述
我想知道是否有办法捕获所有段故障/核心转储,并打印其调用堆栈?捕获所有信号似乎是可行的方法,但是根据我的一些经验,我不太确定它是如何工作的,它并不总是能提供我想要的结果,有时它只是无法捕获核心转储,也许我做了有问题。
之所以这样问,是因为我通常使用非常复杂的系统进行调试,并且许多段错误都很难重现,并且无法逐行与gdb一起运行。因此,如果我可以捕获所有segmentfault并打印一些调用堆栈或其他信息,那将对我的调试很有帮助。
解决方法
我想知道是否有一种方法可以捕获所有段故障...
当然。这可以通过使用std::signal
注册信号处理程序来实现。
...并打印其调用堆栈?
这非常棘手。没有标准方法可以检查C ++中的调用堆栈。 Linux有几种方法,但是不幸的是,使用POSIX标准backtrace
函数的最传统的方法不是异步信号安全的,因此不能保证它可以在信号处理程序中工作。
一种更简单的方法是不在信号处理程序中执行此操作,而是将Linux配置为生成核心转储。您将获得更多的信息。
...核心转储,并打印其调用堆栈?
当然。您可以使用调试器:
gdb /path/to/executable /path/to/corefile
(gdb) bt
逐行与gdb一起运行并不实用。
然后在gdb中运行它,而不是逐行运行。只需在gdb中运行该程序直到出现段错误,然后打印回溯即可。