strace用法

strace   --  trace system calls and signals     strace是Linux环境下的一款程序调试工具,用来监察一个应用程序所使用的系统调用及它所接收的系统信息。

在最简单的情况下,strace追踪指定的指令,直到它退出。strace可以拦截并记录进程的系统调用和进程接收到的信号。你不仅可以从命令行调试一个新开始的程序,也可以把strace绑定到一个已有的PID上去。

strace三个最常用的参数:

-f:        除了跟踪当前进程外,还跟踪其子进程。

-o  file:      默认情况下strace打印输出到标准错误,可以使用-o选项输出到指定的文件。

-p  pid:   指定需要跟踪的进程pid

-t  :    打印跟踪输出中每一行的时间

-T:    显示程序进行的每个系统调用开始和结束之间的时间差

-c:    可以生成每个系统调用的总时间,调用和错误报告。

-i:     显示程序在每次系统调用时的指针

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

-e trace=file :      只记录涉及到文件名的系统调用
 
-e trace=desc :      只记录涉及到文件句柄的系统调用  还有其他的包括process,ipc,signal等。

strace -f  -o vim.strace vim:跟踪vim及其子进程的运行,将输出信息写到vim.strace文件中。

 

1.跟踪Linux 命令的系统调用,可以简单的使用strace 运行一个命令,这里使用df命令做一个演示:

[root@localhost ~]# strace df -h
execve("/bin/df", ["df", "-h"], [/* 23 vars */]) = 0
brk(0) = 0x983000
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f4bc0578000
access("/etc/ld.so.preload", R_OK) = -1 ENOENT (No such file or directory)
open("/etc/ld.so.cache", O_RDONLY) = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=54957, ...}) = 0
mmap(NULL, 54957, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7f4bc056a000
close(3) = 0
open("/lib64/libc.so.6", O_RDONLY) = 3
read(3, "\177ELF\2\1\1\3\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0000\356\1\0\0\0\0\0"..., 832) = 832
fstat(3, {st_mode=S_IFREG|0755, st_size=1924768, ...}) = 0
mmap(NULL, 3750184, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7f4bbffc5000

.......

跟踪中的每一行都包含系统调用名称,后跟括号中的参数及其返回值。

从上面的输出中,可以看到由df -h命令进行的各种类型的系统调用。

open("/etc/ld.so.cache", O_RDONLY) = 3

open  ---->是一个系统调用函数

("/etc/ld.so.cache", O_RDONLY) ------>是系统调用函数的参数

3   ---->系统调用的返回值

可以使用strace寻找被程序读取的配置文件,例如:

[root@localhost ~]# strace -e trace=open mysql | grep my.cnf
open("/etc/ld.so.cache", O_RDONLY) = 3
open("/lib64/libpthread.so.0", O_RDONLY) = 3
open("/lib64/librt.so.1", O_RDONLY) = 3
open("/lib64/libdl.so.2", O_RDONLY) = 3
open("/lib64/libncurses.so.5", O_RDONLY) = 3
open("/usr/lib64/libstdc++.so.6", O_RDONLY) = 3
open("/lib64/libm.so.6", O_RDONLY) = 3
open("/lib64/libgcc_s.so.1", O_RDONLY) = 3
open("/lib64/libc.so.6", O_RDONLY) = 3
open("/lib64/libtinfo.so.5", O_RDONLY) = 3
open("/etc/my.cnf", O_RDONLY) = 3
open("/etc/nsswitch.conf", O_RDONLY|O_CLOEXEC) = 3
open("/etc/ld.so.cache", O_RDONLY) = 3
open("/lib64/libnss_files.so.2", O_RDONLY) = 3
open("/etc/services", O_RDONLY|O_CLOEXEC) = 3
open("/usr/lib/locale/locale-archive", O_RDONLY) = 3
open("/usr/local/mysql/share/charsets/Index.xml", O_RDONLY) = 3
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO)
+++ exited with 1 +++

-e trace=open   展示特定的系统调用(还可以使用write、network等等man strace有详细说明)

 

还可以显示时间戳   -tt选项可以展示微秒级别的时间戳。

[root@localhost ~]# strace -t ls
17:10:07 execve("/usr/bin/ls", ["ls"], [/* 26 vars */]) = 0
17:10:07 brk(NULL)                      = 0x154b000
17:10:07 mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f33240bf000
17:10:07 access("/etc/ld.so.preload", R_OK) = -1 ENOENT (No such file or directory)
17:10:07 open("/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3
17:10:07 fstat(3, {st_mode=S_IFREG|0644, st_size=42272, ...}) = 0
17:10:07 mmap(NULL, 42272, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7f33240b4000
17:10:07 close(3)                       = 0
17:10:07 open("/lib64/libselinux.so.1", O_RDONLY|O_CLOEXEC) = 3
17:10:07 read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\300j\0\0\0\0\0\0"..., 832) = 832
17:10:07 fstat(3, {st_mode=S_IFREG|0755, st_size=155744, ...}) = 0
17:10:07 mmap(NULL, 2255216, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7f3323c78000
17:10:07 mprotect(0x7f3323c9c000, 2093056, PROT_NONE) = 0
17:10:07 mmap(0x7f3323e9b000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x23000) = 0x7f3323e9b000
17:10:07 mmap(0x7f3323e9d000, 6512, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x7f3323e9d000
17:10:07 close(3)                       = 0

 

转载于:https://www.cnblogs.com/Template/p/9122076.html

你可能感兴趣的:(strace用法)