什么是strace?
strace是一個非常簡單的工具,它可以跟蹤系統調用的執行。最簡單的方式,它可以從頭到尾跟蹤binary的執行,然后以一行文本輸出系統調用的名字,參數和返回值。
其實它可以做的更多:
可以對特定的系統調用或者幾組系統調用進行過濾
可以通過統計特定系統調用的調用次數、耗費的時間、成功和失敗的次數來配置(profile)系統調用的使用 I
跟蹤發送給進程的信號量
如果你使用的是其它Unix系統,它類似于"truss"。其它更復雜的是Sun的Dtrace.
怎么使用它
1) 找出程序在startup的時候讀取的哪個config文件?
有沒有嘗過解決為什么某些程序不讀去你認為它應該讀取的config文件的問題?
$ strace php 2>&1 | grep php.ini open("/usr/local/bin/php.ini", O_RDONLY) = -1 ENOENT (No such file or directory) open("/usr/local/lib/php.ini", O_RDONLY) = 4 lstat64("/usr/local/lib/php.ini", {st_mode=S_IFLNK|0777, st_size=27, ...}) = 0 readlink("/usr/local/lib/php.ini", "/usr/local/Zend/etc/php.ini", 4096) = 27 lstat64("/usr/local/Zend/etc/php.ini", {st_mode=S_IFREG|0664, st_size=40971, ...}) = 0
可以看出這個版本的PHP從/usr/local/lib/php.init讀取config文件(但是先嘗試/usr/locl/bin)
如果只關心特定的系統調用,有更精致的方法
$ strace -e open php 2>&1 | grep php.ini open("/usr/local/bin/php.ini", O_RDONLY) = -1 ENOENT (No such file or directory) open("/usr/local/lib/php.ini", O_RDONLY) = 4
相同的方法適用于很多其它類似的問題。比如說,安裝了不同版本的library,不確定實際上加載了哪一個版本。
-e expr -- a qualifying expression: option=[!]all or option=[!]val1[,val2]...
options: trace, abbrev, verbose, raw, signal, read, write
2) 為什么這個程序沒有打開我的文件?
是否曾經碰到過一個程序拒絕讀取它沒有權限的文件,但是你發誓原因是它沒有真正找到那個文件?對程序跟蹤open,access調用,注意失敗的情況
$ strace -e open,access 2>&1 | grep your-filename
3) 某個進程現在在做什么?
某個進程突然占用了很多CPU? 或者某個進程看起來像hanging了?
找到對應的pid,然后
hang:
懸掛,掛起的意思
就是一個進程被暫時停止執行.
root@dev:~# strace -p 15427 Process 15427 attached - interrupt to quit futex(0x402f4900, FUTEX_WAIT, 2, NULL Process15427detached
嗯,這個例子里面,它在調用futex()的時候掛起了。
"strace -p"非常有用,它減少了很多猜測工作,也不需要重新啟動應用。
-p pid -- trace process with process id PID, may be repeated
4) 是誰偷走了時間?
你可以重新編譯app,打開profiling,以獲取精確的信息。但是通常利用strace附著(attach)一個進程以快速地看一下當前時間花費在哪里非常有用。可以看下是否90%的CPU用在真正的工作,或者用在其它方面了。
root@dev:~# strace -c -p 11084 Process 11084 attached - interrupt to quit Process 11084 detached % time seconds usecs/call calls errors syscall ------ ----------- ----------- --------- --------- ---------------- 94.59 0.001014 48 21 select 2.89 0.000031 1 21 getppid 2.52 0.000027 1 21 time ------ ----------- ----------- --------- --------- ---------------- 100.00 0.001072 63 total root@dev:~#
-c -- count time, calls, and errors for each syscall and report summary
-C -- like -c but also print regular output
在執行strace -c -p命令以后,等到你關注的時間到了后,按ctrl-c退出,strace會列出如上的profiling數據。
在這個例子中,程序花了絕大部分時間在等待select()。它在每一個slect()調用這件調用getpid()和time(),這是一種典型的事件循環。
你也可以運行"start to finish",這里是"ls"
root@dev:~# strace -c >/dev/null ls % time seconds usecs/call calls errors syscall ------ ----------- ----------- --------- --------- ---------------- 23.62 0.000205 103 2 getdents64 18.78 0.000163 15 11 1 open 15.09 0.000131 19 7 read 12.79 0.000111 7 16 old_mmap 7.03 0.000061 6 11 close 4.84 0.000042 11 4 munmap 4.84 0.000042 11 4 mmap2 4.03 0.000035 6 6 6 access 3.80 0.000033 3 11 fstat64 1.38 0.000012 3 4 brk 0.92 0.000008 3 3 3 ioctl 0.69 0.000006 6 1 uname 0.58 0.000005 5 1 set_thread_area 0.35 0.000003 3 1 write 0.35 0.000003 3 1 rt_sigaction 0.35 0.000003 3 1 fcntl64 0.23 0.000002 2 1 getrlimit 0.23 0.000002 2 1 set_tid_address 0.12 0.000001 1 1 rt_sigprocmask ------ ----------- ----------- --------- --------- ---------------- 100.00 0.000868 87 10 total
正如你的預期,它耗費了大部分時間在兩次調用來讀取目錄條目上(因為運行于一個小的目錄上,所有只有兩次)
5) 為什么 無法連接到服務器?
調試進程無法連接到遠端服務器有時候是件非常頭痛的事。DNS會失敗,connect會掛起,server有可能返回一些意料之外的數據。
可以使用tcpdump來分析這些情況,它是一個非常棒的工作。但是有時候你strace可以給你更簡單,耿直借的角度,因為strace只返回你的進程相關的系統調用產生的數據。
如果你要從100個連接到統一個數據服務器的運行進程里面找出一個連接所做的事情,用strace就比tcpdump簡單得多。
下面是跟蹤"nc"連接到www.news.com 80端口的例子
$ strace -e poll,select,connect,recvfrom,sendto nc www.news.com 80 sendto(3, "24 主站蜘蛛池模板: 亚洲1卡二卡3卡四卡不卡 | 久久久久久青草大香综合精品 | 国产精品久久久久久久久久免费 | 国产性夜夜性夜夜爽91 | 欧美一级乱理片免费观看 | 天天色官网 | 26uuu另类亚洲欧美日本一 | 欧美片欧美日韩国产综合片 | 最新黄色地址 | 亚洲男人天堂2021 | 午夜操| 国产叼嘿视频免费网站 | 欧美性久久 | 国产色系视频在线观看免费 | 四虎永久精品视频在线 | 男人j进女人j免费视频视频 | 可以在线看黄的网站 | 成人在线黄色 | 四虎网站在线播放 | 福利片在线观看免费高清 | 在线视频图片小说 | 国产午夜亚洲精品 | 8050网午夜| 日本高清视频在线www色 | 又粗又大的机巴好爽欧美 | 在线观看黄网 | 亚洲情a成黄在线观看 | 喷潮白浆| 午夜片网站| 国内在线观看精品免费视频 | 成人欧美一区二区三区白人 | 成年1314在线观看 | 四虎国产在线 | 精品一区二区视频 | 成人a毛片视频免费看 | 国产国产人免费人成免费视频 | 四虎永久在线观看视频精品 | 天天涩综合 | 亚洲久久久 | 九九全国免费视频 | 欧美爱爱网 |