如何解决捕获等同于捕获所有段故障的所有信号?
我想知道是否有办法捕获所有段故障/核心转储,并打印其调用堆栈?捕获所有信号似乎是可行的方法,但是根据我的一些经验,我不太确定它是如何工作的,它并不总是能提供我想要的结果,有时它只是无法捕获核心转储,也许我做了有问题。
之所以这样问,是因为我通常使用非常复杂的系统进行调试,并且许多段错误都很难重现,并且无法逐行与gdb一起运行。因此,如果我可以捕获所有segmentfault并打印一些调用堆栈或其他信息,那将对我的调试很有帮助。
解决方法
我想知道是否有一种方法可以捕获所有段故障...
当然。这可以通过使用std::signal
注册信号处理程序来实现。
...并打印其调用堆栈?
这非常棘手。没有标准方法可以检查C ++中的调用堆栈。 Linux有几种方法,但是不幸的是,使用POSIX标准backtrace
函数的最传统的方法不是异步信号安全的,因此不能保证它可以在信号处理程序中工作。
一种更简单的方法是不在信号处理程序中执行此操作,而是将Linux配置为生成核心转储。您将获得更多的信息。
...核心转储,并打印其调用堆栈?
当然。您可以使用调试器:
gdb /path/to/executable /path/to/corefile
(gdb) bt
逐行与gdb一起运行并不实用。
然后在gdb中运行它,而不是逐行运行。只需在gdb中运行该程序直到出现段错误,然后打印回溯即可。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。