7

我有一个分叉子进程的应用程序。

子进程做了一些工作,在中间的某个地方给出了分段错误。我用 GDB 来调试这个,我用过:

set follow-fork-mode child

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

父进程也处理段错误,所以我不得不 ctrl-c 退出。然后当我backtrace用来打印堆栈时,我得到的只是

无堆栈

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

4

1 回答 1

9

为什么没有设置断点

正在设置断点,但没有被命中,因为...

为什么我没有得到堆栈?

...您显然正在调试错误的过程。

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

调试此问题的一种方法是使用or建立SIGSEGV处理程序。signalsigaction

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

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
于 2012-03-04T16:57:45.813 回答