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

Can't get stacktrace when SIGSEGV using gdb

本文关键字:获取 堆栈 跟踪 gdb 使用      更新时间:2023-10-16

我有网络守护进程和请求,使SIGSEGV失败。所以我启动守护进程,使用 gdb 附加,继续,发送请求并得到这个:

$ gdb attach -p 630066
(gdb) c
Continuing.
Program terminated with signal SIGSEGV, Segmentation fault.
The program no longer exists.
(gdb) 

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

谢谢。

您的 GDB 会话表示您尚未附加多线程进程的所有线程,并且其他一些线程(您未附加的线程(遇到SIGSEGV并终止了整个进程。

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

使用gdb -p NNNN时,需要小心并指定正确的进程 ID。 pgrep daemon-nameps aux | grep daemon-name应该可以让您很好地了解要附加哪个过程。

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