跟踪同一个系统中不同进程的系统调用

跟踪同一个系统中不同进程的系统调用

在编写多线程的程序时,偶尔会遇到某一个线程不工作的现象,想看看到底卡在什么地方。
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查询之后,确定为 信号处理函数中调用了snprintf函数,printf函数族为不可重入的,在信号处理函数中调用,其结果为 未确定

猜你喜欢

转载自jack-boy.iteye.com/blog/2119999