1. 程式人生 > 其它 >迅為3399開發板Android系統-使用strace跟蹤系統呼叫

迅為3399開發板Android系統-使用strace跟蹤系統呼叫

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