9.11 strace:跟踪进程的系统调用 、ltrace:跟踪进程调用库函数
生活随笔
收集整理的這篇文章主要介紹了
9.11 strace:跟踪进程的系统调用 、ltrace:跟踪进程调用库函数
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
?strace
是Linux環(huán)境下的一款程序調(diào)試工具,用于檢查一個(gè)應(yīng)用程序所使用的系統(tǒng)調(diào)用以及它所接收的系統(tǒng)信息。strace會(huì)追蹤程序運(yùn)行時(shí)的整個(gè)生命周期,輸出每一個(gè)系統(tǒng)調(diào)用的名字、參數(shù)、返回值和執(zhí)行所消耗的時(shí)間等,是高級(jí)運(yùn)維和開發(fā)人員排查問題的殺手銅。?strace命令的參數(shù)選項(xiàng)及說明
-c 統(tǒng)計(jì)每一個(gè)系統(tǒng)調(diào)用所執(zhí)行的時(shí)間、次數(shù)和出錯(cuò)的次數(shù)等 -d 輸出strace關(guān)于標(biāo)準(zhǔn)錯(cuò)誤的調(diào)試信息 -f 跟蹤目標(biāo)進(jìn)程,以及目標(biāo)進(jìn)程創(chuàng)建的所有子進(jìn)程 -ff 如果提供-o filename,則將所有進(jìn)程的跟蹤結(jié)果輸出到相應(yīng)的filename.pid中,pid是各進(jìn)程的進(jìn)程號(hào) -i 輸出系統(tǒng)調(diào)用的入口指針 -q 禁止輸出關(guān)于脫離的消息 -r 輸出每一個(gè)系統(tǒng)調(diào)用的相對(duì)時(shí)間 -t 在輸出中的每一行前加上時(shí)間信息。例如16:45:28 -tt 在輸出中的每一行前加上時(shí)間信息,精確到微秒。例如11:18:59.759546端 -ttt 在輸出中的每一行前加上時(shí)間信息,精確到微秒,而且時(shí)間表示為UNIX時(shí)間戳。例如1486111461.650434 -T 顯示每次系統(tǒng)調(diào)用所花費(fèi)的時(shí)間 -v 對(duì)于某些相關(guān)調(diào)用,把完整的環(huán)境變量、文件stat結(jié)構(gòu)等打印出來 -x 以十六進(jìn)制形式輸出非標(biāo)準(zhǔn)字符率 -xx 所有字符串以十六進(jìn)制形式輸出-e expr 輸出過濾器,通過表達(dá)式,可以過濾掉你不想要的輸出expr是一個(gè)表達(dá)式,用于控制如何跟蹤:[qualifier=][!][valuel[,value2]..說明:①qualifier 只能是trace、abbrev、verbose、raw、signal、read、write其中之一②value是用來限定的符號(hào)或數(shù)字③默認(rèn)的qualifier是trace④感嘆號(hào)是否定符號(hào)例如:-e open等價(jià)于-e trace=open,表示只跟蹤open調(diào)用而-e trace!=open表示跟蹤除了open以外的其他調(diào)用常見選項(xiàng):-e trace=[set] 只跟蹤指定的系統(tǒng)調(diào)用-e trace=file 只跟蹤與文件操作有關(guān)的系統(tǒng)調(diào)用-e trace=process 只跟蹤與進(jìn)程控制有關(guān)的系統(tǒng)調(diào)用-e trace-network 只跟蹤與網(wǎng)絡(luò)有關(guān)的系統(tǒng)調(diào)用-e trace=signal 只跟蹤與系統(tǒng)信號(hào)有關(guān)的系統(tǒng)調(diào)用-e trace=desc 只跟蹤與文件描述符有關(guān)的系統(tǒng)調(diào)用-e trace=ipc 只跟蹤與進(jìn)程通信有關(guān)的系統(tǒng)調(diào)用-e abbrev=[set] 設(shè)定strace輸出的系統(tǒng)調(diào)用的結(jié)果集-e raw=[set] 將指定的系統(tǒng)調(diào)用的參數(shù)以十六進(jìn)制顯示-e signal=[set] 指定跟蹤的系統(tǒng)信號(hào)-e read=[set] 輸出從指定文件中讀出的數(shù)據(jù)-e write=[set] 輸出寫入到指定文件中的數(shù)據(jù)-o filename 將strace的輸出寫入文件filename -p pid 指定要跟蹤的進(jìn)程pid,要同時(shí)跟蹤多個(gè)pid,重復(fù)多次p選項(xiàng)即可* -s strsize 指定輸出的字符串的最大長度,默認(rèn)為32。并沒有將文件名視為字符串,默認(rèn)全部輸出 -u username 以u(píng)semame的UID和GID執(zhí)行所跟蹤的命令排查Nginx403 forbidden錯(cuò)誤
strace -tt -f /applicatton/nginx/sbin/nginx https://blog.51cto.com/oldboy/1633952只跟蹤與文件操作有關(guān)的系統(tǒng)調(diào)用
strace -tt -f -e trace=file /application/nginx/sbin/nginx? ? #只跟綜與文件操作有關(guān)的系統(tǒng)調(diào)用。通過pid 跟蹤進(jìn)程
[root@bzhl ~]# pgrep nginx 1884 7785 7786 7787 [root@bzhl ~]# pstree -p 1884 nginx(1884)─┬─nginx(7785) ├─nginx(7786) └─nginx(7787) [root@bzhl ~]# strace -tt -f -e trace=file -p 7785 strace: Process 7785 attached?跟蹤系統(tǒng)調(diào)用統(tǒng)計(jì)
strace不僅能夠追蹤系統(tǒng)調(diào)用,使用選項(xiàng)-c還能對(duì)進(jìn)程所有的系統(tǒng)調(diào)用做一個(gè)統(tǒng)計(jì)分析。? [root@bzhl ~]# which nginx /usr/bin/nginx [root@bzhl ~]# strace -c /usr/bin/nginx % time seconds usecs/call calls errors syscall ------ ----------- ----------- --------- --------- ---------------- 22.33 0.001129 7 153 52 open 15.55 0.000786 6 123 close 10.80 0.000546 6 95 mmap8.53 0.000431 13 32 write7.66 0.000387 10 39 read6.47 0.000327 7 48 mprotect5.38 0.000272 12 22 munmap4.35 0.000220 3 87 fstat3.20 0.000162 32 5 nanosleep2.87 0.000145 8 19 socket2.67 0.000135 4 38 pread642.29 0.000116 29 4 4 connect1.19 0.000060 4 15 15 bind1.03 0.000052 3 16 5 stat1.03 0.000052 9 6 getdents0.99 0.000050 3 15 setsockopt0.65 0.000033 11 3 openat0.63 0.000032 2 15 ioctl0.63 0.000032 5 6 6 mkdir0.47 0.000024 2 12 fcntl0.16 0.000008 8 1 statfs0.14 0.000007 7 1 1 readlink0.10 0.000005 5 1 epoll_create0.08 0.000004 2 2 rt_sigaction0.08 0.000004 2 2 uname0.08 0.000004 2 2 gettimeofday0.08 0.000004 4 1 futex0.06 0.000003 3 1 poll0.06 0.000003 3 1 lseek0.06 0.000003 2 2 getrlimit0.06 0.000003 3 1 getppid0.06 0.000003 3 1 sched_getaffinity0.04 0.000002 1 2 brk0.04 0.000002 2 1 rt_sigprocmask0.04 0.000002 2 1 getuid0.04 0.000002 2 1 arch_prctl0.04 0.000002 2 1 set_tid_address0.04 0.000002 2 1 set_robust_list0.02 0.000001 1 1 geteuid0.00 0.000000 0 1 1 access0.00 0.000000 0 1 execve ------ ----------- ----------- --------- --------- ---------------- 100.00 0.005055 779 84 total? ? ?上面的結(jié)果將清楚地告訴我們調(diào)用了哪些系統(tǒng)函數(shù),調(diào)用的次數(shù)是多少,消耗了多少時(shí)間等信息,這對(duì)我們分析程序來說是非常有用的。?
重定向輸出。
strace -c -o tongji.log /application/nginx/sbin/nginx? #用 -o 選項(xiàng)將strace的結(jié)果輸出到文件中?對(duì)系統(tǒng)調(diào)用進(jìn)行計(jì)時(shí)
strace -T /application/nginx/sbin/ngirnx? ? #<=使用選項(xiàng)-T將每個(gè)系統(tǒng)調(diào)用所花費(fèi)的時(shí)間打印出來,每個(gè)調(diào)用的時(shí)間花費(fèi)在調(diào)用行最右邊的尖括導(dǎo)里面。? 小結(jié):strace命令很適合處埋程序僵尸、命令執(zhí)行報(bào)錯(cuò)等問題,如果從程序日志和系統(tǒng)日志中看不出問題出現(xiàn)的原因,則可以strace一下,也許會(huì)有答案,不過也需要使用者有足夠的耐心去查看輸出!?ltrace:跟蹤進(jìn)程調(diào)用庫函數(shù)
ltrace 能夠跟蹤進(jìn)程的庫函數(shù)調(diào)用,它會(huì)顯現(xiàn)出調(diào)用了哪個(gè)庫函數(shù),而 strace則是跟蹤進(jìn)程的每個(gè)系統(tǒng)調(diào)用。?ltrace命令的參數(shù)選項(xiàng)及說明
-c 統(tǒng)計(jì)庫函數(shù)每次調(diào)用的時(shí)間,最后程序退出時(shí)打印摘要 -C 解碼低級(jí)別名稱(內(nèi)核級(jí))為用戶級(jí)名稱 -d 打印調(diào)試信息 -e expr 輸出過濾器,通過表達(dá)式,可以過濾掉你不想要的輸出-e printf 表示只查看printf函數(shù)調(diào)用-e !printf 表示查看除printf函數(shù)以外的所有函數(shù)調(diào)用 -f 跟蹤子進(jìn)程 -o filename 將ltrace的輸出寫入文件filename -p pid 指定要跟蹤的進(jìn)程pid -r 輸出每一個(gè)調(diào)用的相對(duì)時(shí)間 -S 顯示系統(tǒng)調(diào)用 -t 在輸出中的每一行前加上時(shí)間信息。例如16:45:28 -tt 在輸出中的每一行前加上時(shí)間信息,精確到微秒。例如11:18:59.759546 -ttt 在輸出中的每一行前加上時(shí)間信息,精確到微秒,而且時(shí)間表示為UNIX時(shí)間截。例如1486111461.650434 -T 顯示每次調(diào)用所花費(fèi)的時(shí)間 -u username 以u(píng)sername的UID和GID執(zhí)行所跟蹤的命令Itrace使用 ltrace的用法與strace非常相似,選項(xiàng)功能也是類似 [root@bzhl ~]# ltrace /usr/bin/nginx 通過pid 跟蹤進(jìn)程調(diào)用庫函數(shù)。 [root@bzhl ~]# pgrep nginx 1884 7785 7786 7787 [root@bzhl ~]# ltrace -p 1884
總結(jié)
以上是生活随笔為你收集整理的9.11 strace:跟踪进程的系统调用 、ltrace:跟踪进程调用库函数的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 9.10 nohup:用户退出系统进程继
- 下一篇: 9.13-15 runlevel in