gdb能否附加一个僵尸进程(<;已失效>;)?

gdb能否附加一个僵尸进程(<;已失效>;)?,gdb,daemon,zombie-process,Gdb,Daemon,Zombie Process,我有一个程序谁作为僵尸进程运行。我想调试它。但我有一个gdb错误 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 558

我有一个程序谁作为僵尸进程运行。我想调试它。但我有一个gdb错误

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.
mobile:/usr/local/ads5/bin#ps-axf | grep-ads|u解析器
5583 pts/2 S 0:00./ads_resolver main.cfg
5584 pts/2 Zl 0:36\\[ads_解析器]
移动:/usr/local/ads5/bin#gdb-ads_解析器5584
GNU gdb 6.8-debian
版权所有(C)2008免费软件基金会。
许可证GPLv3+:GNU GPL版本3或更高版本
这是自由软件:您可以自由更改和重新发布它。
在法律允许的范围内,不存在任何担保。键入“显示复制”
和“显示保修”了解详细信息。
此GDB配置为“i486 linux gnu”。。。
附加到程序:/usr/local/ads5/bin/ads_解析器,进程5584
ptrace:不允许操作。
/usr/local/ads5/bin/5584:没有这样的文件或目录。
(gdb)信息线程
没有登记册。
下面是我创建僵尸进程的代码:

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; 
}
模板
int监视器::Start()
{
pid_t pid;
pid=fork();
如果(pid==0)
{
IgnoreSignal::IgnoreDaemon();
信号(信号,监视器::重启);
pid=fork();
如果(pid==0)
{
IgnoreSignal::IgnoreAll();
工人;
worker.Run();
}
而(1)
{
睡眠(60);
}
}
返回0;
}

僵尸进程已完成执行,但操作系统正在等待父进程调用wait()。这只是一个状态或标志-就可执行性而言,进程不再“存在”

所以gdb不可能连接到不再执行的进程,包括一个僵尸进程


试试
sudo gdb
,不过要想得到解释,你必须等待有更多Unix知识的人的回答。但是,也许你可以连接到父级,然后使用
gdb>调用…wait(…)
手动收集它的状态(并在同一时间搞乱父级的状态;)