linux下程序假死
发布时间:2006-09-10 00:51:19来源:红联作者:coolentboy
前一段时间新开发的一个程序,总是会出现一些奇怪的停滞,也就是说程序长期运行就不再输出信息了。
因为是在调试阶段所以程序在很多地方都有用printf()输出的消息,以判断程序出现错误的位置,然后有诊断性的解决问题。
程序大致结构如下:信号处理函数a(),对信号处理函数得到的数据进行处理b().捕捉到的消息全部是在数据处理函数b()内的,因为程序是在rh9.0上开发,然后在裁减系统上跑而且目前程序都是在小系统内实测的,不然得不出实际效果;而且程序是处于长期运行,所以用gdb不太好不过该错误(刚开始这么认为得),所以就一直用printf()函数来得到一些错误。
[code] void a(...){
...
printf("signal catched\n");
...
}
void b(...){
...
printf("enter b()\n");
...
while(1){
...
printf("...");
c();
printf("data have received\n");
..
}
}[/code]
void b()函数内printf()很多就对了,每次程序都是在b()内某个printf()消息输出后,就停滞不动了。
刚开始认为是使用锁出现了问题,但是后来改过后改问题仍然出现。
最后将小系统使用得库文件等都使用rh9.0下得程序来跑,通过配置环境变量来做的,在程序停滞的时候进入gdb环境。
[code]gdb
>attach (no)
>thread apply no backtrace full
>bt(显示不出来需要的信息)[/code]
注:b() 采用线程来实现,当然了还有其它的很多不同模块的线程也在运行。
从线程栈可以看到:
当b()线程运行到printf()->vfprintf()时信号到达;进入信号处理函数a()->printf()->vfprintf()停滞。
从栈可以看出程序是因为printf()函数导致停滞的,查阅资料有说是和流控制有关,我想最大的可能就是和printf()的实现机制有关系。
不过最让我想不通的还是b()还有一次是死在malloc()内,但是我的a()处理函数根本没有使用malloc()函数。