Linux(程序設計):39---strace系統調用檢測工具

一、什麼是監視調試

  • 有時,通過監視用戶空間中應用程序的運行情況,可以捕捉到一些小問題。監視程序同時也有助於確認驅動程序工作是否正常
  • 例如,查看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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章