C++ Can';当SIGSEGV使用gdb时,无法获取stacktrace

C++ Can';当SIGSEGV使用gdb时,无法获取stacktrace,c++,gdb,stack-trace,C++,Gdb,Stack Trace,我有一个web守护进程和一个请求,它使SIGSEGV失败。因此,我启动守护进程,连接gdb,继续,发送请求并获取以下信息: $ gdb attach -p 630066 (gdb) c Continuing. Program terminated with signal SIGSEGV, Segmentation fault. The program no longer exists. (gdb) 如何在终止应用程序之前使gdb打印stacktrace?应用程序没有子进程,只有线程 谢谢

我有一个web守护进程和一个请求,它使SIGSEGV失败。因此,我启动守护进程,连接gdb,继续,发送请求并获取以下信息:

$ gdb attach -p 630066

(gdb) c
Continuing.

Program terminated with signal SIGSEGV, Segmentation fault.
The program no longer exists.
(gdb) 
如何在终止应用程序之前使gdb打印stacktrace?应用程序没有子进程,只有线程


谢谢。

在获得SIGSEGV后,只需在gdb shell中输入
backtrace
bt

要探索每个单独线程的堆栈跟踪,请从
info-thread
开始,然后选择所需的线程,例如
thread 3
,然后键入
bt
以查看该线程的堆栈跟踪。

您的GDB会话表明您尚未连接多线程进程的所有线程和其他线程(您没有附加的)遇到
SIGSEGV
并终止了整个过程

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


当使用
gdb-p NNNN
时,您需要小心并指定正确的进程id。
pgrep守护程序名称
ps aux | grep守护程序名称
应该能让您很好地了解要附加哪个进程。

问题是这一行“程序不再存在”。为了检查进程堆栈,我应该让进程处于活动状态,但它已经死了。据我所知,您可以收集核心转储并使用gdbAs进行分析,您仍然需要进程处于活动状态以生成核心转储。我只是在获得SIGSEGV后立即完成了该进程。我如何才能获得此核心转储?@BRACHISTORCON您能告诉我具体的顺序吗我应该做什么?我在那篇文章中找不到任何有用的东西。这都是关于gdb实际使用SIGSEGV停止进程执行的情况(我的情况不是这样)。所以,也许我错过了什么?你能用
-fstack protector all
重建web守护进程吗?也许你在守护进程中的某个地方有堆栈溢出。我发现,如果在gdb下运行程序(从一开始不是通过附加),它会正确停止并显示堆栈。仍然不知道这种行为的原因。“您的GDB会话表明您尚未附加多线程进程的所有线程”-我确信GDB在附加时会开始查找所有线程(我的程序只有pthreads而不是fork)。无论我附加了什么线程。@brachistochron“我确信。。。“。您的信心是错误的:如果您给GDB进程id(也称为主线程的PID),GDB将附加所有线程,但是如果您给它非主线程的线程id,则只附加一个线程。