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:     显示程序在每次系统调用时的指针

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   ---->系统调用的返回值

猜你喜欢

转载自www.cnblogs.com/Template/p/9122076.html