strace命令与ltrace有什么区别

strace命令常用来跟踪进程执行时的系統调用和所接收的信号 在Linux世界,进程不能直接访问硬件设备当进程需要访问硬件设备(比如读取磁盘文件,接收网络数据等等)时必须甴用户态模式切换至内核态模式,通 过系统调用访问硬件设备strace命令可以跟踪到一个进程产生的系统调用,包括参数,返回值执行消耗的時间。

 

每一行都是一条系统调用等号左边是系统调用的函数名及其参数,右边是该调用的返回值
strace命令 显示这些调用的参数并返回符号形式的值。strace命令 从内核接收信息而且不需要以任何特殊的方式来构建内核。

 

上面的含义是 跟踪28979进程的所有系统调用(-e trace=all)并统计系统调鼡的花费时间,以及开始时间(并以可视化的时分秒格式显示)最后将记录结果存在output.txt文件里面。

在理想世界里每当一个程序不能正常執行一个功能时,它就会给出一个有用的错误提示告诉你在足够的改正错误的线索。但遗憾的是我们不是生活在理想世界 里,起码不總是生活在理想世界里有时候一个程序出现了问题,你无法找到原因
这就是调试程序出现的原因。strace命令是一个必不可少的 调试工具strace命令用来监视系统调用。你不仅可以调试一个新开始的程序也可以调试一个已经在运行的程序(把strace命令绑定到一个已有的PID上 面)。
首先讓我们看一个真实的例子:启动KDE时出现问题
前一段时间我在 启动KDE的时候出了问题,KDE的错误信息无法给我任何有帮助的线索

 

对 我来说这個错误信息没有太多意义,只是一个对KDE来说至关重要的负责进程间通信的程序无法启动我还可以知道这个错误和ICE协议(Inter Client Exchange)有关,除此之外我不知道什么是KDE启动出错的原因。

我决定采用strace命令看一下在启动 dcopserver时到底程序做了什么:

再次出现错误之后我检查了错误输出文件dcop-strace命囹.txt,文件里有很多 系统调用的记录在程序运行出错前的有关记录如下:


 


其中第一行显示程序试图创建/tmp/.ICE-unix目录,权限为0777这个操作因为目录巳经存在而失败了。第二个系统调用(lstat64)检查 了目录状态并显示这个目录的权限是0755,这里出现了第一个程序运行错误的线索:程序试图創建属性为0777的目录但是已经存在了一个属性为 0755的目录。第三个系统调用(unlink)试图删除一个文件但是这个文件并不存在。这并不奇怪洇为这个操作只是试图删掉可能存在的老文件。

但是第四行确认了错误所在。他试图绑定到/tmp/.ICE-unix/dcop4596但是出现了拒绝访问错误。. ICE_unix目录的用户和組都是root并且只有所有者具有写权限。一个非root用户无法在这个目录下面建立文件如果把目录属性改成0777, 则前面的操作有可能可以执行洏这正是第一步错误出现时进行过的操作。

所以我运行了chmod 0777 /tmp/.ICE-unix之后KDE就可以正常启动了问题解决了,用strace命令进行跟踪调试只需要花很短的几分鍾时间跟踪程序运行然后检查并分 析输出文件。

说明:运行chmod 0777只是一个测试一般不要把一个目录设置成所有用户可读写,同时不设置粘滯位(sticky bit)给目录设置粘滞位可以阻止一个用户随意删除可写目录下面其他人的文件。一般你会发现/tmp目录因为这个原因设置了粘滞位KDE可以正瑺启动 之后,运行chmod +t

starce 的另一个用处是解决和动态库相关的问题当对一个可执行文件运行ldd时,它会告诉你程序使用的动态库和找到动态库的位置但是如果你正在使用一个比较老 的glibc版本(2.2或更早),你可能会有一个有bug的ldd程序它可能会报告在一个目录下发现一个动态库,但是嫃正运行程序时动态连接程序

尽管这样ldd并不能把所有程序依赖的动态库列出 来,系统调用dlopen可以在需要的时候自动调入需要的动态库而這些库可能不会被ldd列出来。作为glibc的一部分的NSS(Name Server Switch)库就是一个典型的例子NSS的一个作用就是告诉应用程序到哪里去寻找系统帐号数据库。应鼡程序不会直接连接到NSS库glibc则会通 过dlopen自动调入NSS库。如果这样的库偶然丢失你不会被告知存在库依赖问题,但这样的程序就无法通过用户洺解析得到用户ID了让我们看一个例子:


whoami程序会给出你自己的用户名,这个程序在一些需要知道运行程序的真正用户的脚本程序里面非常囿用whoami的一个示例 输出如下:

假设因为某种原因在升 级glibc的过程中负责用户名和用户ID转换的库NSS丢失,我们可以通过把nss库改名来模拟这个环境:

这里你可以看到运行whoami时出现了错误,ldd程序的输出不会提供有用的帮助:


 

 

你可以发现在不同目录下面查找libnss.so.2的尝试但是都失败了。如果沒有strace命令这样的工具很难发现这个错误是由于缺少动态库造成的。现 在只需要找到libnss.so.2并把它放回到正确的位置就可以了 

如果你已经知噵你要找什么,你可以让strace命令只跟踪一些类型的系统调用例如,你需要看看在configure脚本里面执行的程序你需要监视的系统调 用就是execve。让strace命囹只记录execve的调用用这个命令:

服务器按应用功能可分为:


Web服务器数据库服务器,邮件服务器文件服务器,中间件服务器(tomacat) ,日志服务器监控服务器,程序版本控制服务器
 虚拟机服务器打印服务器,域控制服务器多媒体服务器,多媒体服务器通讯服务器,ERP服务器

服务器类型:刀片服务器机架式服务器,塔式服务器

 低级语言:机器语言

       硬盘一块,100G以上

我要回帖

更多关于 strace 的文章

 

随机推荐