您的位置:首页 > 其它

使用strace和ltrace跟踪程序调用

2013-11-23 21:00 162 查看
ltrace能够跟踪进程的库函数调用,它会显现出哪个库函数被调用,而strace则是跟踪程序的每个系统调用.

1.系统调用的输出对比

程序代码:

#include <stdio.h>
main(){
char str[]= "Abcde";
printf("\n string = %s length = %d \n",str,str_length(str));
}

int str_length (const char *s){
int length = 0;
while (*s++){
length++;
}
return (length);
}


用#ltrace跟踪程序:



用#strace跟踪程序:



我们看到程序调用write()系统调用做了输出,同时strace还把程序运行时所做的系统调用都打印出来了.

其实#ltrace -S也可以把系统调用都打印出来:



注:我们看到它实际是用SYS_write系统调用来做打印输出,其实write()函数是SYS_write的封装,SYS_write是真正的系统调用.

2.ltrace/strace的耗时

# ltrace -c dd if=/dev/urandom of=/dev/null count=1000



使用-c选项,ltrace输出由进程创建的库调用,输出结果以调用过程的时间为准进行排序,因为是从urandom设备上读,这是一种产生随机数的设备,完成后,写入null设备.
所以读过程花费了较多的时间.
使用ltrace去捕获运行时函数,就好像在进程上系上了一个调试工具,它占据了ltrace大量的时间,这里ltrace一共消耗了3.28秒.

我们再来看一下strace所花费的时间:

# strace -c dd if=/dev/urandom of=/dev/null count=1000



strace一共消耗了0.008秒,strace把性能提升了很多倍,这主要是strace在跟踪系统调用的时候不需要动态库,而ltrace是根据动态库来分析程序运行的.
所以ltrace也只能跟踪动态库,不能跟踪静态库.
事实上我们用ltrace和strace都可以发现程序在哪个系统调用时发生了性能瓶径.
ltrace用-T,而strace也用-T.

3.ltrace与strace的相同点

ltrace与strace都可以指定PID,即对运行中的程序进行跟踪.
ltrace -p PID与strace -p PID





ltrace与strace都可以跟踪程序fork或clone子进程.
ltrace是用-f参数,而strace是用-f(fork/clone)和-F(vfork).

扩充阅读:
技巧: 使用truss、strace或ltrace诊断软件的"疑难杂症"
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: