straceLinux環境下的一款程式除錯工具,用來監察一個應用程式所使用的系統呼叫及它所接收的系統資訊。

用法及特性

編輯

最常見的用途是使用strace啟動程式,它會列印程式所呼叫的系統呼叫列表。這對於程式持續崩潰或行為不符合預期的情況非常有用:例如使用strace可能會顯示程式正在嘗試訪問一個不存在或無法讀取的檔案。

另一種應用是使用-p標誌使之列印一個正在執行行程的系統呼叫。當一個行程停止響應,該方法可以用於揭示停止響應的原因:例如行程正在嘗試進行網絡連接時被阻塞。

除此之外,strace還支援以下功能:

  • 指定應該被追蹤的系統呼叫名稱的過濾器(通過-e trace=option),過濾器可以是系統呼叫的名稱(如clone, fork, vfork)、預定義的組(如%ipc%file)或使用正則表達式語法(strace 4.17開始支援)(如-e trace=/clock_.*)。
  • 指定要被追蹤的路徑列表(如-P /etc/ld.so.cache)。
  • 指定應該被轉儲I/O的檔案描述子列表(-e read=-e write=選項)。
  • 計算系統呼叫執行時間和次數(-T-c-C-w選項;-U選項用於列印額外資訊,比如最小和最大系統呼叫執行時間)。
  • 列印相對或絕對時間戳(-t-r選項)。
  • 干擾正在執行的系統呼叫(-e inject=syscall specification:tampering specification選項):修改指定系統呼叫的返回值(:retval=;strace 4.16開始支援)和錯誤代碼(:error=;strace 4.15開始支援)、注入訊號(:signal=;strace 4.16開始支援)、延遲(:delay_enter=:delay_exit=;strace 4.22開始支援),並在其執行時修改由系統呼叫參數指向的數據(:poke_enter=:poke_exit=;strace 5.11開始支援)。
  • 提取有關檔案描述子的資訊(包括通訊端)(-y選項;-yy選項可以提供一些額外資訊,比如通訊端的端點地址,檔案的路徑和裝置的主/次編號)。
  • 列印堆疊資訊(Stack traces),包括符號解纏( symbol demangling,-k選項;strace 4.21開始支援)。
  • 按系統呼叫返回狀態過濾(-e status=option;strace 5.2開始支援)。
  • 執行線程、行程、行程群組和對談ID在跟蹤中的翻譯成strace的PID命名空間英語Linux_namespaces#Process_ID_(pid)--pidns-translation選項;strace 5.9開始支援)。
  • 解碼與行程、檔案和描述符相關的SELinux上下文資訊(--secontext選項;strace 5.12開始支援)。

strace支援解碼某些類別的ioctl命令的參數,例如BTRFS_*V4L2_*DM_*英語Device_mapperNSFS_*英語Linux_namespacesMEM*EVIO*英語EvdevKVM_*等;它還支援解碼各種netlink協定。

由於strace僅詳細說明系統呼叫,因此它無法像代碼除錯器(如GDB)那樣用於檢測問題。然而,它比代碼除錯器更易於使用,對於系統管理員來說是非常有用的工具。研究人員還通過記錄系統呼叫的資訊來實現系統呼叫重放(System call replay)。[1][2][3]

範例

編輯

以下是使用strace命令的輸出範例:

user@server:~$ strace ls
...
open(".", O_RDONLY|O_NONBLOCK|O_LARGEFILE|O_DIRECTORY|O_CLOEXEC) = 3
fstat64(3, {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
fcntl64(3, F_GETFD)                     = 0x1 (flags FD_CLOEXEC)
getdents64(3, /* 18 entries */, 4096)   = 496
getdents64(3, /* 0 entries */, 4096)    = 0
close(3)                                = 0
fstat64(1, {st_mode=S_IFIFO|0600, st_size=0, ...}) = 0
mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb7f2c000
write(1, "autofs\nbackups\ncache\nflexlm\ngames"..., 86autofsA

上面僅對在ls命令上執行時strace的輸出截取一小部分進行展示。該部分系統呼叫包括打開當前工作目錄、檢查並檢索其內容、最終將檔名列表寫入標準輸出。

類似工具

編輯

不同作業系統提供其他類似的除錯工具。下面例舉了一些類似的除錯工具:

參考文獻

編輯
  1. ^ Horky, Jiri. The ioapps IO profiler and IO traces replayer. 2013 [2013-09-16]. (原始內容存檔於2013-11-04). 
  2. ^ Waterland, Amos. The sreplay system call replayer. 2007 [2013-09-16]. (原始內容存檔於2016-04-01). 
  3. ^ Burton, Ariel. Workload characterization using lightweight system call tracing and reexecution (PDF). 1998 [2013-09-16]. (原始內容存檔 (PDF)於2024-04-23). 
  4. ^ XTrace - trace X protocol connections. xtrace.alioth.debian.org. [2014-08-12]. (原始內容存檔於2014-08-05). 
  5. ^ dtrace(1) Mac OS X Manual Page. Developer.apple.com. [2014-07-23]. (原始內容存檔於2016-04-05). 
  6. ^ IntellectualHeaven - Strace For Windows. intellectualheaven.com. [2015年1月29日]. (原始內容存檔於2016年3月5日). 

外部連結

編輯

參見

編輯