使用 strace 命令了解 Linux 系統調用
桌面上運行的每個進程都使用系統調用與操作系統通信。 使用 strace,您可以輕松跟蹤此類系統調用。
當在 Linux 上運行的程序想要使用操作系統管理的資源(讀取文件、創建進程等)時,它們會對操作系統進行系統調用。 系統調用在內核級別工作并執行必要的操作,將控制權留回調用程序。strace 工具提供了在 Linux 上跟蹤這些系統調用的功能。
strace 命令的典型用法
要監視應用程序的系統調用,只需使用以下格式使用 strace 調用命令:
但是,通常有些進程開始得更早,并繼續在后臺工作。由于任何問題,您可能希望收集與此類進程關聯的其他信息。通過將進程的進程 ID 提供給 -p 參數,可以將 strace 附加到任何正在運行的應用程序:
輸出:
跟蹤應用程序的線程和分支
使用 strace,您可以使用 -f 標志檢查作為應用程序分支的所有線程和其他子進程。
輸出:
使用 strace 檢查某些系統調用
默認的 strace 輸出有時可能非常擁擠。如果只想跟蹤某些系統調用,可以使用 -e 參數執行此操作:
要僅跟蹤與文件操作相關的系統調用,請使用 -e trace=file:
要僅過濾與網絡相關的系統調用,請在命令中指定 -e trace=network:
以微秒為單位獲取精確時間信息
輸出系統調用時,可以使用 -t 參數獲取以秒為單位的精確時間信息。大多數情況下,精度不足以滿足您的需求。在這種情況下,可以使用 -tt 參數以微秒精度獲取時間信息:
收集有關系統調用的統計信息
使用 -c 參數,您可以根據需要收集有關系統調用的統計信息:
將日志保存到文件
如果長時間運行 strace,并希望稍后更詳細地檢查生成的日志,則需要保存日志。使用 -o 參數,您可以指定 strace 應在其中保存日志的文件:
跟蹤阻塞過程
使用 prctl 系統調用,Linux下的任何應用程序都可以防止自己被使用 ptrace 的非 root 用戶控制。如果應用程序通過 prctl 為自己清除 PR_SET_DUMPABLE 標志,則 root 以外的用戶將無法使用 ptrace 控制此應用程序,即使他們有權向應用程序發出信號。
此功能最典型的用途之一是在 OpenSSH 身份驗證代理軟件中看到的。因此,在用戶身份驗證時,可以防止另一個應用程序使用 ptrace 控制應用程序。
跟蹤和安全
由于在傳統的 Linux 進程模型中設置了 ptrace 工具,因此您與用戶一起在系統上運行的任何軟件都有權在其中插入惡意代碼。從最簡單的 xterm 工具到高級 Web 瀏覽器應用程序,此類惡意軟件可以控制所有其他正在運行的應用程序(這要歸功于 ptrace 系統調用),并在您不知不覺中復制重要信息。
為了應對許多用戶不知道的這種情況,已經使用Linux內核中名為Yama的安全模塊開發了一種保護機制。
您可以通過 /proc/sys/kernel/yama/ptrace_scope 文件控制對 ptrace 系統調用的響應。默認情況下,此文件寫入的值為 0。
以下值是可以接受的:
值 | 含義 |
0 | 常規行為:可以檢查所有有權跟蹤的應用程序。 |
1 | 受限跟蹤:只有應用程序的直接父級或具有 PR_SET_PTRACER 選項的應用程序允許的調試應用程序才具有控制權。因此,gdb program_name 和 strace program_name 的使用將繼續有效,但之后您將無法附加正在運行的應用程序。 |
2 | 跟蹤到系統管理員:只能控制具有已定義CAP_SYS_PTRACE屬性的應用程序或使用 prctl 定義PTRACE_TRACEME選項的子進程。 |
3 | 完全禁用:在任何情況下都不允許跟蹤。如果此屬性定義一次,則無法在運行時再次更改它。 |
許多開發人員不知道應用程序可以通過 prctl 禁用 ptrace,除了 root 用戶。盡管與安全相關的軟件(如 OpenSSH 代理)執行這些操作,但期望系統上運行的所有軟件都具有相同的行為是不對的。
最近,一些 Linux 發行版開始將上述 ptrace_scope 文件的默認值設置為 1。因此,在限制 ptrace 操作的情況下,整個系統提供了更安全的工作環境。
使用示例跟蹤
使用名稱 ministrace.c 注冊下面的示例應用程序。然后你可以用以下命令編譯它:
代碼:
編譯應用程序后,您可以使用 ministrace 運行任何命令并檢查輸出:
您可以將 strace 用于多種目的
Strace 可以幫助查找不必要地使用系統資源的程序中的錯誤。同樣,程序在使用操作系統資源時表現出的特征也可以通過 strace 顯示出來。
由于 strace 直接偵聽系統調用,因此無論正在運行的程序的代碼是打開還是關閉,它都可以揭示運行時動態。可以了解為什么程序在使用 strace 啟動時會拋出錯誤。
同樣,strace 可幫助您了解程序意外終止的原因。因此,熟悉 strace 在 Linux 內核開發和系統管理中非常重要。