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 中输入 backtrace
或 bt
。
要探索每个单独线程的堆栈跟踪,请从 info thread
开始,然后选择您需要的线程,例如 thread 3
,然后键入 bt
以查看该线程的堆栈跟踪。
您的 GDB 会话表明您没有附加多线程进程的所有线程,并且 一些其他线程(您没有附加的线程)运行 到 SIGSEGV
并终止了整个过程。
另一种(不太可能)的可能性是您使用的是非常旧的 GDB 版本,其中仍有 this bug(该错误已在 2009 年修复)。
使用 gdb -p NNNN
时需要小心并指定正确的进程 ID。 pgrep daemon-name
或 ps aux | grep daemon-name
应该会让您知道要附加哪个进程。
我有 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 中输入 backtrace
或 bt
。
要探索每个单独线程的堆栈跟踪,请从 info thread
开始,然后选择您需要的线程,例如 thread 3
,然后键入 bt
以查看该线程的堆栈跟踪。
您的 GDB 会话表明您没有附加多线程进程的所有线程,并且 一些其他线程(您没有附加的线程)运行 到 SIGSEGV
并终止了整个过程。
另一种(不太可能)的可能性是您使用的是非常旧的 GDB 版本,其中仍有 this bug(该错误已在 2009 年修复)。
使用 gdb -p NNNN
时需要小心并指定正确的进程 ID。 pgrep daemon-name
或 ps aux | grep daemon-name
应该会让您知道要附加哪个进程。