在C程序中调用debugging器

我正在阅读David Hanson的“C接口和实现”一书。 这个练习题似乎很有意思,我无法find解决scheme:

在某些系统上,程序在检测到错误时可以调用自己的debugging器。 这个function在开发过程中特别有用,当断言失败可能是常见的。

你能提供一个关于如何调用debugging器的简短例子。

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; } 

对Christian.K的评论进行详细阐述, fork()调试器面对像SIGFPE或SIGSEGV这样的东西可能不是最好的想法,因为…

  1. 你的程序可能会腐败开始,使fork()不安全;
  2. 你可能想要使用不同于程序硬编码的东西进行调试;
  3. 普通的应用程序用户不知道如何处理调试器;
  4. 任何能胜任调试器的人通常都会比自动调用的调试器更喜欢 coredump。

我可以复制到测试平台上的一个coredump在一天中的任何时间在我客户的工作场所打败一个调试器实例。 调试器接口会导致糟糕的最终用户错误消息。

我有这个:

 #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <signal.h> #include <string.h> #include <errno.h> void exception_handler(int) { int pid = getpid(); if (fork() != 0) { while(true) sleep(1000); } char buf[20]; sprintf(buf, "--pid=%u", pid); execlp("gdb", "gdb", buf, NULL); exit(-1); } int init() { if (signal(SIGSEGV, exception_handler) < 0) { return errno; } if (signal(SIGILL, exception_handler) < 0) { return errno; } if (signal(SIGFPE, exception_handler) < 0) { return errno; } return 0; } int main() { if (int rc = init()) { fprintf(stderr, "init error: %s\n", strerror(rc)); return 1; } *((char*)(0)) = 1; }