Linux系统使用strace命令

在Linux的strace命令的使用评论





呼叫:

Strace { } { } - dffhiqrttttvxx -列- eexpr } {…

{ } { } -情景模式- PPID…{ - } { } { sstrsize - uusername命令{精} }



Strace - C - eexpr } {…{ - } { Ssortby } { ooverhead命令{ }精…




Linux strace命令的用法





呼叫:

Strace { } { } - dffhiqrttttvxx -列- eexpr } {…

{ } { } -情景模式- PPID…{ - } { } { sstrsize - uusername命令{精} }



Strace - C - eexpr } {…{ - } { Ssortby } { ooverhead命令{ Arg…} }

功能:

系统调用和接收信号在程序执行时被跟踪。通常使用的是跟踪执行的命令直到结束。

并将被调用系统调用的名称、参数和返回值输出到标准输出或输出到O指定的文件。

Strace是一个功能强大的调试和分析工具。你会发现他是个好帮手。您需要调试无法看到源代码或源代码无法编译的程序。

通过系统转换,您将很容易地了解软件是如何实现其功能的。作为程序员,您可以看到用户和内核状态如何通过系统调用和信号来实现程序功能。

每一行的strace输出包括系统调用的名称,那么参数和返回值。

strace猫/ dev /空

他的输出将是:

(开 / dev /空

当一个错误产生时,它通常会返回到1。所以会有一个错误标志和描述:

打开( / /酒吧地板

输出信号将被输入信号符号和信号。跟踪和中断命令睡600 :

Sigsuspend({ }

--- SIGINT(中断)---

被监听的+ + + + + +

输出参数有点不一致。如壳牌在指挥> > TMP 输出:

(打开TMP

结构指针,将做出适当的显示。例如:ls:

(lstat / dev /空

请注意,第一个参数struct stat 声明这是输出。lstat输入参数,第二个参数是外部的价值。

当你试图ls -l 到一个不存在的文件,会有:

lstat( /脚/球

char *将作为C的字符串类型输出,没有字符串输出,它通常是char *,它是转义字符,只输出字符串的长度。

当字符串太长时,将使用…省略。在ls -l 将有一个gepwuid调用读取密码文件:

阅读(3,根::0:系统管理员: / …,1024)= 422

当参数是一个结构数组时,它将根据简单指针和数组输出,如:

getGroups(4,{ 0,2,4,5 })= 4

对于位作为参数的情况,它也使用方括号,并使用空格分隔每个参数。例如:

Sigprocmask(sig_block,{幼儿,ttou },{ })= 0

这里的第二参数代表两信号SIGCHLD、sigttou。,如果钻头类型参数都设置,有如下输出:

Sigprocmask(sig_unblock,~ { },空= 0)

所有的第二个参数都放在这里。



参数描述:

-统计每个系统调用的时间、次数和错误数目。

D输出strace调试标准错误信息。

f轨道,通过调用fork产生的子进程。

FF如果是提供文件名,全过程跟踪结果导出相应的filename.pid,PID是每个进程的进程号。

F试图跟踪vfork调用。在F,vfork不跟踪。

-输出简要帮助信息。

输入输出系统调用的入口指针。

q禁止关于脱离接触的信息的输出。

r打印出相对时间,每个系统调用。

-输出和时间信息中的每一行。

-每一行输出和时间信息,微秒。

- TTT微秒级的输出,以秒表示的时间。

t显示每次通话花费的时间。

- v输出所有系统调用。一些关于环境变量、状态、输入和输出的调用经常使用,默认情况下不输出。

v输出strace版本信息。

x输出十六进制形式的非标准字符串

-所有字符串都以十六的形式输出。

一列

设置返回值的输出位置。默认值是40。

E的表达

指定一个表达式来控制如何跟随。格式如下:

{限定符{ } { }!} { } value1,value2…

限定只能微量,缩写,冗长,原始信号,读,写。其中之一是值,它用来定义符号或数字。默认限定符是感叹号是否固定。

- eopen相当于E微量=开放,这意味着跟踪打开的电话。- etrace!=代表除开放之外的其他调用。有两个特殊的符号全部和没有。

注意一些shell!为了执行历史,所以要使用。

- e跟踪=集

只遵循指定的系统调用。例如,E微量=打开,关闭,再写说明,只有这四个系统调用跟踪。默认值是set =所有。

-跟踪=文件

只跟踪文件操作的系统调用。

- e跟踪=过程

只有跟踪系统调用进程控制。

-跟踪=网络

跟踪与网络相关的所有系统调用。

E strace =信号

跟踪与系统信号有关的所有系统调用

- e跟踪= IPC

跟踪与进程通信相关的所有系统调用

-缩写=集

结果集。V的系统调用,strace输出和缩写=没有。默认缩写=所有。

- e原始=集

指定的系统调用的参数将显示在十六中。

- e信号=集

指定跟踪的系统信号。默认值是。如信号=!SIGIO(或信号=!IO),表明没有跟踪SIGIO信号。

-读=集

从指定文件读取的输出数据。例如:

e读= 3

-写=集

输出被写入指定文件中的数据。

o文件名

写的信息输出到文件的文件名

-p PID

跟踪指定过程pid。

的最大

指定输出字符串的最大长度。32个缺省值。文件名已全部输出。

-你的用户名

执行跟踪命令的用户名的UID和GID。



调试程序的信息



在理想的世界里,当一个程序不能正常执行某个功能时,它会给你一个有用的错误,它会告诉你足够的错误去改正。但是不幸的是,我们并不生活在理想的世界里,至少我们并不总是生活在理想的世界里。有时候程序有问题,你找不到原因。



这就是为什么调试器出现。Strace是一个重要的调试工具,用于监测和信息系统调用。你不仅可以调试一个新开工的项目,但你也可以调试一个程序,已经运行(绑定信息到一个现有的PID)。



首先,让我们看一个真实的例子:



{ { } }启动KDE时的问题



上一次,我开始KDE时遇到了一个问题,KDE的错误信息没有给我任何有用的线索。



代码uff1a



_kde_icetranssocketcreatelistener:没有绑定的倾听者

_kde_icetranssocketunixcreatelistener:…SocketCreateListener()失败

_kde_icetransmakeallcotsserverlisteners:未能创建监听器的地方



无法建立任何监听套接字dcopserver自检失败。





对我来说,这个错误信息并没有多大意义,但一个程序是KDE的进程间通信的关键是不是开始的。我也知道这个错误是冰协议相关(客户端之间交换),除此之外我不知道KDE启动错误的原因是什么。



我决定使用strace看什么节目什么时候开始dcopserver。



代码uff1a



strace·F·F O ~ / dcop-strace.txt dcopserver





这里的F - F选项告诉strace同时跟踪fork和vfork过程和-o选项写入所有strace输出~ / dcop-strace.txt,dcopserver是程序启动和调试。



又一个错误,我检查了错误输出文件dcop-strace.txt,许多记录系统调用的文件,程序运行之前的错误相关的记录如下:



代码uff1a



27207 mkdir( / / 冰UNIX的TMP。

27207 lstat64( / / 冰UNIX的TMP。

27207断开( / / tmp。冰UNIX / dcop27207-1066844596 )= - 1 enoent(没有这样的文件或目录)

27207绑定(3,{ sin_family = af_unix,路径= / / tmp。冰UNIX / dcop27207-1066844596},3 = 1 eacces(否认)

27207写(2,_kde_icetrans

27207写(2,socketcreatelistener:未能…,46)= 46

27207关(3)= 027207写(2,_kde_icetrans

27207写(2,socketunixcreatelistener:…SOC……,59)= 59

27207 umask(0)= 027207写(2,_kde_icetrans

27207写(2,makeallcotsserverlisteners:失败…,64)= 64

27207写(2,)不能建立任何监听……,39)= 39





第一行显示的程序试图创建一个 / / tmp。与权限0777冰UNIX目录,因为该目录的存在而失败。二系统调用(lstat64)检查目录状态,并显示目录的权限是0755。这是第一个程序运行错误的线索:程序试图创建一个目录0777,但有0755个属性的目录已经存在。第三系统调用(断)试图删除一个文件,但文件不存在。这并不奇怪,因为手术只是试图删除的可能旧的文件。



然而,第四线确认错误。他试图结合 / / TMP。冰Unix / dcop27207-1066844596,但被拒绝访问错误。用户和组的ice_unix目录是根,只有拥有写权限。非root用户不能创建文件这个目录。如果将目录属性更改为0777,则可以执行前面的操作,这是第一步错误发生的操作。



所以在运行chmod 0777 / / tmp。冰UNIX,KDE可以正常启动,并解决了问题。Strace跟踪和调试只需要几分钟的时间来跟踪程序的运行,然后检查和分析输出文件。



描述:运行chmod 0777只是一个测试。一般来说,不设置目录的所有用户的读写,而不是设置粘滞位(sticky位)。设置粘滞位的目录,防止用户删除其他人可写的目录下的文件。一般来说,你会发现 / tmp目录已经为这原因一粘点。在KDE可以启动,chmod + T / / tmp。冰UNIX运行设置sticky位the.ice_unix。



{ }解决库依赖问题{ }



starce的另一个用途是解决动态库相关问题。运行一个LDD为可执行文件时,它告诉你的程序和动态库的位置使用动态库。但如果你使用的是旧版本的glibc(2.2或更早),你可能有一个错误的相关程序,它会报告发现目录中的一个动态库,但其实当你运行程序的动态链接器( / lib / LD Linux。所以。2)可能是另一个目录来找到动态链接库。这通常是 / / /等ld.so.conf等 / ld.so.cache文件不一致,或 / / ld.so.cache等破坏。这个错误不会出现在glibc 2.3.2版,这是可能的,LD Linux的错误已得到解决。



尽管如此,LDD不能把所有居里动态程序依赖,系统调用dlopen动态库自动转移时,这些库可能不是LDD出去。由于glibc的一部分,NSS(域名服务器开关)图书馆是一个典型的例子。NSS的作用是告诉应用程序到哪里找系统帐户数据库,应用程序不直接连接到网络图书馆,和glibc自动转移NSS库通过dlopen。如果这样的图书馆是不小心丢失了,你会不会说有一个图书馆的依赖问题,但这样一个程序可以不被用户名称解析,得到用户id.let的看一个例子:



whoami程序会给你自己的用户名,这在一些脚本程序,需要知道正在运行的程序的实际用户是非常有用的。对whoami输出实例如下:

代码uff1a



# whoami







假定由于某种原因,图书馆NSS是负责的用户名和用户ID是在转型升级glibc丢失。我们可以通过重命名NSS库模拟环境。

代码uff1a



# MV /自由/ libnss_files。所以。2 / / libnss_files.so.2.backup lib

# whoami

Whoami:找不到用户名UID 0





在这里你可以看到,有错误时运行whoami,和LDD的输出程序不提供有益的帮助:

代码uff1a



# LDD / usr /斌/ whoami

Libc。所以,6 = / / libc库,6(0x4001f000)。

/ lib / LD Linux。所以。2 = / lib / LD Linux。所以2(0x40000000)。





你只能看到whoami依赖libc。所以。6和LD Linux。所以。2,不给其他库都需要运行whoami,whoami输出跟踪信息在这里。

代码uff1a



信息whoami-strace.txt whoami O



打开( / / libnss_files库。所以。2

打开( / / / lib i686 MMX / libnss_files。所以。2

( / lib stat64 / / i686指令

打开( / / / lib i686 libnss_files。所以。2

( / lib stat64 i686 /

打开( / / / lib MMX libnss_files。所以。2

( / lib stat64 MMX /

打开( / / libnss_files库。所以。2

( / lib stat64

打开( / usr / lib / / / libnss_files i686指令。所以。2

( stat64 / usr / lib / / i686指令

打开( / usr / / / lib i686 libnss_files。所以。2





你可以找到一个试图找到libnss。所以。2在不同的目录,但都失败了。没有一个工具如strace,很难发现这个错误是由于缺乏一个动态库。现在你只需要找到libnss。所以。2放在正确的地方。



{ }限制到只有微量的大胆strace具体系统调用{ /大胆}



如果你已经知道你想要什么,你可以让strace只跟踪系统调用的一些类型。例如,你需要看看在配置脚本执行的程序,而系统调用execve需要监控。让strace execve调用此命令只记录:



代码uff1a



信息configure-strace.txt F O E execve。 /配置





一些输出结果如下:

代码uff1a



2720 execve( / usr /斌/ expr

2725 execve( /斌/ basename

2726 execve( / / bin目录

2729 execve( /斌/ RM

2731 execve( / usr /斌/ expr

2736 execve( /斌/ LN





正如你所看到的,信息不仅可以由程序员使用,但普通的系统管理员和用户也可以使用strace调试系统错误。必须承认的是,strace输出并不总是容易理解,但很多输出多数人是不重要的。你会慢慢学会寻找信息你可能需要从大量的输出,如允许错误,没有找到文件,等等,然后strace会成为一个强大的工具。