我有一个分叉子进程的应用程序。
子进程做了一些工作,在中间的某个地方给出了分段错误。我用 GDB 来调试这个,我用过:
set follow-fork-mode child
我还为孩子中的一个函数设置了一个断点。但是 GDB 不会在我的断点处暂停。
父进程也处理段错误,所以我不得不 ctrl-c 退出。然后当我backtrace
用来打印堆栈时,我得到的只是
无堆栈
为什么没有设置断点,为什么我没有得到堆栈?
我有一个分叉子进程的应用程序。
子进程做了一些工作,在中间的某个地方给出了分段错误。我用 GDB 来调试这个,我用过:
set follow-fork-mode child
我还为孩子中的一个函数设置了一个断点。但是 GDB 不会在我的断点处暂停。
父进程也处理段错误,所以我不得不 ctrl-c 退出。然后当我backtrace
用来打印堆栈时,我得到的只是
无堆栈
为什么没有设置断点,为什么我没有得到堆栈?
为什么没有设置断点
正在设置断点,但没有被命中,因为...
为什么我没有得到堆栈?
...您显然正在调试错误的过程。
使用set follow-fork-mode child
,GDB 将跟随您创建的第一个孩子。也许你创造了不止一个?
调试此问题的一种方法是使用or建立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