跟踪同一个系统中不同进程的系统调用
在编写多线程的程序时,偶尔会遇到某一个线程不工作的现象,想看看到底卡在什么地方。
1)查看日志,在每行日志中都添加线程号,该方法存在一个问题,当日志滚动很多天时,找到某个线程的最后一行日志比较费劲,并且如果没有很详细的debug日志的话,代码检查范围也比较广。
2)使用strace命令,strace命令是查看某个进程的系统调用,我们知道linux下线程其实是进程模拟的,它也有一个进程号。
或者使用pstree -p pid
然后调用strace -p pid就可以查看每个线程的系统调用。
接下来,用pstack pid命令查看系统调用的栈,相当于gdb的bt命令
附:
通过查找发现程序卡在futex上,如:
google查询之后,确定为[color=red]信号处理函数[/color]中调用了snprintf函数,printf函数族为不可重入的,在信号处理函数中调用,其结果为[color=red]未确定[/color]
在编写多线程的程序时,偶尔会遇到某一个线程不工作的现象,想看看到底卡在什么地方。
1)查看日志,在每行日志中都添加线程号,该方法存在一个问题,当日志滚动很多天时,找到某个线程的最后一行日志比较费劲,并且如果没有很详细的debug日志的话,代码检查范围也比较广。
2)使用strace命令,strace命令是查看某个进程的系统调用,我们知道linux下线程其实是进程模拟的,它也有一个进程号。
> top -H -p pid
Cpu(s): 0.0%us, 0.1%sy, 0.0%ni, 99.8%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st [18/1958]
Mem: 32845044k total, 11038828k used, 21806216k free, 881144k buffers
Swap: 8388600k total, 0k used, 8388600k free, 8332956k cached
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
20261 jackboy 20 0 899m 6468 908 S 0.0 0.0 0:02.95 ldapproxy
20262 jackboy 20 0 899m 6468 908 S 0.0 0.0 0:06.99 ldapproxy
20263 jackboy 20 0 899m 6468 908 S 0.0 0.0 0:06.96 ldapproxy
20264 jackboy 20 0 899m 6468 908 S 0.0 0.0 0:06.96 ldapproxy
20265 jackboy 20 0 899m 6468 908 S 0.0 0.0 0:06.96 ldapproxy
20266 jackboy 20 0 899m 6468 908 S 0.0 0.0 0:00.49 ldapproxy
20267 jackboy 20 0 899m 6468 908 S 0.0 0.0 0:00.49 ldapproxy
20268 jackboy 20 0 899m 6468 908 S 0.0 0.0 0:00.49 ldapproxy
20269 jackboy 20 0 899m 6468 908 S 0.0 0.0 0:00.49 ldapproxy
20270 jackboy 20 0 899m 6468 908 S 0.0 0.0 0:00.49 ldapproxy
20271 jackboy 20 0 899m 6468 908 S 0.0 0.0 0:00.49 ldapproxy
20272 jackboy 20 0 899m 6468 908 S 0.0 0.0 0:00.49 ldapproxy
20273 jackboy 20 0 899m 6468 908 S 0.0 0.0 0:00.49 ldapproxy
或者使用pstree -p pid
ldapproxy(20261)─┬─{ldapproxy}(20262)
├─{ldapproxy}(20263)
├─{ldapproxy}(20264)
├─{ldapproxy}(20265)
├─{ldapproxy}(20266)
├─{ldapproxy}(20267)
├─{ldapproxy}(20268)
├─{ldapproxy}(20269)
├─{ldapproxy}(20270)
├─{ldapproxy}(20271)
├─{ldapproxy}(20272)
└─{ldapproxy}(20273)
然后调用strace -p pid就可以查看每个线程的系统调用。
接下来,用pstack pid命令查看系统调用的栈,相当于gdb的bt命令
附:
通过查找发现程序卡在futex上,如:
futex(0xb770b0, FUTEX_WAIT, 2, NULL
google查询之后,确定为[color=red]信号处理函数[/color]中调用了snprintf函数,printf函数族为不可重入的,在信号处理函数中调用,其结果为[color=red]未确定[/color]