日本免费全黄少妇一区二区三区-高清无码一区二区三区四区-欧美中文字幕日韩在线观看-国产福利诱惑在线网站-国产中文字幕一区在线-亚洲欧美精品日韩一区-久久国产精品国产精品国产-国产精久久久久久一区二区三区-欧美亚洲国产精品久久久久

跟蹤 UNIX 應(yīng)用程序的解決方案( 五 )


要想跟蹤正在運(yùn)行的程序,需要指定要跟蹤的進(jìn)程的進(jìn)程 ID (PID) 。例如,在清單 6 中,跟蹤的程序已經(jīng)停止,但是沒有報(bào)告錯誤 。這里使用 ps 工具列出正在運(yùn)行的進(jìn)程(見清單 7) 。
清單 7. 使用 ps 工具列出正在運(yùn)行的進(jìn)程
$ ps -ef|grep errlock 
 mc 15779 157470 18:26:59 pts/20:00 ./errlock 
 mc 157426800 18:26:36 pts/30:00 ./errlock 
 mc 15817 157840 18:28:44 pts/40:00 grep errlock 
 mc 157346800 18:25:00 pts/30:01 /usr/bin/eMacs-nox errlock.c 
$ truss -p 15779 
fcntl(3, F_SETLKW, 0x08047AC4) (sleeping...)
在輸出中可以看到,已經(jīng)調(diào)用了 fcntl() 函數(shù),它要在一個文件上設(shè)置鎖 。在這里,這個函數(shù)會一直等待到成功地設(shè)置鎖,然后才繼續(xù)運(yùn)行 。不幸的是,另一個進(jìn)程已經(jīng)鎖住了這個文件,所以第二個應(yīng)用程序必須等待第一個應(yīng)用程序使用完文件并釋放鎖 。
對于這種情況,truss 有點(diǎn)兒局限性:它無法指出要鎖住哪個文件,也無法指出當(dāng)前鎖住了哪個文件,從而阻礙了第二個程序的執(zhí)行 。這是因?yàn)楦欉^程是在已經(jīng)調(diào)用了打開文件的函數(shù)之后啟動的 。truss 和 strace 只跟蹤在它們執(zhí)行期間調(diào)用的函數(shù);它們無法查明已經(jīng)調(diào)用的函數(shù) 。
獲取堆棧跟蹤
可以看出,truss 對于監(jiān)視整個程序很有用,但是對于監(jiān)視已經(jīng)啟動的程序可能有點(diǎn)兒局限性 。如果使用基于 SVR4 的 Unix,比如 Solaris 或 AIX,那么 pstack 命令可能有幫助 。
pstack 命令實(shí)際上屬于一組進(jìn)程檢查命令,這些命令輸出正在運(yùn)行的進(jìn)程的相關(guān)信息 。其他工具包括 pfiles(輸出進(jìn)程使用的文件的列表)和 psig(顯示信號和信號處理函數(shù)的列表) 。
在使用這些命令時,需要指定進(jìn)程的 PID 。pstack 命令輸出一個正在運(yùn)行的進(jìn)程的調(diào)用堆棧,顯示在進(jìn)程到達(dá)當(dāng)前函數(shù)之前調(diào)用的函數(shù) 。例如,對正在等待被鎖住的文件的進(jìn)程使用 pstack,會產(chǎn)生清單 8 中的輸出 。
清單 8. 對正在等待被鎖住的文件的進(jìn)程使用 pstack
$ pstack 15828 
15828: ./errlock 
 feef0877 fcntl(3, 7, 8047ac4) 
 feedcd49 fcntl(3, 7, 8047ac4, 8050e74)91 
 08050f10 main (1, 8047b24, 8047b2c)d8 
 08050cdc _start(1, 8047c08, 0, 8047c12, 8047c7d, 8047c8e)80
在這里,它沒有提供我們需要的信息 。現(xiàn)在試試 pfiles(見清單 9) 。
清單 9. 使用 pfiles
$ pfiles 15856 
15856: ./errlock 
 Current rlimit: 256 file descriptors 
0: S_IFCHR mode:0620 dev:292,0 ino:989038936 uid:101 gid:7 rdev:24,3 
 O_RDWR|O_NOCTTY|O_LARGEFILE 
 /dev/pts/3 
1: S_IFCHR mode:0620 dev:292,0 ino:989038936 uid:101 gid:7 rdev:24,3 
 O_RDWR|O_NOCTTY|O_LARGEFILE 
 /dev/pts/3 
2: S_IFCHR mode:0620 dev:292,0 ino:989038936 uid:101 gid:7 rdev:24,3 
 O_RDWR|O_NOCTTY|O_LARGEFILE 
 /dev/pts/3 
3: S_IFREG mode:0666 dev:182,65545 ino:198 uid:101 gid:10 size:0 
 O_RDWR 
 advisory write lock set by process 15828 
 /export/home/mc/lockdemo
這些輸出就比較有用了 ??梢钥吹竭M(jìn)程已經(jīng)打開的文件稱為 lockdemo ,因?yàn)?truss 顯示正在等待文件鎖,所以可能是這個文件導(dǎo)致了問題 。
truss 和 strace 都是被動的跟蹤 ??梢圆榭凑趫?zhí)行的函數(shù),但是無法了解關(guān)于正在發(fā)生的情況的詳細(xì)信息,也無法更有針對性地指定要跟蹤的東西和跟蹤時要輸出的信息 。
用 DTrace 進(jìn)行動態(tài)跟蹤
【跟蹤 UNIX 應(yīng)用程序的解決方案】Solaris、FreeBSD 和 Mac OS X 內(nèi)置的 Dynamic Tracing (DTrace) 功能提供一個更加動態(tài)的跟蹤環(huán)境 。與 truss 和相似的工具不同,可以使用 DTrace 檢查正在運(yùn)行的程序的內(nèi)部情況,而不只是查看系統(tǒng)調(diào)用 。另外,可以使用 DTrace 編寫應(yīng)用程序跟蹤腳本,從而定制在跟蹤過程中希望提取的信息 。

推薦閱讀