C 僵尸,gdb无法连接,如何检查上次呼叫或回溯

C 僵尸,gdb无法连接,如何检查上次呼叫或回溯,c,linux,gdb,backtrace,zombie-process,C,Linux,Gdb,Backtrace,Zombie Process,我的应用程序在Linux机器上变成僵尸,它不能被杀死,gdb不能连接到它,我不能调试。现在我想知道最后一个调用的函数或回溯,是否有其他方法可以得到这个?在/proc/pid/stat下是否有我可以使用的信息 不,你不能。僵尸是一个已经消失的过程。唯一存在的是操作系统的进程表中的一个条目。僵尸是已经完成的进程,但是它们的父进程仍然没有处理SIGCHLD信号和/或没有调用wait(2)syscall(行话说父进程没有“收获”子进程)。僵尸进程释放了内存,但保留了一些描述进程的内核结构,包括进程表中的

我的应用程序在Linux机器上变成僵尸,它不能被杀死,gdb不能连接到它,我不能调试。现在我想知道最后一个调用的函数或回溯,是否有其他方法可以得到这个?在/proc/pid/stat下是否有我可以使用的信息

不,你不能。僵尸是一个已经消失的过程。唯一存在的是操作系统的进程表中的一个条目。

僵尸是已经完成的进程,但是它们的父进程仍然没有处理
SIGCHLD
信号和/或没有调用
wait(2)
syscall(行话说父进程没有“收获”子进程)。僵尸进程释放了内存,但保留了一些描述进程的内核结构,包括进程表中的条目。释放内存后,无法获得堆栈跟踪或僵尸的内存转储。

处于僵尸状态的进程已死亡,即不再运行,但尚未从系统中删除。这就是为什么你不能用gdb来附加它。谢谢你的回复。有人告诉我,该进程的proc条目中有一个字段,显示最后调用的函数地址,我可以得到该值,然后gdb打开二进制文件并读取该地址的函数名,你知道这是可能的吗?如果僵尸进程已正常终止,那么最后调用的函数将是
出口(2)
syscall。如果由于错误而终止,例如接收到
SIGSEGV
,则可以安排生成堆芯转储。但是有僵尸在身边意味着你应该从调试父进程开始,而不是从僵尸开始,来找出为什么子进程不能正常收获。