strace工具简介

简介

strace常用来跟踪进程执行时的系统调用和所接收的信号。 在Linux世界,进程不能直接访问硬件设备,当进程需要访问硬件设备(比如读取磁盘文件,接收网络数据等等)时,必须由用户态模式切换至内核态模式,通过系统调用访问硬件设备。strace可以跟踪到一个进程产生的系统调用,包括参数,返回值,执行消耗的时间。
示例:

# strace cat /dev/null
execve("/bin/cat", ["cat", "/dev/null"], [/* 22 vars */]) = 0
brk(0)                                  = 0xab1000
access("/etc/ld.so.nohwcap", F_OK)      = -1 ENOENT (No such file or directory)
mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f29379a7000
access("/etc/ld.so.preload", R_OK)      = -1 ENOENT (No such file or directory)
...

每一行都是一条系统调用,等号左边是系统调用的函数名及其参数,右边是该调用的返回值。 strace 显示这些调用的参数并返回符号形式的值。strace 从内核接收信息,而且不需要以任何特殊的方式来构建内核。

跟踪可执行程序

strace -f -o straceout.txt myserver
strace -o output.txt -T -tt -e trace=all -p 54974

-f 选项告诉strace同时跟踪fork出来的进程,-o选项把所有strace输出写到straceout.txt里 面,myserver是要启动和调试的程序。

跟踪服务程序

strace -o output.txt -T -tt -e trace=all  ./udp_client 127.0.0.1 8899

跟踪udp_client进程的所有系统调用(-e trace=all),并统计系统调用的花费时间,以及开始时间(并以可视化的时分秒格式显示),最后将记录结果存在output.txt文件里面

