从C程序中调用调试器

use*_*645 5 c linux gdb systems-programming

我正在读大卫汉森的书"C接口和实现".这个练习题似乎很有趣,无法找到解决方案:

在某些系统上,程序在检测到错误时可以自行调用调试器.当断言失败可能很常见时,此工具在开发期间特别有用.

您能否提供一个关于如何调用调试器的简短示例.

void handle_seg_fault(int arg)
{
    /* how to invoke debugger from within here */
}

int main()
{
    int *ptr = NULL;
    signal(SIGSEGV, handle_seg_fault);
    /* generate segmentation fault */
    *ptr = 1;
}
Run Code Online (Sandbox Code Playgroud)

Dev*_*lar 4

详细阐述 Christian.K 的评论,fork()面对 SIGFPE 或 SIGSEGV 之类的东西使用调试器可能不是最好的想法,因为......

  1. 您的程序一开始就可能已损坏,从而导致fork()不安全;
  2. 您可能想使用与程序硬编码不同的东西进行调试;
  3. 普通应用程序用户不知道如何使用调试器;
  4. 任何有能力使用调试器的人通常都会更喜欢核心转储而不是自动调用的调试器。

我可以复制到测试台的核心转储在一天中的任何时间都击败了客户工作场所的调试器实例。调试器界面会产生糟糕的最终用户错误消息。