SIGSEGV 使用 gdb 时无法获取堆栈跟踪

Can't get stacktrace when SIGSEGV using gdb

我有 Web 守护进程和请求,它因 SIGSEGV 而失败。所以我启动守护进程,附加 gdb,继续,发送请求并得到这个:

$ gdb attach -p 630066

(gdb) c
Continuing.

Program terminated with signal SIGSEGV, Segmentation fault.
The program no longer exists.
(gdb) 

如何让 gdb 在终止应用程序之前打印堆栈跟踪?应用程序没有子进程,只有线程。

谢谢。

获取 SIGSEGV 后,只需在 gdb shell 中输入 backtracebt。 要探索每个单独线程的堆栈跟踪,请从 info thread 开始,然后选择您需要的线程,例如 thread 3,然后键入 bt 以查看该线程的堆栈跟踪。

您的 GDB 会话表明您没有附加多线程进程的所有线程,并且 一些其他线程(您没有附加的线程)运行 到 SIGSEGV并终止了整个过程。

另一种(不太可能)的可能性是您使用的是非常旧的 GDB 版本,其中仍有 this bug(该错误已在 2009 年修复)。

使用 gdb -p NNNN 时需要小心并指定正确的进程 ID。 pgrep daemon-nameps aux | grep daemon-name 应该会让您知道要附加哪个进程。