strace调试的常用方法

一 将strace结果输出到文件

1 格式

-o filename 或  2>filename

2 实战

[root@localhost charpter05]# strace -c -o test.txt ./test
8
8
[root@localhost charpter05]# strace -c ./test 2>test2.txt
8
8
[root@localhost charpter05]# diff test.txt test2.txt

3 说明

比较结果一样,说明两个命令等价。

二 将系统每个调用的时间打印出来

1 格式

-T

2 实战

[root@localhost charpter05]# strace -T ./test

[root@localhost charpter05]# strace -T ./test
execve("./test", ["./test"], [/* 25 vars */]) = 0 <0.000422>
brk(NULL)                               = 0x181d000 <0.000194>
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fae23c80000 <0.000212>
access("/etc/ld.so.preload", R_OK)      = -1 ENOENT (No such file or directory) <0.000158>
open("/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3 <0.000135>
fstat(3, {st_mode=S_IFREG|0644, st_size=35467, ...}) = 0 <0.000163>
mmap(NULL, 35467, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7fae23c77000 <0.000133>
close(3)                                = 0 <0.000139>
open("/lib64/libstdc++.so.6", O_RDONLY|O_CLOEXEC) = 3 <0.000139>
......

3 说明

调用execve函数花费0.000422s,调用mmap花费0.000212

三 记录每次系统调用发生的时间

1 格式

-t 或 -tt 或 -ttt 记录每次系统调用发生的时间,分别精确到秒、微秒和UNIX时间戳的微秒。

2 实战

[root@localhost charpter05]# strace -t ./test
14:49:07 execve("./test", ["./test"], [/* 25 vars */]) = 0
14:49:07 brk(NULL)                      = 0x19e9000
14:49:07 mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fa13b206000
14:49:07 access("/etc/ld.so.preload", R_OK) = -1 ENOENT (No such file or directory)
14:49:07 open("/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3
14:49:07 fstat(3, {st_mode=S_IFREG|0644, st_size=35467, ...}) = 0
14:49:07 mmap(NULL, 35467, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7fa13b1fd000
14:49:07 close(3)                       = 0
......

3 说明

从结果可知,这几个系统调用都是在14:49:07这一秒发生的。

四 追踪现有的进程

1 格式

strace -p pid

其中,pid是指进程id。

2 说明

strace不光能初始化一个进程进行strace,还能追踪现有的进程。

你可能感兴趣的:(C++)