Linux strace命令案例一

strace命令應用分析實例一:
通用的完整用法:linux

strace -o output.txt -T -tt -e trace=all -p 28979

上面命令參數含義是:
跟蹤28979進程的全部系統調用(-e trace=all),並統計系統調用的花費時間,以及開始時間(並以可視化的時分秒格式顯示),最後將記錄結果存在output.txt文件裏面。socket

用strace調試程序分析過程以下:ide

在理想世界裏,每當一個程序不能正常執行一個功能時,它就會給出一個有用的錯誤提示,告訴你在足夠的改正錯誤的線索。但遺憾的是,咱們不是生活在理想世界 裏,起碼不老是生活在理想世界裏。有時候一個程序出現了問題,你沒法找到緣由。
這就是調試程序出現的緣由。strace是一個必不可少的 調試工具,strace用來監視系統調用。你不只能夠調試一個新開始的程序,也能夠調試一個已經在運行的程序(把strace綁定到一個已有的PID上 面)。
下面讓咱們看一個真實的例子:啓動KDE時出現問題
在 啓動KDE的時候出了問題,KDE的錯誤信息沒法給我任何有幫助的線索。工具

_KDE_IceTransSocketCreateListener: failed to bind listener
_KDE_IceTransSocketUNIXCreateListener: ...SocketCreateListener() failed
_KDE_IceTransMakeAllCOTSServerListeners: failed to create listener for local
Cannot establish any listening sockets DCOPServer self-test failed.

對 我來講這個錯誤信息沒有太多意義,只是一個對KDE來講相當重要的負責進程間通訊的程序沒法啓動。我還能夠知道這個錯誤和ICE協議(Inter Client Exchange)有關,除此以外,我不知道什麼是KDE啓動出錯的緣由。
決定採用strace看一下在啓動 dcopserver時到底程序作了什麼:unix

strace -f -F -o ~/dcop-strace.txt dcopserver

命令參數說明以下:
這裏 -f -F選項告訴strace同時跟蹤fork和vfork出來的進程,-o選項把全部strace輸出寫到~/dcop-strace.txt裏 面,dcopserver是要啓動和調試的程序。調試

再次出現錯誤以後,我檢查了錯誤輸出文件dcop-strace.txt,文件裏有不少 系統調用的記錄。在程序運行出錯前的有關記錄以下:code

27207 mkdir("/tmp/.ICE-unix", 0777) = -1 EEXIST (File exists)
27207 lstat64("/tmp/.ICE-unix", {st_mode=S_IFDIR|S_ISVTX|0755, st_size=4096, ...}) = 0
27207 unlink("/tmp/.ICE-unix/dcop27207-1066844596") = -1 ENOENT (No such file or directory)
27207 bind(3, {sin_family=AF_UNIX, path="/tmp/.ICE-unix/dcop27207-1066844596"}, 38) = -1 EACCES (Permission denied)
27207 write(2, "_KDE_IceTrans", 13) = 13
27207 write(2, "SocketCreateListener: failed to "..., 46) = 46
27207 close(3) = 0 27207 write(2, "_KDE_IceTrans", 13) = 13
27207 write(2, "SocketUNIXCreateListener: ...Soc"..., 59) = 59
27207 umask(0) = 0 27207 write(2, "_KDE_IceTrans", 13) = 13
27207 write(2, "MakeAllCOTSServerListeners: fail"..., 64) = 64
27207 write(2, "Cannot establish any listening s"..., 39) = 39

其中第一行顯示程序試圖建立/tmp/.ICE-unix目錄,權限爲0777,這個操做由於目錄已經存在而失敗了。第二個系統調用(lstat64)檢查 了目錄狀態,並顯示這個目錄的權限是0755,這裏出現了第一個程序運行錯誤的線索:程序試圖建立屬性爲0777的目錄,可是已經存在了一個屬性爲 0755的目錄。第三個系統調用(unlink)試圖刪除一個文件,可是這個文件並不存在。這並不奇怪,由於這個操做只是試圖刪掉可能存在的老文件。
可是,第四行確認了錯誤所在。他試圖綁定到/tmp/.ICE-unix/dcop27207-1066844596,可是出現了拒絕訪問錯誤。. ICE_unix目錄的用戶和組都是root,而且只有全部者具備寫權限。一個非root用戶沒法在這個目錄下面創建文件,若是把目錄屬性改爲0777, 則前面的操做有可能能夠執行,而這正是第一步錯誤出現時進行過的操做。
server

因此我運行了chmod 0777 /tmp/.ICE-unix以後KDE就能夠正常啓動了,問題解決了,用strace進行跟蹤調試只須要花很短的幾分鐘時間跟蹤程序運行,而後檢查並分 析輸出文件。htm

原文出處以下:
https://www.linuxidc.com/Linux/2012-12/75671p2.htm進程

相關文章
相關標籤/搜索