日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

strace工具简介

發布時間:2024/1/18 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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選項打印的直方圖輸出進行排序。

總結

以上是生活随笔為你收集整理的strace工具简介的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。