00:18:57.217205 execve("./udp_client", ["./udp_client", "127.0.0.1", "8899"], 0x7ffd71475ba0 /* 29 vars */) = 0 <0.000190>
00:18:57.217636 brk(NULL)               = 0x16e3000 <0.000021>
00:18:57.217741 mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f35eccbe000 <0.000021>
00:18:57.217822 access("/etc/ld.so.preload", R_OK) = -1 ENOENT (No such file or directory) <0.000022>
00:18:57.217967 open("/apps/sylar/lib/tls/x86_64/libstdc++.so.6", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory) <0.000020>
00:18:57.218038 stat("/apps/sylar/lib/tls/x86_64", 0x7ffc08d07e50) = -1 ENOENT (No such file or directory) <0.000019>
00:18:57.218102 open("/apps/sylar/lib/tls/libstdc++.so.6", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory) <0.000020>
00:18:57.218158 stat("/apps/sylar/lib/tls", 0x7ffc08d07e50) = -1 ENOENT (No such file or directory) <0.000019>
00:18:57.218213 open("/apps/sylar/lib/x86_64/libstdc++.so.6", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory) <0.000019>
00:18:57.218269 stat("/apps/sylar/lib/x86_64", 0x7ffc08d07e50) = -1 ENOENT (No such file or directory) <0.000019>
00:18:57.218391 open("/apps/sylar/lib/libstdc++.so.6", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory) <0.000023>
00:18:57.218458 stat("/apps/sylar/lib", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0 <0.000019>
00:18:57.218524 open("/apps/sylar/lib64/tls/x86_64/libstdc++.so.6", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory) <0.000020>
00:18:57.218582 stat("/apps/sylar/lib64/tls/x86_64", 0x7ffc08d07e50) = -1 ENOENT (No such file or directory) <0.000025>
00:18:57.218643 open("/apps/sylar/lib64/tls/libstdc++.so.6", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory) <0.000019>
00:18:57.218701 stat("/apps/sylar/lib64/tls", 0x7ffc08d07e50) = -1 ENOENT (No such file or directory) <0.000021>
00:18:57.218759 open("/apps/sylar/lib64/x86_64/libstdc++.so.6", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory) <0.000020>
00:18:57.218816 stat("/apps/sylar/lib64/x86_64", 0x7ffc08d07e50) = -1 ENOENT (No such file or directory) <0.000019>
00:18:57.218872 open("/apps/sylar/lib64/libstdc++.so.6", O_RDONLY|O_CLOEXEC) = 3 <0.000022>
00:18:57.218929 read(3, "\177ELF\2\1\1\3\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\0\276\t\0\0\0\0\0"..., 832) = 832 <0.000019>
00:18:57.218989 fstat(3, {st_mode=S_IFREG|0755, st_size=14609776, ...}) = 0 <0.000018>
00:18:57.219047 mmap(NULL, 4217152, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7f35ec698000 <0.000021>
00:18:57.219104 mprotect(0x7f35ec88e000, 2093056, PROT_NONE) = 0 <0.000021>
00:18:57.219173 mmap(0x7f35eca8d000, 57344, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x1f5000) = 0x7f35eca8d000 <0.000031>
00:18:57.219265 mmap(0x7f35eca9b000, 10560, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x7f35eca9b000 <0.000018>
00:18:57.219323 close(3)                = 0 <0.000028>
00:18:57.219391 open("/apps/sylar/lib/libm.so.6", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory) <0.000020>
00:18:57.219452 open("/apps/sylar/lib64/libm.so.6", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory) <0.000018>
00:18:57.219504 open("tls/x86_64/libm.so.6", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory) <0.000017>
00:18:57.219555 open("tls/libm.so.6", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory) <0.000017>
00:18:57.219606 open("x86_64/libm.so.6", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory) <0.000017>
00:18:57.219657 open("libm.so.6", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory) <0.000017>
00:18:57.219710 open("/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3 <0.000019>
00:18:57.219768 fstat(3, {st_mode=S_IFREG|0644, st_size=39315, ...}) = 0 <0.000016>
00:18:57.219819 mmap(NULL, 39315, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7f35eccb4000 <0.000018>
00:18:57.219868 close(3)                = 0 <0.000016>
00:18:57.219923 open("/lib64/libm.so.6", O_RDONLY|O_CLOEXEC) = 3 <0.000021>
00:18:57.219976 read(3, "\177ELF\2\1\1\3\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0PS\0\0\0\0\0\0"..., 832) = 832 <0.000017>
00:18:57.220032 fstat(3, {st_mode=S_IFREG|0755, st_size=1136944, ...}) = 0 <0.000016>
00:18:57.220082 mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f35eccb3000 <0.000017>
00:18:57.220134 mmap(NULL, 3150136, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7f35ec396000 <0.000019>
00:18:57.220183 mprotect(0x7f35ec497000, 2093056, PROT_NONE) = 0 <0.000021>
00:18:57.220235 mmap(0x7f35ec696000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x100000) = 0x7f35ec696000 <0.000020>
00:18:57.220293 close(3)                = 0 <0.000016>
00:18:57.220354 open("/apps/sylar/lib/libgcc_s.so.1", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory) <0.000019>
00:18:57.220412 open("/apps/sylar/lib64/libgcc_s.so.1", O_RDONLY|O_CLOEXEC) = 3 <0.000018>
00:18:57.220464 read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\0+\0\0\0\0\0\0"..., 832) = 832 <0.000018>
00:18:57.220516 fstat(3, {st_mode=S_IFREG|0644, st_size=427712, ...}) = 0 <0.000019>
00:18:57.220575 mmap(NULL, 2192456, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7f35ec17e000 <0.000021>
00:18:57.220637 mprotect(0x7f35ec195000, 2093056, PROT_NONE) = 0 <0.000023>
00:18:57.220697 mmap(0x7f35ec394000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x16000) = 0x7f35ec394000 <0.000027>
00:18:57.220773 close(3)                = 0 <0.000019>
00:18:57.220838 open("/apps/sylar/lib/libc.so.6", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory) <0.000025>
00:18:57.220913 open("/apps/sylar/lib64/libc.so.6", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory) <0.000023>
00:18:57.220981 open("tls/x86_64/libc.so.6", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory) <0.000022>
00:18:57.221046 open("tls/libc.so.6", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory) <0.000020>
00:18:57.221108 open("x86_64/libc.so.6", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory) <0.000019>
00:18:57.221170 open("libc.so.6", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory) <0.000021>
00:18:57.221238 open("/lib64/libc.so.6", O_RDONLY|O_CLOEXEC) = 3 <0.000024>
00:18:57.221304 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.000030>
00:18:57.221379 fstat(3, {st_mode=S_IFREG|0755, st_size=2156592, ...}) = 0 <0.000021>
00:18:57.221443 mmap(NULL, 3985920, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7f35ebdb0000 <0.000022>
00:18:57.221510 mprotect(0x7f35ebf74000, 2093056, PROT_NONE) = 0 <0.000026>
00:18:57.221576 mmap(0x7f35ec173000, 24576, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x1c3000) = 0x7f35ec173000 <0.000024>
00:18:57.221645 mmap(0x7f35ec179000, 16896, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x7f35ec179000 <0.000021>
00:18:57.221722 close(3)                = 0 <0.000019>
00:18:57.221791 mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f35eccb2000 <0.000020>
00:18:57.221877 mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f35eccb0000 <0.000020>
00:18:57.221965 arch_prctl(ARCH_SET_FS, 0x7f35eccb0740) = 0 <0.000018>
00:18:57.222312 access("/etc/sysconfig/strcasecmp-nonascii", F_OK) = -1 ENOENT (No such file or directory) <0.000030>
00:18:57.222497 access("/etc/sysconfig/strcasecmp-nonascii", F_OK) = -1 ENOENT (No such file or directory) <0.000024>
00:18:57.222579 mprotect(0x7f35ec173000, 16384, PROT_READ) = 0 <0.000031>
00:18:57.222677 mprotect(0x7f35ec394000, 4096, PROT_READ) = 0 <0.000023>
00:18:57.222795 mprotect(0x7f35ec696000, 4096, PROT_READ) = 0 <0.000023>
00:18:57.223631 mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f35eccaf000 <0.000022>
00:18:57.223795 mprotect(0x7f35eca8d000, 45056, PROT_READ) = 0 <0.000020>
00:18:57.223852 mprotect(0x600000, 4096, PROT_READ) = 0 <0.000022>
00:18:57.223914 mprotect(0x7f35eccbf000, 4096, PROT_READ) = 0 <0.000019>
00:18:57.223965 munmap(0x7f35eccb4000, 39315) = 0 <0.000022>
00:18:57.224122 brk(NULL)               = 0x16e3000 <0.000017>
00:18:57.224175 brk(0x1715000)          = 0x1715000 <0.000017>
00:18:57.224240 socket(AF_INET, SOCK_DGRAM, IPPROTO_IP) = 3 <0.000020>
00:18:57.224316 fstat(1, {st_mode=S_IFCHR|0620, st_rdev=makedev(136, 1), ...}) = 0 <0.000039>
00:18:57.224401 mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f35eccbd000 <0.000018>
00:18:57.224462 write(1, "sock:3\n", 7) = 7 <0.000024>
00:18:57.224541 write(1, "Please Enter# ", 14) = 14 <0.000020>
00:18:57.224597 read(0, "12345\n", 1023) = 6 <6.778551>
00:19:04.003241 sendto(3, "12345", 5, 0, {sa_family=AF_INET, sin_port=htons(8899), sin_addr=inet_addr("127.0.0.1")}, 16) = 5 <0.000057>
00:19:04.003411 recvfrom(3, "12345", 1023, 0, NULL, NULL) = 5 <0.000031>
00:19:04.003509 write(1, "server echo# 12345\n", 19) = 19 <0.000027>
00:19:04.003584 write(1, "Please Enter# ", 14) = 14 <0.000025>
00:19:04.003649 read(0, 0x7ffc08d09290, 1023) = ? ERESTARTSYS (To be restarted if SA_RESTART is set) <6.710081>
00:19:10.713800 --- SIGWINCH {si_signo=SIGWINCH, si_code=SI_KERNEL} ---

常用命令行参数

➜  ~ 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]

-c

统计每一系统调用的所执行的时间,次数和出错的次数等。

示例:打印执行uptime时系统系统调用的时间、次数、出错次数和syscall

# strace -c uptime

-d

显示有关标准错误的strace本身的一些调试输出。

-f

跟踪子进程,这些子进程是由于fork(2)系统调用而由当前跟踪的进程创建的。

-i
在系统调用时打印指令指针。

-t

跟踪的每一行都以时间为前缀。

-tt

如果给出两次,则打印时间将包括微秒。

-ttt

如果给定三次,则打印时间将包括微秒,并且前导部分将打印为自该**以来的秒数。

-T

显示花费在系统调用上的时间。这将记录每个系统调用的开始和结束之间的时间差。

-v

打印环境,统计信息,termios等调用的未缩写版本。这些结构在调用中非常常见,因此默认行为显示了结构成员的合理子集。使用此选项可获取所有详细信息。

-V

打印strace的版本号。

-e expr

限定表达式,用于修改要跟踪的事件或如何跟踪它们:

-e trace=set

仅跟踪指定的系统调用集。该-c选项用于确定哪些系统调用可能是跟踪有用有用。例如,trace=open,close,read,write表示仅跟踪这四个系统调用。

-e trace=file

跟踪所有以文件名作为参数的系统调用。

示例:打印执行ls时跟文件有关的系统调用。

# strace -e trace=file ls

-e trace=process

跟踪涉及过程管理的所有系统调用。这对于观察进程的派生,等待和执行步骤很有用。

-e trace=network

跟踪所有与网络相关的系统调用。

-e trace=signal

跟踪所有与信号相关的系统调用。

-e trace=ipc

跟踪所有与IPC相关的系统调用。

-o 文件名

将跟踪输出写入文件名而不是stderr。

-p pid

使用进程ID pid附加到该进程并开始跟踪。跟踪可以随时通过键盘中断信号(CTRL -C)终止。

-S

按指定条件对-c选项打印的直方图输出进行排序。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Erice_s

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值