如果出现崩溃,我们使用以下函数将堆栈转储以获取有关崩溃的更多信息:
static void dumpStack()
{
char buf[64];
pid_t pid = getpid();
sprintf( buf, "%d", pid );
pid_t fork_result = vfork();
int status;
if( fork_result == 0 )
execlp( "pstack", "pstack", buf, NULL );
else if( fork_result > 0 )
waitpid( fork_result, &status, 0 );
else
std::cerr << "vfork failed with err=%s" << strerror( errno ) << std::endl;
}
在上面的代码中,父进程一直停留在waitPid状态。我检查了子进程的状态,它变成了僵尸进程。
Deepak@linuxPC:~$ ps aux | grep 21054
700048982 21054 0.0 0.0 0 0 pts/0 Z+ 03:01 0:00 [pstack] <defunct>
而且子进程打印的堆栈信息也不完整,它只会打印一行信息然后退出。
#0 0x00007f61cb48d26e in waitpid () from /lib64/libpthread.so.0
不确定为什么父进程无法收割该进程。
请帮忙确认是否有遗漏。
vfork
在此处没有被列为信号安全,execlp
也不是。你可能可以使用Linux特定的backtrace
函数,但它也没有被列为信号安全(但已经在其他地方的信号示例中使用,比如这个)。 - Some programmer dude