ltrace和strace除了能够在程序执行前介入进行库函数及系统调用的跟踪之外,还可以中途介入一个运行中的程序进行跟踪,这个功能对于程序的动态跟踪很有帮助。
strace/ltrace -p [进程号] 即可实现对指定进程的跟踪,本篇我就用一个简单的例子来介绍一下这个功能。
简单起见,我写一个不断执行的php程序
#!/usr/bin/php <?php while ( 1 ) { sleep(1); echo "ok\n"; } ?>
上述代码很容易理解,在死循环里我先sleep一秒,然后echo一个”ok”,目的是保证该程序不会退出。
然后用ps查到该进程的进程号
[leconte@localhost ~]$ ps axu | grep php leconte 22240 6.6 2.0 31912 10360 pts/1 S+ 20:58 0:00 php a.php
首先执行ltrace -p 22240,结果如下:
[leconte@localhost ~]$ ltrace -p 22240 write(1, "ok\n", 3) = 3 fflush(0x3b14c0) = 0 sleep(1) = 0 write(1, "ok\n", 3) = 3 fflush(0x3b14c0) = 0 sleep(1) = 0 .....
可以看到,php的sleep底层用的就是sleep函数,而echo实际用的是write。
再用strace -p 22240跟踪,结果如下:
[leconte@localhost ~]$ strace -p 22240 Process 22240 attached - interrupt to quit restart_syscall(<... resuming interrupted call ...>) = 0 write(1, "ok\n", 3) = 3 rt_sigprocmask(SIG_BLOCK, [CHLD], [], 8) = 0 rt_sigaction(SIGCHLD, NULL, {SIG_DFL, [], 0}, 8) = 0 rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0 nanosleep({1, 0}, {1, 0}) = 0 write(1, "ok\n", 3) = 3 rt_sigprocmask(SIG_BLOCK, [CHLD], [], 8) = 0 rt_sigaction(SIGCHLD, NULL, {SIG_DFL, [], 0}, 8) = 0 rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0 nanosleep({1, 0}, {1, 0}) = 0 write(1, "ok\n", 3) = 3 .....
我们又进一步看到,sleep内部实现上使用的系统调用是nanosleep。
通过ltrace和strace的动态跟踪,使我们对进程的工作有了更直观地理解,分析起系统问题会变得更加得心应手。
© 2010, Linux爱好者. 版权所有. 转载请注明来自http://www.linuxers.cn












