strace使用帮助
[root@ecs-3370 ~]# strace -h
usage: strace [-CdffhiqrtttTvVwxxy] [-I n] [-e expr]...
[-a column] [-o file] [-s strsize] [-P path]...
-p pid... / [-D] [-E var=val]... [-u username] PROG [ARGS]
or: strace -c[dfw] [-I n] [-e expr]... [-O overhead] [-S sortby]
-p pid... / [-D] [-E var=val]... [-u username] PROG [ARGS]
Output format:
-a column alignment COLUMN for printing syscall results (default 40)
-i print instruction pointer at time of syscall
-k obtain stack trace between each syscall
-o file send trace output to FILE instead of stderr
-q suppress messages about attaching, detaching, etc.
-r print relative timestamp
-s strsize limit length of print strings to STRSIZE chars (default 32)
-t print absolute timestamp
-tt print absolute timestamp with usecs
-T print time spent in each syscall
-x print non-ascii strings in hex
-xx print all strings in hex
-X format set the format for printing of named constants and flags
-y print paths associated with file descriptor arguments
-yy print protocol specific information associated with socket file descriptors
Statistics:
-c count time, calls, and errors for each syscall and report summary
-C like -c but also print regular output
-O overhead set overhead for tracing syscalls to OVERHEAD usecs
-S sortby sort syscall counts by: time, calls, name, nothing (default time)
-w summarise syscall latency (default is system time)
Filtering:
-e expr a qualifying expression: option=[!]all or option=[!]val1[,val2]...
options: trace, abbrev, verbose, raw, signal, read, write, fault, inject, kvm
-P path trace accesses to path
Tracing:
-b execve detach on execve syscall
-D run tracer process as a detached grandchild, not as parent
-f follow forks
-ff follow forks with output into separate files
-I interruptible
1: no signals are blocked
2: fatal signals are blocked while decoding syscall (default)
3: fatal signals are always blocked (default if '-o FILE PROG')
4: fatal signals and SIGTSTP (^Z) are always blocked
(useful to make 'strace -o FILE PROG' not stop on ^Z)
Startup:
-E var remove var from the environment for command
-E var=val put var=val in the environment for command
-p pid trace process with process id PID, may be repeated
-u username run command as username handling setuid and/or setgid
Miscellaneous:
-d enable debug output to stderr
-v verbose mode: print unabbreviated argv, stat, termios, etc. args
-h print help message
-V print version
SYNOPSIS
strace [-ACdffhikqrtttTvVxxy] [-I n] [-b execve] [-e expr]... [-a column] [-o file] [-s strsize] [-X format] [-P path]... [-p pid]... { -p pid | [-D] [-E var[=val]]... [-u username] command [args] }
strace -c [-df] [-I n] [-b execve] [-e expr]... [-O overhead] [-S sortby] [-P path]... [-p pid]... { -p pid | [-D] [-E var[=val]]... [-u username] command [args] }
常规打印
[root@ecs-3370 ~]# strace ./helloworld
execve("./helloworld", ["./helloworld"], 0x7fffb28ec2f0 /* 23 vars */) = 0
brk(NULL) = 0x7d6000
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f94b1119000
access("/etc/ld.so.preload", R_OK) = -1 ENOENT (No such file or directory)
open("/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=76353, ...}) = 0
mmap(NULL, 76353, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7f94b1106000
close(3) = 0
open("/lib64/libc.so.6", O_RDONLY|O_CLOEXEC) = 3
read(3, "\177ELF\2\1\1\3\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0`&\2\0\0\0\0\0"..., 832) = 832
fstat(3, {st_mode=S_IFREG|0755, st_size=2156592, ...}) = 0
mmap(NULL, 3985920, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7f94b0b2b000
mprotect(0x7f94b0cef000, 2093056, PROT_NONE) = 0
mmap(0x7f94b0eee000, 24576, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x1c3000) = 0x7f94b0eee000
mmap(0x7f94b0ef4000, 16896, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x7f94b0ef4000
close(3) = 0
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f94b1105000
mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f94b1103000
arch_prctl(ARCH_SET_FS, 0x7f94b1103740) = 0
access("/etc/sysconfig/strcasecmp-nonascii", F_OK) = -1 ENOENT (No such file or directory)
access("/etc/sysconfig/strcasecmp-nonascii", F_OK) = -1 ENOENT (No such file or directory)
mprotect(0x7f94b0eee000, 16384, PROT_READ) = 0
mprotect(0x600000, 4096, PROT_READ) = 0
mprotect(0x7f94b111a000, 4096, PROT_READ) = 0
munmap(0x7f94b1106000, 76353) = 0
fstat(1, {st_mode=S_IFCHR|0620, st_rdev=makedev(136, 2), ...}) = 0
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f94b1118000
write(1, "Hello, world\n", 13Hello, world
) = 13
exit_group(13)
打印统计信息
[root@ecs-3370 ~]# strace -c ./helloworld
Hello, world
% time seconds usecs/call calls errors syscall
------ ----------- ----------- --------- --------- ----------------
27.35 0.000064 8 8 mmap
15.38 0.000036 9 4 mprotect
11.54 0.000027 9 3 3 access
8.97 0.000021 7 3 fstat
8.12 0.000019 9 2 open
5.56 0.000013 6 2 close
5.13 0.000012 12 1 execve
4.70 0.000011 11 1 write
4.27 0.000010 10 1 munmap
2.99 0.000007 7 1 read
2.99 0.000007 7 1 brk
2.99 0.000007 7 1 arch_prctl
------ ----------- ----------- --------- --------- ----------------
100.00 0.000234 28 3 total
同时打印常规信息和统计信息
[root@ecs-3370 ~]# strace -C ./helloworld
execve("./helloworld", ["./helloworld"], 0x7ffea9557f48 /* 23 vars */) = 0
brk(NULL) = 0x1b45000
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f26d0c5b000
access("/etc/ld.so.preload", R_OK) = -1 ENOENT (No such file or directory)
open("/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=76353, ...}) = 0
mmap(NULL, 76353, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7f26d0c48000
close(3) = 0
open("/lib64/libc.so.6", O_RDONLY|O_CLOEXEC) = 3
read(3, "\177ELF\2\1\1\3\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0`&\2\0\0\0\0\0"..., 832) = 832
fstat(3, {st_mode=S_IFREG|0755, st_size=2156592, ...}) = 0
mmap(NULL, 3985920, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7f26d066d000
mprotect(0x7f26d0831000, 2093056, PROT_NONE) = 0
mmap(0x7f26d0a30000, 24576, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x1c3000) = 0x7f26d0a30000
mmap(0x7f26d0a36000, 16896, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x7f26d0a36000
close(3) = 0
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f26d0c47000
mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f26d0c45000
arch_prctl(ARCH_SET_FS, 0x7f26d0c45740) = 0
access("/etc/sysconfig/strcasecmp-nonascii", F_OK) = -1 ENOENT (No such file or directory)
access("/etc/sysconfig/strcasecmp-nonascii", F_OK) = -1 ENOENT (No such file or directory)
mprotect(0x7f26d0a30000, 16384, PROT_READ) = 0
mprotect(0x600000, 4096, PROT_READ) = 0
mprotect(0x7f26d0c5c000, 4096, PROT_READ) = 0
munmap(0x7f26d0c48000, 76353) = 0
fstat(1, {st_mode=S_IFCHR|0620, st_rdev=makedev(136, 2), ...}) = 0
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f26d0c5a000
write(1, "Hello, world\n", 13Hello, world
) = 13
exit_group(13) = ?
+++ exited with 13 +++
% time seconds usecs/call calls errors syscall
------ ----------- ----------- --------- --------- ----------------
46.43 0.000013 4 3 fstat
32.14 0.000009 9 1 write
21.43 0.000006 0 8 mmap
0.00 0.000000 0 1 read
0.00 0.000000 0 2 open
0.00 0.000000 0 2 close
0.00 0.000000 0 4 mprotect
0.00 0.000000 0 1 munmap
0.00 0.000000 0 1 brk
0.00 0.000000 0 3 3 access
0.00 0.000000 0 1 execve
0.00 0.000000 0 1 arch_prctl
------ ----------- ----------- --------- --------- ----------------
100.00 0.000028 28 3 total
过滤指定信息
[root@ecs-3370 ~]# strace ./helloworld 2>&1 | grep open
open("/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3
open("/lib64/libc.so.6", O_RDONLY|O_CLOEXEC) = 3
或者通过以下方式
[root@ecs-3370 ~]# strace -e trace=open,close ./helloworld
open("/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3
close(3) = 0
open("/lib64/libc.so.6", O_RDONLY|O_CLOEXEC) = 3
close(3) = 0
Hello, world
+++ exited with 13 +++
输出到指定文件中
[root@ecs-3370 ~]# strace -o test.txt ./helloworld
Hello, world
显示时间
[root@ecs-3370 ~]# strace -t ./helloworld
09:04:39 execve("./helloworld", ["./helloworld"], 0x7ffedd683318 /* 23 vars */) = 0
09:04:39 brk(NULL) = 0x20f4000
09:04:39 mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7feb1a9c5000
09:04:39 access("/etc/ld.so.preload", R_OK) = -1 ENOENT (No such file or directory)
09:04:39 open("/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3
09:04:39 fstat(3, {st_mode=S_IFREG|0644, st_size=76353, ...}) = 0
09:04:39 mmap(NULL, 76353, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7feb1a9b2000
09:04:39 close(3) = 0
09:04:39 open("/lib64/libc.so.6", O_RDONLY|O_CLOEXEC) = 3
09:04:39 read(3, "\177ELF\2\1\1\3\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0`&\2\0\0\0\0\0"..., 832) = 832
09:04:39 fstat(3, {st_mode=S_IFREG|0755, st_size=2156592, ...}) = 0
09:04:39 mmap(NULL, 3985920, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7feb1a3d7000
09:04:39 mprotect(0x7feb1a59b000, 2093056, PROT_NONE) = 0
09:04:39 mmap(0x7feb1a79a000, 24576, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x1c3000) = 0x7feb1a79a000
09:04:39 mmap(0x7feb1a7a0000, 16896, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x7feb1a7a0000
09:04:39 close(3) = 0
09:04:39 mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7feb1a9b1000
09:04:39 mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7feb1a9af000
09:04:39 arch_prctl(ARCH_SET_FS, 0x7feb1a9af740) = 0
09:04:39 access("/etc/sysconfig/strcasecmp-nonascii", F_OK) = -1 ENOENT (No such file or directory)
09:04:39 access("/etc/sysconfig/strcasecmp-nonascii", F_OK) = -1 ENOENT (No such file or directory)
09:04:39 mprotect(0x7feb1a79a000, 16384, PROT_READ) = 0
09:04:39 mprotect(0x600000, 4096, PROT_READ) = 0
09:04:39 mprotect(0x7feb1a9c6000, 4096, PROT_READ) = 0
09:04:39 munmap(0x7feb1a9b2000, 76353) = 0
09:04:39 fstat(1, {st_mode=S_IFCHR|0620, st_rdev=makedev(136, 2), ...}) = 0
09:04:39 mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7feb1a9c4000
09:04:39 write(1, "Hello, world\n", 13Hello, world
) = 13
09:04:39 exit_group(13) = ?
09:04:39 +++ exited with 13 +++
显示更详细的时间
[root@ecs-3370 ~]# strace -tt ./helloworld
09:06:00.608448 execve("./helloworld", ["./helloworld"], 0x7ffe03473a78 /* 23 vars */) = 0
09:06:00.608797 brk(NULL) = 0x792000
09:06:00.608890 mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f1439105000
09:06:00.608973 access("/etc/ld.so.preload", R_OK) = -1 ENOENT (No such file or directory)
09:06:00.609107 open("/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3
09:06:00.609163 fstat(3, {st_mode=S_IFREG|0644, st_size=76353, ...}) = 0
09:06:00.609220 mmap(NULL, 76353, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7f14390f2000
09:06:00.609259 close(3) = 0
09:06:00.609301 open("/lib64/libc.so.6", O_RDONLY|O_CLOEXEC) = 3
09:06:00.609361 read(3, "\177ELF\2\1\1\3\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0`&\2\0\0\0\0\0"..., 832) = 832
09:06:00.609404 fstat(3, {st_mode=S_IFREG|0755, st_size=2156592, ...}) = 0
09:06:00.609441 mmap(NULL, 3985920, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7f1438b17000
09:06:00.609480 mprotect(0x7f1438cdb000, 2093056, PROT_NONE) = 0
09:06:00.609519 mmap(0x7f1438eda000, 24576, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x1c3000) = 0x7f1438eda000
09:06:00.609560 mmap(0x7f1438ee0000, 16896, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x7f1438ee0000
09:06:00.609598 close(3) = 0
09:06:00.609643 mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f14390f1000
09:06:00.609681 mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f14390ef000
09:06:00.609729 arch_prctl(ARCH_SET_FS, 0x7f14390ef740) = 0
09:06:00.609818 access("/etc/sysconfig/strcasecmp-nonascii", F_OK) = -1 ENOENT (No such file or directory)
09:06:00.609864 access("/etc/sysconfig/strcasecmp-nonascii", F_OK) = -1 ENOENT (No such file or directory)
09:06:00.609900 mprotect(0x7f1438eda000, 16384, PROT_READ) = 0
09:06:00.609934 mprotect(0x600000, 4096, PROT_READ) = 0
09:06:00.609968 mprotect(0x7f1439106000, 4096, PROT_READ) = 0
09:06:00.610007 munmap(0x7f14390f2000, 76353) = 0
09:06:00.610080 fstat(1, {st_mode=S_IFCHR|0620, st_rdev=makedev(136, 2), ...}) = 0
09:06:00.610122 mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f1439104000
09:06:00.610160 write(1, "Hello, world\n", 13Hello, world
) = 13
09:06:00.610201 exit_group(13) = ?
09:06:00.610260 +++ exited with 13 +++
显示每个系统调用所使用的时间
[root@ecs-3370 ~]# strace -T ./helloworld
execve("./helloworld", ["./helloworld"], 0x7ffea987d4e8 /* 23 vars */) = 0 <0.000191>
brk(NULL) = 0x1120000 <0.000022>
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f04270d1000 <0.000029>
access("/etc/ld.so.preload", R_OK) = -1 ENOENT (No such file or directory) <0.000017>
open("/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3 <0.000013>
fstat(3, {st_mode=S_IFREG|0644, st_size=76353, ...}) = 0 <0.000015>
mmap(NULL, 76353, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7f04270be000 <0.000012>
close(3) = 0 <0.000011>
open("/lib64/libc.so.6", O_RDONLY|O_CLOEXEC) = 3 <0.000012>
read(3, "\177ELF\2\1\1\3\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0`&\2\0\0\0\0\0"..., 832) = 832 <0.000016>
fstat(3, {st_mode=S_IFREG|0755, st_size=2156592, ...}) = 0 <0.000012>
mmap(NULL, 3985920, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7f0426ae3000 <0.000010>
mprotect(0x7f0426ca7000, 2093056, PROT_NONE) = 0 <0.000015>
mmap(0x7f0426ea6000, 24576, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x1c3000) = 0x7f0426ea6000 <0.000014>
mmap(0x7f0426eac000, 16896, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x7f0426eac000 <0.000012>
close(3) = 0 <0.000015>
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f04270bd000 <0.000011>
mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f04270bb000 <0.000010>
arch_prctl(ARCH_SET_FS, 0x7f04270bb740) = 0 <0.000012>
access("/etc/sysconfig/strcasecmp-nonascii", F_OK) = -1 ENOENT (No such file or directory) <0.000010>
access("/etc/sysconfig/strcasecmp-nonascii", F_OK) = -1 ENOENT (No such file or directory) <0.000010>
mprotect(0x7f0426ea6000, 16384, PROT_READ) = 0 <0.000014>
mprotect(0x600000, 4096, PROT_READ) = 0 <0.000011>
mprotect(0x7f04270d2000, 4096, PROT_READ) = 0 <0.000012>
munmap(0x7f04270be000, 76353) = 0 <0.000015>
fstat(1, {st_mode=S_IFCHR|0620, st_rdev=makedev(136, 2), ...}) = 0 <0.000012>
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f04270d0000 <0.000010>
write(1, "Hello, world\n", 13Hello, world
) = 13 <0.000014>
exit_group(13) = ?
+++ exited with 13 +++
显示文件路径
[root@ecs-3370 ~]# strace -y ./helloworld
execve("./helloworld", ["./helloworld"], 0x7ffcd3d50b78 /* 23 vars */) = 0
brk(NULL) = 0x11f7000
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fe7ae8f0000
access("/etc/ld.so.preload", R_OK) = -1 ENOENT (No such file or directory)
open("/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3</etc/ld.so.cache>
fstat(3</etc/ld.so.cache>, {st_mode=S_IFREG|0644, st_size=76353, ...}) = 0
mmap(NULL, 76353, PROT_READ, MAP_PRIVATE, 3</etc/ld.so.cache>, 0) = 0x7fe7ae8dd000
close(3</etc/ld.so.cache>) = 0
open("/lib64/libc.so.6", O_RDONLY|O_CLOEXEC) = 3</usr/lib64/libc-2.17.so>
read(3</usr/lib64/libc-2.17.so>, "\177ELF\2\1\1\3\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0`&\2\0\0\0\0\0"..., 832) = 832
fstat(3</usr/lib64/libc-2.17.so>, {st_mode=S_IFREG|0755, st_size=2156592, ...}) = 0
mmap(NULL, 3985920, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3</usr/lib64/libc-2.17.so>, 0) = 0x7fe7ae302000
mprotect(0x7fe7ae4c6000, 2093056, PROT_NONE) = 0
mmap(0x7fe7ae6c5000, 24576, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3</usr/lib64/libc-2.17.so>, 0x1c3000) = 0x7fe7ae6c5000
mmap(0x7fe7ae6cb000, 16896, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x7fe7ae6cb000
close(3</usr/lib64/libc-2.17.so>) = 0
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fe7ae8dc000
mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fe7ae8da000
arch_prctl(ARCH_SET_FS, 0x7fe7ae8da740) = 0
access("/etc/sysconfig/strcasecmp-nonascii", F_OK) = -1 ENOENT (No such file or directory)
access("/etc/sysconfig/strcasecmp-nonascii", F_OK) = -1 ENOENT (No such file or directory)
mprotect(0x7fe7ae6c5000, 16384, PROT_READ) = 0
mprotect(0x600000, 4096, PROT_READ) = 0
mprotect(0x7fe7ae8f1000, 4096, PROT_READ) = 0
munmap(0x7fe7ae8dd000, 76353) = 0
fstat(1</dev/pts/2>, {st_mode=S_IFCHR|0620, st_rdev=makedev(136, 2), ...}) = 0
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fe7ae8ef000
write(1</dev/pts/2>, "Hello, world\n", 13Hello, world
) = 13
exit_group(13) = ?
+++ exited with 13 +++
注意观察以下两个系统调用多了尖括号的内容
fstat(1</dev/pts/2>, {st_mode=S_IFCHR|0620, st_rdev=makedev(136, 2), ...}) = 0
write(1</dev/pts/2>, "Hello, world\n", 13Hello, world
) = 13
打印与套接字文件描述符相关的协议特定信息
print protocol specific information associated with socket file descriptors
[root@ecs-3370 ~]# strace -yy ./helloworld
execve("./helloworld", ["./helloworld"], 0x7ffff30c07f8 /* 23 vars */) = 0
brk(NULL) = 0x22fd000
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f4e65810000
access("/etc/ld.so.preload", R_OK) = -1 ENOENT (No such file or directory)
open("/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3</etc/ld.so.cache>
fstat(3</etc/ld.so.cache>, {st_mode=S_IFREG|0644, st_size=76353, ...}) = 0
mmap(NULL, 76353, PROT_READ, MAP_PRIVATE, 3</etc/ld.so.cache>, 0) = 0x7f4e657fd000
close(3</etc/ld.so.cache>) = 0
open("/lib64/libc.so.6", O_RDONLY|O_CLOEXEC) = 3</usr/lib64/libc-2.17.so>
read(3</usr/lib64/libc-2.17.so>, "\177ELF\2\1\1\3\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0`&\2\0\0\0\0\0"..., 832) = 832
fstat(3</usr/lib64/libc-2.17.so>, {st_mode=S_IFREG|0755, st_size=2156592, ...}) = 0
mmap(NULL, 3985920, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3</usr/lib64/libc-2.17.so>, 0) = 0x7f4e65222000
mprotect(0x7f4e653e6000, 2093056, PROT_NONE) = 0
mmap(0x7f4e655e5000, 24576, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3</usr/lib64/libc-2.17.so>, 0x1c3000) = 0x7f4e655e5000
mmap(0x7f4e655eb000, 16896, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x7f4e655eb000
close(3</usr/lib64/libc-2.17.so>) = 0
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f4e657fc000
mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f4e657fa000
arch_prctl(ARCH_SET_FS, 0x7f4e657fa740) = 0
access("/etc/sysconfig/strcasecmp-nonascii", F_OK) = -1 ENOENT (No such file or directory)
access("/etc/sysconfig/strcasecmp-nonascii", F_OK) = -1 ENOENT (No such file or directory)
mprotect(0x7f4e655e5000, 16384, PROT_READ) = 0
mprotect(0x600000, 4096, PROT_READ) = 0
mprotect(0x7f4e65811000, 4096, PROT_READ) = 0
munmap(0x7f4e657fd000, 76353) = 0
fstat(1</dev/pts/2<char 136:2>>, {st_mode=S_IFCHR|0620, st_rdev=makedev(136, 2), ...}) = 0
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f4e6580f000
write(1</dev/pts/2<char 136:2>>, "Hello, world\n", 13Hello, world
) = 13
exit_group(13) = ?
+++ exited with 13 +++
注意观察以下系统调用多出了更多尖括号的信息
fstat(1</dev/pts/2<char 136:2>>, {st_mode=S_IFCHR|0620, st_rdev=makedev(136, 2), ...}) = 0
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f4e6580f000
write(1</dev/pts/2<char 136:2>>, "Hello, world\n", 13Hello, world
) = 13
ltrace VS strace
ltrace命令所执行的任务同strace类似,但它是针对库函数的调用。请通过man帮助获得更多细节。
[root@ecs-3370 ~]# ltrace ./helloworld
__libc_start_main(0x40052d, 1, 0x7ffe2fe55608, 0x400540 <unfinished ...>
puts("Hello, world"Hello, world
) = 13
+++ exited (status 13) +++
[root@ecs-3370 ~]#
[root@ecs-3370 ~]# ltrace -c ./helloworld
Hello, world
% time seconds usecs/call calls function
------ ----------- ----------- --------- --------------------
60.12 0.000392 392 1 __libc_start_main
28.22 0.000184 184 1 puts
11.66 0.000076 76 1 exit_group
------ ----------- ----------- --------- --------------------
100.00 0.000652 3 total
[root@ecs-3370 ~]#
注意
strace命令是Linux下专有的,但大多数UNIX实现都提供了它们各自的等价物(例如,Solaris 上的truss,以及BSD上的ktrace)。