Linux调试工具strace和lsof学习

1strace工具

         1)简介

strace是一个集诊断、调试、统计于一体的工具,常用来跟踪进程执行时的系统调用和所接收的信号。在Linux世界,进程不能直接访问硬件设备,当进程需要访问硬件设备时,必须由用户态切换至内核态模式,通过系统调用访问硬件设备。strace可以跟踪到一个进程产生的系统调用函数,包括参数,返回值,执行消耗的时间。

         2)使用参数

                  -p     跟踪指定的进程

                   -f      跟踪由fork子进程系统调用

                   -F     尝试跟踪vfork子进程系统调用,与-f同时出现时,vfork不被跟踪

                   -o     filename 将输入写入到filename文件中

                   -ff    常与-o选项一起使用,不同进程(子进程)产生的系统调用输出到filename.PID文件

                   -r      打印每一个系统调用的相对时间

                   -t      在输出的每一行前加上时间信息,-tt时间精确到毫秒级,还可以使用-ttt打印相对时间

                   -v     输出所用系统调用,默认情况下,一些频繁调用的系统调用不会输出

                   -s      指定每一行输出字符串的长度,默认32。文件名一致全部输出

                   -c      统计每种系统调用所执行的时间,调用次数,出错次数

                   -e    expr输出过滤器,通过表达式,可以过滤掉不需要的输出内容

3)使用示例

                  strace –p pid                              跟踪某个后台进程

                   strace –o filename                           输出跟踪结果到文件

                   strace –T                                               记录每个系统调用花费的时间,看看哪个系统调用时间长

                   strace –t(或者-tt)             记录每个系统调用发生时的时间

                   strace –s 1024                           显示系统调用参数时,对于字符串显示的长度,默认是32,如果字符串参数很长时会显示不全

                   strace –e trace=nanosleep  只记录相关的系统调用信息

                              -e trace=network      只记录和网络api相关的系统调用

                              -e trace=file                 只记录涉及到文件名的系统调用

                              -e trace=desc              只记录涉及到文件句柄的系统调用

                              其它还有process,ipc,signal等。

      

2lsof工具

1)简介

lsof(list open files)是一个列出当前系统打开文件的工具,在linux环境下,任何事物都以文件的形式存在,通过文件不仅可以访问常规数据,还可以访问网络连接和硬件。所以如传输控制协议(TCP)和用户数据报协议(UDP)套接字等,系统在后台都为该应用程序分配了一个文件描述符,无论这个文件的本质如何,该文件描述符为应用程序与基础操作系统之间的交互提供了通用接口。因为应用程序打开文件的描述符列表提供了大量关于这个应用程序本身的信息,因此通过lsof工具能够查看这个列表对系统检测以及排错将是很有帮助的。

2)基本用法

在终端下输入lsof即可显示系统打开的文件,因为lsof需要访问核心内存和各种文件,所以必须以root用户的身份运行它才能够充分地发挥其功能。

Lsof输出各列信息的意义如下:

COMMAND:进程的名称

PID:进程标识符

USER:进程所有者

FD:文件描述符,如cwd、txt等

TYPE:文件类型,如DIR、REG等

DEVICE:指定磁盘的名称

SIZE:文件的大小

NODE:索引节点(文件在磁盘上的标识)

NAME:打开文件的确切名称

FD列中的文件描述符cwd值表示应用程序的当前工作目录,这是该应用程序启动的目录,除非它本身对这个目录进行更改。txt类型的文件时程序代码,如应用程序二进制文件本身或共享库。

其次数值表示应用程序的文件描述符,这是打开该文件时返回的一个整数。u表示该文件被打开并处于读取/写入模式,而不是只读(r)或只写(w)模式。同时大写的W表示该应用程序具有对整个文件的写锁。初始打开每个应用程序时,都具有三个文件描述符,从0到2,分别表示标准输入、输出和错误流。所以大多数应用程序所打开的文件的FD都是从3开始。

TYPE列比较直观,文件和目录分别称为REG和DIR。而CHR和BLK,分别表示字符和块设备。;或者UNIX、FIFO和IPv4,分别表示UNIX域套接字、先进先出(FIFO)队列和网际协议(IP)套接字。

3)常用参数

lsof的语法格式是:

lsof           [option]           filename

例如:

lsof abc.txt                         显示开启文件abc.txt的进程

lsof –c abc                          显示abc进程现在打开的文件

lsof –c –p 1234                 列出进程号为1234的进程所打开的文件

lsof –g gid                           显示归属gid的进程情况

lsof +d /usr/local/          显示目录下被进程开启的文件

lsof +D /usr/local/          同上,但是会搜索目录下的目录,时间较长

lsof –d 4                              显示使用fd为4的进程

lsof –i                                   用以显示符合条件的进程情况

4)使用实例

                   lsof ‘which httpd’           查看哪个进程在使用apache的可执行文件

                   lsof /etc/passwd            查看哪个进程在占用/etc/passwd

                   lsof /dev/hda6                查看哪个进程在占用hda6

                   lsof /dev/cdrom             查看哪个进程在占用光驱

                   lsof –c sendmail              查看sendmail进程的文件使用情况

                  lsof –c courier –u ^zahn        显示出哪些文件被以courier打头的进程打开,但不属于用户zahn的

                   lsof –p 30297                    显示哪些文件被进程30297打开

                   lsof –D /tmp                     显示所有在/tmp文件夹中打开的instance和文件的进程。但是symbol文件并不在列

                   lsof –u 1000                      查看uid是1000的用户的进程的文件使用情况

       

                   lsof –u tony                      查看用户tony的进程的文件使用情况

                   lsof –u ^tony                    查看不是用户tony的进程的文件使用情况

                   lsof –I                                 查看所有打开的端口

                   lsof –i: 80                           查看所有打开80端口的进程

                   lsof –i –U                                     查看所有打开的端口和UNIX domin文件

                   ……

你可能感兴趣的:(Linux,嵌入式开发)