strace工具简介
簡(jiǎn)介
strace常用來跟蹤進(jìn)程執(zhí)行時(shí)的系統(tǒng)調(diào)用和所接收的信號(hào)。 在Linux世界,進(jìn)程不能直接訪問硬件設(shè)備,當(dāng)進(jìn)程需要訪問硬件設(shè)備(比如讀取磁盤文件,接收網(wǎng)絡(luò)數(shù)據(jù)等等)時(shí),必須由用戶態(tài)模式切換至內(nèi)核態(tài)模式,通過系統(tǒng)調(diào)用訪問硬件設(shè)備。strace可以跟蹤到一個(gè)進(jìn)程產(chǎn)生的系統(tǒng)調(diào)用,包括參數(shù),返回值,執(zhí)行消耗的時(shí)間。
示例:
每一行都是一條系統(tǒng)調(diào)用,等號(hào)左邊是系統(tǒng)調(diào)用的函數(shù)名及其參數(shù),右邊是該調(diào)用的返回值。 strace 顯示這些調(diào)用的參數(shù)并返回符號(hào)形式的值。strace 從內(nèi)核接收信息,而且不需要以任何特殊的方式來構(gòu)建內(nèi)核。
跟蹤可執(zhí)行程序
strace -f -o straceout.txt myserver strace -o output.txt -T -tt -e trace=all -p 54974-f 選項(xiàng)告訴strace同時(shí)跟蹤fork出來的進(jìn)程,-o選項(xiàng)把所有strace輸出寫到straceout.txt里 面,myserver是要啟動(dòng)和調(diào)試的程序。
跟蹤服務(wù)程序
strace -o output.txt -T -tt -e trace=all ./udp_client 127.0.0.1 8899跟蹤udp_client進(jìn)程的所有系統(tǒng)調(diào)用(-e trace=all),并統(tǒng)計(jì)系統(tǒng)調(diào)用的花費(fèi)時(shí)間,以及開始時(shí)間(并以可視化的時(shí)分秒格式顯示),最后將記錄結(jié)果存在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} ---常用命令行參數(shù)
? ~ 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
統(tǒng)計(jì)每一系統(tǒng)調(diào)用的所執(zhí)行的時(shí)間,次數(shù)和出錯(cuò)的次數(shù)等。
示例:打印執(zhí)行uptime時(shí)系統(tǒng)系統(tǒng)調(diào)用的時(shí)間、次數(shù)、出錯(cuò)次數(shù)和syscall
# strace -c uptime-d
顯示有關(guān)標(biāo)準(zhǔn)錯(cuò)誤的strace本身的一些調(diào)試輸出。
-f
跟蹤子進(jìn)程,這些子進(jìn)程是由于fork(2)系統(tǒng)調(diào)用而由當(dāng)前跟蹤的進(jìn)程創(chuàng)建的。
-i
在系統(tǒng)調(diào)用時(shí)打印指令指針。
-t
跟蹤的每一行都以時(shí)間為前綴。
-tt
如果給出兩次,則打印時(shí)間將包括微秒。
-ttt
如果給定三次,則打印時(shí)間將包括微秒,并且前導(dǎo)部分將打印為自該**以來的秒數(shù)。
-T
顯示花費(fèi)在系統(tǒng)調(diào)用上的時(shí)間。這將記錄每個(gè)系統(tǒng)調(diào)用的開始和結(jié)束之間的時(shí)間差。
-v
打印環(huán)境,統(tǒng)計(jì)信息,termios等調(diào)用的未縮寫版本。這些結(jié)構(gòu)在調(diào)用中非常常見,因此默認(rèn)行為顯示了結(jié)構(gòu)成員的合理子集。使用此選項(xiàng)可獲取所有詳細(xì)信息。
-V
打印strace的版本號(hào)。
-e expr
限定表達(dá)式,用于修改要跟蹤的事件或如何跟蹤它們:
-e trace=set
僅跟蹤指定的系統(tǒng)調(diào)用集。該-c選項(xiàng)用于確定哪些系統(tǒng)調(diào)用可能是跟蹤有用有用。例如,trace=open,close,read,write表示僅跟蹤這四個(gè)系統(tǒng)調(diào)用。
-e trace=file
跟蹤所有以文件名作為參數(shù)的系統(tǒng)調(diào)用。
示例:打印執(zhí)行l(wèi)s時(shí)跟文件有關(guān)的系統(tǒng)調(diào)用。
# strace -e trace=file ls-e trace=process
跟蹤涉及過程管理的所有系統(tǒng)調(diào)用。這對(duì)于觀察進(jìn)程的派生,等待和執(zhí)行步驟很有用。
-e trace=network
跟蹤所有與網(wǎng)絡(luò)相關(guān)的系統(tǒng)調(diào)用。
-e trace=signal
跟蹤所有與信號(hào)相關(guān)的系統(tǒng)調(diào)用。
-e trace=ipc
跟蹤所有與IPC相關(guān)的系統(tǒng)調(diào)用。
-o 文件名
將跟蹤輸出寫入文件名而不是stderr。
-p pid
使用進(jìn)程ID pid附加到該進(jìn)程并開始跟蹤。跟蹤可以隨時(shí)通過鍵盤中斷信號(hào)(CTRL -C)終止。
-S
按指定條件對(duì)-c選項(xiàng)打印的直方圖輸出進(jìn)行排序。
總結(jié)
以上是生活随笔為你收集整理的strace工具简介的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: spring mnv (一)
- 下一篇: 成 绩 统 计