使用strace和ltrace跟踪程序调用

ltrace能够跟踪进程的库函数调用,它会显现出哪个库函数被调用,而strace则是跟踪程序的每个系统调用.

1.系统调用的输出对比

程序代码:
#include 
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跟踪程序:
使用strace和ltrace跟踪程序调用_第1张图片

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

其实 #ltrace -S也可以把系统调用都打印出来:
使用strace和ltrace跟踪程序调用_第2张图片

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

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

我们再来看一下strace所花费的时间:
# strace -c dd if=/dev/urandom of=/dev/null count=1000
使用strace和ltrace跟踪程序调用_第4张图片

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
使用strace和ltrace跟踪程序调用_第5张图片
使用strace和ltrace跟踪程序调用_第6张图片
ltrace与strace都可以跟踪程序fork或clone子进程.
ltrace是用-f参数,而strace是用-f(fork/clone)和-F(vfork).

扩充阅读:

技巧: 使用truss、strace或ltrace诊断软件的"疑难杂症"

你可能感兴趣的:(Linux/Unix,调试)