我有一个应用程序,它分叉出一个子进程。
子进程执行一些操作,在执行过程中会出现分段错误。我使用了GDB进行调试,使用了以下命令:
set follow-fork-mode child
我还将子函数设为断点,但GDB没有在我的断点处暂停。
另外,父进程处理了段错误,所以我不得不使用ctrl-c退出。然后,当我使用backtrace打印栈时,我得到的只是“无栈”。
为什么断点没有被设置,而且我为什么没有得到堆栈?
我有一个应用程序,它分叉出一个子进程。
子进程执行一些操作,在执行过程中会出现分段错误。我使用了GDB进行调试,使用了以下命令:
set follow-fork-mode child
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
gprof
是用于性能分析而不是调试的。我(仍然)假设您想找出子进程在哪里终止,而不是对其进行性能分析。要以调试模式重新构建它,您应该在执行configure
之前在您的shell(bash)中执行export CFLAGS=-g
(我假设您知道如何从源代码构建程序)。我曾经对子进程进行了大量调试,但我无法回忆起一种情况,即gdb中的follow-fork-mode
按预期工作而没有给我带来麻烦,因此我正在尝试为您提供一个解决方法。 - sirgeorge