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日). 

外部連結

參見