strace命令应用分析实例一:
通用的完整用法:linux
strace -o output.txt -T -tt -e trace=all -p 28979
上面命令参数含义是:
跟踪28979进程的全部系统调用(-e trace=all),并统计系统调用的花费时间,以及开始时间(并以可视化的时分秒格式显示),最后将记录结果存在output.txt文件里面。socket
用strace调试程序分析过程以下:ide
在理想世界里,每当一个程序不能正常执行一个功能时,它就会给出一个有用的错误提示,告诉你在足够的改正错误的线索。但遗憾的是,咱们不是生活在理想世界 里,起码不老是生活在理想世界里。有时候一个程序出现了问题,你没法找到缘由。
这就是调试程序出现的缘由。strace是一个必不可少的 调试工具,strace用来监视系统调用。你不只能够调试一个新开始的程序,也能够调试一个已经在运行的程序(把strace绑定到一个已有的PID上 面)。
下面让咱们看一个真实的例子:启动KDE时出现问题
在 启动KDE的时候出了问题,KDE的错误信息没法给我任何有帮助的线索。工具
_KDE_IceTransSocketCreateListener: failed to bind listener _KDE_IceTransSocketUNIXCreateListener: ...SocketCreateListener() failed _KDE_IceTransMakeAllCOTSServerListeners: failed to create listener for local Cannot establish any listening sockets DCOPServer self-test failed.
对 我来讲这个错误信息没有太多意义,只是一个对KDE来讲相当重要的负责进程间通讯的程序没法启动。我还能够知道这个错误和ICE协议(Inter Client Exchange)有关,除此以外,我不知道什么是KDE启动出错的缘由。
决定采用strace看一下在启动 dcopserver时到底程序作了什么:unix
strace -f -F -o ~/dcop-strace.txt dcopserver
命令参数说明以下:
这里 -f -F选项告诉strace同时跟踪fork和vfork出来的进程,-o选项把全部strace输出写到~/dcop-strace.txt里 面,dcopserver是要启动和调试的程序。调试
再次出现错误以后,我检查了错误输出文件dcop-strace.txt,文件里有不少 系统调用的记录。在程序运行出错前的有关记录以下:code
27207 mkdir("/tmp/.ICE-unix", 0777) = -1 EEXIST (File exists) 27207 lstat64("/tmp/.ICE-unix", {st_mode=S_IFDIR|S_ISVTX|0755, st_size=4096, ...}) = 0 27207 unlink("/tmp/.ICE-unix/dcop27207-1066844596") = -1 ENOENT (No such file or directory) 27207 bind(3, {sin_family=AF_UNIX, path="/tmp/.ICE-unix/dcop27207-1066844596"}, 38) = -1 EACCES (Permission denied) 27207 write(2, "_KDE_IceTrans", 13) = 13 27207 write(2, "SocketCreateListener: failed to "..., 46) = 46 27207 close(3) = 0 27207 write(2, "_KDE_IceTrans", 13) = 13 27207 write(2, "SocketUNIXCreateListener: ...Soc"..., 59) = 59 27207 umask(0) = 0 27207 write(2, "_KDE_IceTrans", 13) = 13 27207 write(2, "MakeAllCOTSServerListeners: fail"..., 64) = 64 27207 write(2, "Cannot establish any listening s"..., 39) = 39
其中第一行显示程序试图建立/tmp/.ICE-unix目录,权限为0777,这个操做由于目录已经存在而失败了。第二个系统调用(lstat64)检查 了目录状态,并显示这个目录的权限是0755,这里出现了第一个程序运行错误的线索:程序试图建立属性为0777的目录,可是已经存在了一个属性为 0755的目录。第三个系统调用(unlink)试图删除一个文件,可是这个文件并不存在。这并不奇怪,由于这个操做只是试图删掉可能存在的老文件。
可是,第四行确认了错误所在。他试图绑定到/tmp/.ICE-unix/dcop27207-1066844596,可是出现了拒绝访问错误。. ICE_unix目录的用户和组都是root,而且只有全部者具备写权限。一个非root用户没法在这个目录下面创建文件,若是把目录属性改为0777, 则前面的操做有可能能够执行,而这正是第一步错误出现时进行过的操做。server
因此我运行了chmod 0777 /tmp/.ICE-unix以后KDE就能够正常启动了,问题解决了,用strace进行跟踪调试只须要花很短的几分钟时间跟踪程序运行,而后检查并分 析输出文件。htm