strace 顯示使用者空間程式發出的所有系統呼叫、參數與回傳值,是除錯利器。常用參數:-f 追蹤子行程、-o file 輸出至檔案、-e 系統呼叫 過濾特定呼叫(如 -e execve)。
truss -f -o clint.truss clint → 尾端顯示 stat("/root/.clint/plugins") ERR#2 'No such file or directory' → 建立缺失目錄 mkdir -p /root/.clint/plugins → 再追蹤發現仍缺 python 子目錄 → 全部建立後正常執行。
truss -f -D -o vim.truss vim(-D 顯示相對時間戳)→ 發現 connect(AF_INET 10.57.18.27:6000) 連線失敗 → nanosleep 睡 1 秒重試 → 循環十餘次 → 原因是 DISPLAY 環境變數指向遠端 X Server → 註解 .cshrc 中 setenv DISPLAY ${REMOTEHOST}:0 解決。
無 API 直接查詢。靈感來自 lsof:strace -o lsof.strace lsof -p PID → 搜尋 /tmp/foo 發現 readlink("/proc/PID/fd/3", "/tmp/foo") → /proc/PID/fd/ 下每個 fd 皆為指向實際檔案的符號連結 → 程式碼實作:
snprintf(buf, "/proc/%i/fd/%i", pid, fd); readlink(buf, pathname, n);
FreeBSD 5+ 預設未掛載 procfs,需 mount -t procfs proc /proc 或修改 /etc/fstab。