GDB回溯了子进程

时间:2012-03-04 02:26:02

标签: c gdb fork debug-backtrace

我有一个应用程序,它会生成一个子进程。

子进程执行一些工作,在中间的某个地方它会产生分段错误。我使用GDB来调试它,我用过:

set follow-fork-mode child

我还为子节点中的函数设置了断点。但是GDB不会在我的断点处暂停。

父进程也处理seg-fault所以我不得不ctrl-c退出。然后,当我使用backtrace打印堆栈时,我得到的是

  

没有堆叠

为什么没有设置断点,为什么我没有得到堆栈?

1 个答案:

答案 0 :(得分:8)

  

为什么没有设置断点

断点正在被设置,但它没有被点击,因为......

  

为什么我没有得到堆栈?

......你显然是在调试错误的过程。

使用set follow-fork-mode child,GDB将跟随您创建的第一个子项。也许你创造了不止一个?

调试此方法的一种方法是使用SIGSEGVsignal建立sigaction处理程序。

在处理程序中,执行以下操作:

void handler(int signo)
{
  int i = 1;
  fprintf(stderr, "pid=%d, got signal=%d\n", getpid(), signo);
  while (i) { }
}

在另一个窗口中看到打印的消息后:

 gdb /proc/<pid>/exe <pid>
 (gdb) where