strace命令介紹
strace是個功能強大的Linux調試分析診斷工具,可用於跟蹤程序執行時進程系統調用(system call)和所接收的信號,尤其是針對源碼不可讀或源碼無法再編譯的程序。
在Linux系統中,用戶程序運行在一個沙箱(sandbox)裏,用戶進程不能直接訪問計算機硬件設備。當進程需要訪問硬件設備(如讀取磁盤文件或接收網絡數據等)時,必須由用戶態模式切換至內核態模式,通過系統調用訪問硬件設備。strace
可跟蹤進程產生的系統調用,包括參數、返回值和執行所消耗的時間。若strace沒有任何輸出,並不代表此時進程發生阻塞;也可能程序進程正在自己的沙箱裏執行某些不需要與系統其它部分發生通信的事情。strace
從內核接收信息,且無需以任何特殊方式來構建內核。
一個簡單例子來說明strace
命令的作用
- 我們先寫一個簡單的測試程序,源碼如下
#include <stdio.h>
#include <unistd.h>
int main(int argc, char** argv)
{
char buffer[256];
getcwd(buffer, 255);
printf(buffer);
return 0;
}
- 將上面源碼保存爲
test.c
文件,然後執行gcc test.c
命令進行編譯,編譯後生成a.out
可執行文件
gcc test.c
- 執行
./a.out
命令,輸出如下,測試程序僅僅獲取當前路徑進行輸出
/home/devl
- 執行
strace ./a.out
命令輸出的最後幾行如下
getcwd("/home/devl", 255) = 11
fstat(1, {st_mode=S_IFCHR|0620, ...}) = 0
mmap(NULL, 4096, PROT_READ|PROT_WRITE, ...) = 0x7f7f0a8b2000
write(1, "/home/devl", 10/home/devl) = 10
exit_group(0) = ?
+++ exited with 0 +++
可以看到test.c
調用了getcwd
函數,傳入可用長度爲255的緩衝區,將11字節(包含字符串結束標誌)的/home/devl
內容複製到緩衝區中,然後調用write
函數將10個字符的/home/devl
寫入編號爲1
的文件中(編號爲文件實際上就是標準輸出設備stdout
)。
常用命令
strace command
執行名稱爲command的命令或程序並跟蹤系統調用
strace -p procid
跟蹤ID爲的procid的進程系統調用情況
strace -c -p procid
統計ID爲的procid的進程系統調用次數與用時,按CTRL+C
結束統計,執行結果如下
[work@xungen ~]$ strace -c -p 27637
strace: Process 27637 attached
strace: Process 27637 detached
% time seconds usecs/call calls errors syscall
------ ----------- ----------- --------- --------- ----------------
99.26 0.091733 30578 3 accept
0.73 0.000671 224 3 epoll_ctl
0.01 0.000010 2 6 setsockopt
------ ----------- ----------- --------- --------- ----------------
100.00 0.092414 12 total