我有一个应用程序,它会生成一个子进程。
子进程执行一些工作,在中间的某个地方它会产生分段错误。我使用GDB来调试它,我用过:
set follow-fork-mode child
我还为子节点中的函数设置了断点。但是GDB不会在我的断点处暂停。
父进程也处理seg-fault所以我不得不ctrl-c退出。然后,当我使用backtrace
打印堆栈时,我得到的是
没有堆叠
为什么没有设置断点,为什么我没有得到堆栈?
答案 0 :(得分:8)
为什么没有设置断点
断点正在被设置,但它没有被点击,因为......
为什么我没有得到堆栈?
......你显然是在调试错误的过程。
使用set follow-fork-mode child
,GDB将跟随您创建的第一个子项。也许你创造了不止一个?
调试此方法的一种方法是使用SIGSEGV
或signal
建立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