c - 子进程的 GDB 回溯

标签 c gdb fork debug-backtrace

我有一个 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 。也许您创造了不止一个?

调试此问题的一种方法是使用 signalsigaction 建立一个 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/

相关文章:

c - 为什么这段使用 fork() 的代码可以工作?

c - pthread_create 在编译时返回错误

c - C中 union 的内存共享

c++ - GDB中自动变量的打印类型和模板函数/方法的原型(prototype)

assembly - GDB ret "cannot access memory at address"

c++ - 为了便于阅读,在 GDB 上缩写 C++ 模板?

c - 将fork()的子级设置为前台,然后退出父级

c - c文件中外部变量的使用

c# - C# 中的 Des 和 3Des 以及 ecb(来自 C)

c - 我如何使用 vfork 在 uClinux 中生成守护进程?