一、什麼是監視調試
- 有時,通過監視用戶空間中應用程序的運行情況,可以捕捉到一些小問題。監視程序同時也有助於確認驅動程序工作是否正常
- 例如,查看scull的read實現如何響應不同數據量的read請求,就可以判斷它是否工作正常
- 有許多方法可用來監視用戶空間程序的工作情況,比如使用調試器,或者在strace狀態下運行程序等。在檢查內核代碼時,strace技術最值得關注
二、strace工具介紹
- 功能:
- strace命令是一個功能非常強大的工具,它可以顯示由用戶空間程序所發出的所有系統調用
- 它不僅可以顯示調用。而且還能顯示調用參數以及用符號形式表示的返回值。當系統調用失敗時,錯誤的符號值(如ENOMEM)和對應的字符串(如“Out of memory”)都能被顯示出來
- strace將跟蹤信息打印到stderr上
- gdb等調試器可以連接到一個正在運行的進程並控制該進程,strace也可以跟蹤一個正在運行的進程
- 格式如下:
strace [-CdffhikqrtttTvVxxy] [-I n] [-b execve] [-e expr]...
[-a column] [-o file] [-s strsize] [-P path]... [-p pid]...
{ -p pid | [-D] [-E var[=val]]... [-u username] command [args] }
strace -c [-df] [-I n] [-b execve] [-e expr]... [-O overhead]
[-S sortby] [-P path]... [-p pid]... { -p pid | [-D]
[-E var[=val]]... [-u username] command [args] }
- 參數:
- -c:統計每一系統調用的所執行的時間,次數和出錯的次數等.
- -d:輸出strace關於標準錯誤的調試信息.
- -f:跟蹤由fork調用所產生的子進程.
- -ff:如果提供-o filename,則所有進程的跟蹤結果輸出到相應的filename.pid中,pid是各進程的進程號.
- -F:嘗試跟蹤vfork調用.在-f時,vfork不被跟蹤.
- -h:輸出簡要的幫助信息.
- -i:輸出系統調用的入口指針.
- -q:禁止輸出關於脫離的消息.
- -r:打印出相對時間關於,,每一個系統調用.
- -t:在輸出中的每一行前加上時間信息.
- -tt:在輸出中的每一行前加上時間信息,微秒級.
- -ttt:微秒級輸出,以秒了表示時間.
- -T:顯示每一調用所耗的時間.
- -v:輸出所有的系統調用.一些調用關於環境變量,狀態,輸入輸出等調用由於使用頻繁,默認不輸出.
- -V:輸出strace的版本信息.
- -x:以十六進制形式輸出非標準字符串
- -xx:所有字符串以十六進制形式輸出.
- -a column:設置返回值的輸出位置.默認 爲40.
- -e expr:指定一個表達式,用來控制如何跟蹤
- 格式如下:[qualifier=][!]value1[,value2]...qualifier只能是 trace,abbrev,verbose,raw,signal,read,write其中之一.value是用來限定的符號或數字.默認的 qualifier是 trace.感嘆號是否定符號.
- 例如:-eopen等價於 -e trace=open,表示只跟蹤open調用.而-etrace!=open表示跟蹤除了open以外的其他調用.有兩個特殊的符號 all 和 none.
- 注意有些shell使用!來執行歷史記錄裏的命令,所以要使用\\.
- -e trace=set:只跟蹤指定的系統 調用.例如:-e trace=open,close,rean,write表示只跟蹤這四個系統調用.默認的爲set=all.
- -e trace=file:只跟蹤有關文件操作的系統調用.
- -e trace=process:只跟蹤有關進程控制的系統調用.
- -e trace=network:跟蹤與網絡有關的所有系統調用.
- -e strace=signal:跟蹤所有與系統信號有關的 系統調用
- -e trace=ipc:跟蹤所有與進程通訊有關的系統調用
- -e abbrev=set:設定 strace輸出的系統調用的結果集.-v 等與 abbrev=none.默認爲abbrev=all.
- -e raw=set:將指 定的系統調用的參數以十六進制顯示.
- -e signal=set:指定跟蹤的系統信號.默認爲all.如 signal=!SIGIO(或者signal=!io),表示不跟蹤SIGIO信號.
- -e read=set:輸出從指定文件中讀出 的數據.例如:
- -e read=3,5:
- -e write=set:輸出寫入到指定文件中的數據.
- -o filename:將strace的輸出寫入文件filename
- -p pid:跟蹤指定的進程pid.
- -s strsize:指定輸出的字符串的最大長度.默認爲32.文件名一直全部輸出.
- -u username:以username 的UID和GID執行被跟蹤的命令
- 總結:
- 我們可以在strace的輸出中發現很多有用信息,但如果覺得這些符號過於拖累的話,則可以僅限於監視文件方法(read、write等)的工作成功
- strace對於查找系統調用運行時的細微錯誤最爲有用,例如確切查明系統調用的哪個參數引發了錯誤
三、演示案例
- 下面我們啓動一個Nginx進程
- 輸入下面的命令監控Nginx工作進程,然後按下ctrl+c終止strace程序並打印信息
sudo strace -c -p 28657