2011-03-29 57 views
2

我有一个程序作为僵尸进程运行。我想调试它。但是我得到了一个gdb错误。gdb是否可以附加僵尸程序(<defunct>)?

mobile:/usr/local/ads5/bin# ps axf | grep ads_resolver 
5583 pts/2 S  0:00 ./ads_resolver main.cfg 
5584 pts/2 Zl  0:36 \_ [ads_resolver] <defunct> 

mobile:/usr/local/ads5/bin# gdb ads_resolver 5584 
GNU gdb 6.8-debian 
Copyright (C) 2008 Free Software Foundation, Inc. 
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html> 
This is free software: you are free to change and redistribute it. 
There is NO WARRANTY, to the extent permitted by law. Type "show copying" 
and "show warranty" for details. 
This GDB was configured as "i486-linux-gnu"... 
Attaching to program: /usr/local/ads5/bin/ads_resolver, process 5584 
ptrace: Operation not permitted. 
/usr/local/ads5/bin/5584: No such file or directory. 
(gdb) info threads 
No registers. 

有我的代码,创建僵尸进程:

template < class T> 
int Monitor <T>::Start() 
{ 
    pid_t pid; 
    pid = fork(); 
    if(pid == 0) 
    { 
     IgnoreSignal::IgnoreDaemon(); 
     signal(SIGCHLD,Monitor<T>::ReStart); 

     pid = fork(); 
     if(pid == 0) 
     { 
      IgnoreSignal::IgnoreAll(); 
      T worker; 
      worker.Run(); 
     } 
     while(1) 
     { 
      sleep(60); 
     } 
    } 
    return 0; 
} 
+0

尝试'须藤gdb',虽然一个解释你将不得不等待别人有更多的Unix知识的答案。 – 2011-03-30 12:12:44

回答

6

一个僵尸进程已完成执行,但操作系统正在等待家长来调用wait()。这只是一种状态或标志 - 该流程不再是“可执行”的存在。

因此,不可能让gdb连接到一个不再执行的进程,包括僵尸进程。

http://en.wikipedia.org/wiki/Zombie_process

+0

但是,也许你可以附加到家长,并使用'gdb>调用...等待(...)'手动收集它的状态(和probaby在同一时间搞乱父母的状态;)) – 2014-10-20 12:24:38