摘要:是環(huán)境下的一款程序調(diào)試工具,用來監(jiān)察一個(gè)應(yīng)用程序所使用的系統(tǒng)調(diào)用及它所接收的系統(tǒng)信息。追蹤程序運(yùn)行時(shí)的整個(gè)生命周期,輸出每一個(gè)系統(tǒng)調(diào)用的名字,參數(shù),返回值和執(zhí)行消耗的時(shí)間等。設(shè)置打印的字符串最大長(zhǎng)度。使用某個(gè)用戶或組來運(yùn)行命令。
strace
strace是Linux環(huán)境下的一款程序調(diào)試工具,用來監(jiān)察一個(gè)應(yīng)用程序所使用的系統(tǒng)調(diào)用及它所接收的系統(tǒng)信息。追蹤程序運(yùn)行時(shí)的整個(gè)生命周期,輸出每一個(gè)系統(tǒng)調(diào)用的名字,參數(shù),返回值和執(zhí)行消耗的時(shí)間等。
常用參數(shù):-p 跟蹤指定的進(jìn)程
-f 跟蹤由fork子進(jìn)程系統(tǒng)調(diào)用
-F 嘗試跟蹤vfork子進(jìn)程系統(tǒng)調(diào)吸入,與-f同時(shí)出現(xiàn)時(shí), vfork不被跟蹤
-o filename 默認(rèn)strace將結(jié)果輸出到stdout。通過-o可以將輸出寫入到filename文件中
-ff 常與-o選項(xiàng)一起使用,不同進(jìn)程(子進(jìn)程)產(chǎn)生的系統(tǒng)調(diào)用輸出到filename.PID文件
-r 打印每一個(gè)系統(tǒng)調(diào)用的相對(duì)時(shí)間
-t 在輸出中的每一行前加上時(shí)間信息。 -tt 時(shí)間確定到微秒級(jí)。還可以使用-ttt打印相對(duì)時(shí)間
-v 輸出所有系統(tǒng)調(diào)用。默認(rèn)情況下,一些頻繁調(diào)用的系統(tǒng)調(diào)用不會(huì)輸出
-s 指定每一行輸出字符串的長(zhǎng)度,默認(rèn)是32。文件名一直全部輸出
-c 統(tǒng)計(jì)每種系統(tǒng)調(diào)用所執(zhí)行的時(shí)間,調(diào)用次數(shù),出錯(cuò)次數(shù)。
-e expr 輸出過濾器,通過表達(dá)式,可以過濾出掉你不想要輸出
當(dāng)有多個(gè)子進(jìn)程的情況下,比如php-fpm、nginx等,用strace追蹤顯得很不方便。可以使用下面的方法來追蹤所有的子進(jìn)程。
# vim /root/.bashrc //添加以下內(nèi)容 function straceall { strace $(pidof "${1}" | sed "s/([0-9]*)/-p 1/g") } # source /root/.bashrc # traceall php-fpm //監(jiān)控phpfpm OR # strace -tt -T $(pidof "php-fpm: pool www" | sed "s/([0-9]*)/-p 1/g")追蹤web服務(wù)
# strace -f -F -s 1024 -o nginx-strace /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf # strace -f -F -o php-fpm-strace /usr/local/php/sbin/php-fpm -y /usr/local/php/etc/php-fpm.conf追蹤mysql
# strace -f -F -ff -o mysqld-strace -s 1024 -p mysql_pid # find ./ -name "mysqld-strace*" -type f -print |xargs grep -n "SELECT.*FROM"查看程序做了什么
#!/bin/bash # This script is from http://poormansprofiler.org/ nsamples=1 sleeptime=0 pid=$(pidof $1) for x in $(seq 1 $nsamples) do gdb -ex "set pagination 0" -ex "thread apply all bt" -batch -p $pid sleep $sleeptime done | awk " BEGIN { s = ""; } /^Thread/ { print s; s = ""; } /^#/ { if (s != "" ) { s = s "," $4} else { s = $4 } } END { print s }" | sort | uniq -c | sort -r -n -k 1,1ltrace
-a 對(duì)齊具體某個(gè)列的返回值
-c 計(jì)算時(shí)間和調(diào)用,并在程序退出時(shí)打印摘要
-C 解碼低級(jí)別名稱(內(nèi)核級(jí))為用戶級(jí)名稱
-d 打印調(diào)試信息
-e 改變跟蹤的事件
-f 跟蹤子進(jìn)
-h 打印幫助信息
-i 打印指令指針,當(dāng)庫(kù)調(diào)用時(shí)。
-l 只打印某個(gè)庫(kù)中的調(diào)用。
-L 不打印庫(kù)調(diào)用。
-n, --indent=NR 對(duì)每個(gè)調(diào)用級(jí)別嵌套以NR個(gè)空格進(jìn)行縮進(jìn)輸出。
-o, --output=file 把輸出定向到文件。
-p PID 附著在值為PID的進(jìn)程號(hào)上進(jìn)行l(wèi)trace。
-r 打印相對(duì)時(shí)間戳。
-s STRLEN 設(shè)置打印的字符串最大長(zhǎng)度。
-S 顯示系統(tǒng)調(diào)用。
-t, -tt, -ttt 打印絕對(duì)時(shí)間戳。
-T 輸出每個(gè)調(diào)用過程的時(shí)間開銷。
-u USERNAME 使用某個(gè)用戶id或組ID來運(yùn)行命令。
-V, --version 打印版本信息,然后退出。
-x NAME treat the global NAME like a library subroutine.
phpstrace追蹤php進(jìn)程
Usage: ./php-strace [ options ] -h|--help show this help -l|--linesoutput the last N lines of a stacktrace. Default: 100 --process-name name of running php processes. Default: autodetect --live search while running for new upcoming pid"s
使用truss/strace/ltrace跟蹤進(jìn)程
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/31961.html
閱讀 2555·2021-09-30 10:00
閱讀 3491·2021-09-22 10:54
閱讀 6212·2021-09-07 10:28
閱讀 2943·2019-08-29 13:53
閱讀 742·2019-08-29 12:42
閱讀 958·2019-08-26 13:51
閱讀 1258·2019-08-26 13:32
閱讀 3021·2019-08-26 10:39