异想天开

What's the true meaning of light, Could you tell me why

线上观察程序

日期:2014-12-12 16:53:58
  
最后更新日期:2015-06-09 13:58:12
【技术文章】
很多时候,有这样一种需求线上程序出问题,需要定位问题。在日志中找线索,可能还不爽。那么可以:
第一招. strace linux下的多线程程序,多线程的实现是LWP轻量级进程(light weight process)。直接用strace查看线程在执行哪些系统调用,可以看到返回值以及传入的参数,还能查看调用的占用的时间。比如可以如下查看某个线程poll调用返回:
[code lang="cpp"]
strace -e poll -p PID
[/code]
为什么是PID,该PID就是pstack命令显示的线程号码xxx,比如LWP xxx。

第二招. gdb gdb可以动态attache,运行中的程序,同时查看或修改程序内的值。可以顺序判断出异常的位置。首先需要确定该线程(LWP)的标识符号,pstack一下进程就可以做到。pstack返回结果示例如下:
[code lang="cpp"]
Thread 2 (Thread 0x7f1f797fb700 (LWP 7349)):
[/code]
针对返回的Thread 2,然后写一个脚本gcc_x.sh。
[code lang="cpp"]
#gcc_x.sh
thread 2
bt
[/code]
很happy地执行:
[code lang="cpp"]
gdb -p PID -x gcc_x.sh
[/code]
PS:为什么,pstack得到的Thread 2和gdb的Thread 2是对应的?因为pstack也是gdb来实现的,不信,你看。
当然还有终极武器systemtap。不过,这个比较麻烦,当然其功能也是杠杠的。这里就暂不介绍了,实话说,那个我也用得少。
备注:
strace -f :跟踪创建子进程,fork调用
strace -o filename:将跟踪结果定向到某个文件
strace -t :每个系统调用发起时间
strace -T:每个系统调用消耗的时间
ltrace:查看动态库函数调用