Tags:, Posted in Linux开发 我抢沙发

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(&lt;... resuming interrupted call ...&gt;) = 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

收藏本文到网摘: 百度搜藏 QQ书签 Google书签 Del.icio.us 新浪ViVi 雅虎收藏 饭否 365Key网摘 天极网摘 POCO网摘 和讯网摘

推荐日志

    二月 8, 2010