我有一个 fork 子进程的应用程序。
子进程做了一些工作,并在中间某处给出了段错误。我使用 GDB 来调试它,我使用了:
set follow-fork-mode child
我还在子函数中设置了一个断点。但是 GDB 不会在我的断点处暂停。
父进程也处理段错误,所以我不得不按 ctrl-c 退出。然后,当我使用 backtrace
打印堆栈时,我得到的只是
No stack
为什么没有设置断点,为什么我没有得到堆栈?
最佳答案
Why is the breakpoint not being set
正在设置断点,但没有命中,因为...
and why didn't I get the stack?
...您显然在调试错误的进程。
通过set follow-fork-mode child
,GDB 将跟随您创建的第一个 child 。也许您创造了不止一个?
调试此问题的一种方法是使用 signal
或 sigaction
建立一个 SIGSEGV
处理程序。
在处理程序中,执行此操作:
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
关于c - 子进程的 GDB 回溯,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9551779/