strace
用法及特性
編輯最常見的用途是使用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命名空間(
--pidns-translation
選項;strace 5.9開始支援)。 - 解碼與行程、檔案和描述符相關的SELinux上下文資訊(
--secontext
選項;strace 5.12開始支援)。
strace支援解碼某些類別的ioctl命令的參數,例如BTRFS_*、V4L2_*、DM_*、NSFS_*、MEM*、EVIO*、KVM_*等;它還支援解碼各種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
的輸出截取一小部分進行展示。該部分系統呼叫包括打開當前工作目錄、檢查並檢索其內容、最終將檔名列表寫入標準輸出。
類似工具
編輯不同作業系統提供其他類似的除錯工具。下面例舉了一些類似的除錯工具:
- Linux提供ltrace命令,可以跟蹤庫呼叫,xtrace可以跟蹤X Window程式,[4]還有SystemTap、perf,以及擴充ftrace的trace-cmd和KernelShark。
- AIX提供truss命令。
- HP-UX提供Tusc命令。
- Solaris / Illumos有truss和DTrace。
- UnixWare提供truss命令。
- FreeBSD提供truss命令、Ktrace和DTrace。
- NetBSD提供Ktrace和DTrace。
- OpenBSD使用Ktrace和kdump。
- macOS提供Ktrace(10.4及更早版本),DTrace(來自Solaris)和在10.5及更高版本中提供的相關dtruss。[5]
- Microsoft Windows有一個類似的工具稱為StraceNT,由Pankaj Garg編寫,[6]以及一個類似的GUI工具稱為Process Monitor,由Sysinternals開發。
參考文獻
編輯- ^ Horky, Jiri. The ioapps IO profiler and IO traces replayer. 2013 [2013-09-16]. (原始內容存檔於2013-11-04).
- ^ Waterland, Amos. The sreplay system call replayer. 2007 [2013-09-16]. (原始內容存檔於2016-04-01).
- ^ Burton, Ariel. Workload characterization using lightweight system call tracing and reexecution (PDF). 1998 [2013-09-16]. (原始內容存檔 (PDF)於2024-04-23).
- ^ XTrace - trace X protocol connections. xtrace.alioth.debian.org. [2014-08-12]. (原始內容存檔於2014-08-05).
- ^ dtrace(1) Mac OS X Manual Page. Developer.apple.com. [2014-07-23]. (原始內容存檔於2016-04-05).
- ^ IntellectualHeaven - Strace For Windows. intellectualheaven.com. [2015年1月29日]. (原始內容存檔於2016年3月5日).
外部連結
編輯- starce的幫助檔案(頁面存檔備份,存於互聯網檔案館) (英文)
參見
編輯這是一篇與Linux相關的小作品。您可以透過編輯或修訂擴充其內容。 |