Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 找出UNIX守护进程被卡住的地方?_C_Debugging_Unix_Gdb_Daemon - Fatal编程技术网

C 找出UNIX守护进程被卡住的地方?

C 找出UNIX守护进程被卡住的地方?,c,debugging,unix,gdb,daemon,C,Debugging,Unix,Gdb,Daemon,几年前,我编写了一个UNIX守护程序(wsqueryd),它将自身置于 背景: pid\u t pid; pid=fork(); if(pid0)/=>这是父进程 退出(退出成功);//终止它 //为进程创建新会话。 if(setsid()

几年前,我编写了一个UNIX守护程序(
wsqueryd
),它将自身置于 背景:

pid\u t pid;
pid=fork();
if(pid<0)
杂项日志错误和退出(“无法分叉父进程”);
如果(pid>0)/=>这是父进程
退出(退出成功);//终止它
//为进程创建新会话。
if(setsid()<0)
杂项日志错误和退出(“无法创建新会话”);
现在,我意识到有时候守护进程会被卡住。我附上了gdb:

$cd$DAEMON\u SRC\u路径
$ps aux | grep wsqueryd
apache 20735[…]
$sudo gdb wsqueryd#守护进程作为不同的用户运行
[...]
(gdb)附上20735
附加到程序:[……]/wsqueryd,进程20735
警告:“/lib/libk5crypto.so.3”的动态节不在预期地址(库错误或版本不匹配?)
警告:“/lib/libkrb5support.so.0”的动态节不在预期地址(库错误或版本不匹配?)
从/usr/lib/libcurl.so.4读取符号…从/usr/lib/debug/usr/lib/libcurl.so.4.2.0.debug读取符号…完成。
完成。
为/usr/lib/libcurl.so.4加载符号
从/usr/lib/libev.so.4读取符号…从/usr/lib/debug/usr/lib/libev.so.4.0.0.debug读取符号…完成。
完成。
为/usr/lib/libev.so.4加载的符号
从/lib/libz.so.1读取符号…从/usr/lib/debug/lib/libz.so.1.2.5.debug读取符号…完成。
完成。
[...]
(gdb)清单
1//(C)[……]
2.
3#包括
4#包括
5#包括“daemon.h”
6#包括“杂项h”
7#包括“retrieval.h”
8.
9 int main(int argc,char*argv[]){
10 misc_init(argv[0]);//一开始就要调用

我如何找出守护进程被卡住的地方?(使用周围的代码,并能够单步执行)

gdb命令
bt
可能是一个很好的起点。它显示了您当前停在哪里的回溯轨迹。
bt
似乎显示了正确的位置。但这对调查没有帮助。我想查看周围的代码,我想逐步查看它。问题是:当我运行
list
时,我只看到beg如上图所示,
main.c
的一局。
bt
将显示进程是否被卡住。您希望如何跟踪进程是否被卡住?
bt
可以显示守护进程正在等待的行,但如果没有源代码,您将无法浏览“环境”我相信您已经知道命令“list”将围绕您当前所在的位置列出…但是您是否知道命令“up”将占据堆栈的一个级别,更改“list”显示位置的上下文,允许您访问该范围内的变量,等等?命令“down”也会执行相反的操作。