1 什么是 strace strace 常用來跟蹤進程執行時的系統調用和所接收的信號。在 Linux 世界,進程不能直接訪問硬件設備,當進程需要訪問硬件設備(比如讀取磁盤文件,接收網絡數據等等)時,必須由用戶態模式切換至內核態模式,通過系統調用訪問硬件設備。 strace 可以跟蹤到一個進程產生的系統調用,包括參數,返回值,執行消耗的時間。 2 什么是系統調用 系統調用(英語:system call),又稱為系統呼叫,指運行在用戶空間的程序向操作系統內核請求需要更高權限運行的服務。系統調用提供用戶程序與操作系統之間的接口。操作系統的進程空間分為用戶空間和內核空間: 操作系統內核直接運行在硬件上,提供設備管理、內存管理、任務調度等功能。 用戶空間通過 API 請求內核空間的服務來完成其功能——內核提供給用戶空間的這些 API, 就是系統調用 Linux 內核目前有 300 多個系統調用,詳細的列表可以通過 syscalls 手冊頁查看。這些系統調用主要分為幾類: 文件和設備訪問類 比如 open/close/read/write/chmod 等 進程管理類 fork/clone/execve/exit/getpid 等 信號類 signal/sigaction/kill 等 內存管理 brk/mmap/mlock 等 進程間通信 IPC shmget/semget * 信號量,共享內存,消息隊列等 網絡通信 socket/connect/sendto/sendmsg 等 其他 查看系統調用幫助手冊 man 2 函數名,例如下圖所示: ![]() 3 strace 的應用場景 基于特定的系統調用或系統調用組進行過濾 通過統計特定系統調用的使用次數,所花費的時間,以及成功和錯誤的數量來分析系統調用的使用。 它跟蹤發送到進程的信號。 通過 pid 附加到任何正在運行的進程。 調試性能問題,查看系統調用的頻率,找出耗時的程序段 查看程序讀取的是哪些文件從而定位比如配置文件加載錯誤問題 當程序出現“Out of memory”時被系統發出的 SIGKILL 信息所 kill 另外因為 strace 拿到的是系統調用相關信息,一般也即是 IO 操作信息,這個對于排查比如 cpu 占用 100%問題是無能為力的。這個時候就可以使用 GDB 工具了。 4 命令參數 我們輸入以下命令,可以查看 strace 命令的參數。 strace -h -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. 5 實用示例 1 跟蹤已經在運行的進程,使用-p 選項能用在運行的進程上,輸入以下命令: strace -p 進程號 2 通過 strace 啟動要跟蹤的進程,./hello.sh 是要運行的文件,大家可以根據自己的需求自定義,如下所示: strace ./hello.sh ![]() |