【问题标题】:catch all signal equivalent to catch all segment fault?捕获所有信号相当于捕获所有段故障?
【发布时间】:2020-12-08 05:31:37
【问题描述】:

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

我问这个的原因是我通常调试一个非常复杂的系统,很多segmentfault错误很难重现,用gdb逐行运行是不切实际的。所以如果我能捕捉到所有的段错误并打印一些调用堆栈或其他信息,那对我调试很有帮助。

【问题讨论】:

  • 应该有一种方法可以让您的 Linux 系统在进程出现段错误时生成核心转储。然后,您可以将调试器附加到可执行文件和核心转储并查看堆栈跟踪。

标签: c++ c linux segmentation-fault signals


【解决方案1】:

我想知道是否有办法捕获所有段错误...

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

...并打印它的调用堆栈?

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

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

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

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

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

(gdb) bt

用 gdb 逐行运行它是不切实际的。

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

【讨论】:

    猜你喜欢
    • 2011-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-23
    • 2014-06-01
    • 1970-01-01
    相关资源
    最近更新 更多