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相關的小作品。您可以透過編輯或修訂擴充其內容。 |