strace指令介紹
strace是個功能強大的Linux調試分析診斷工具,可用于跟蹤程式執行時程序系統調用(system call)和所接收的信号,尤其是針對源碼不可讀或源碼無法再編譯的程式。
在Linux系統中,使用者程式運作在一個沙箱(sandbox)裡,使用者程序不能直接通路計算機硬體裝置。當程序需要通路硬體裝置(如讀取磁盤檔案或接收網絡資料等)時,必須由使用者态模式切換至核心态模式,通過系統調用通路硬體裝置。
strace
可跟蹤程序産生的系統調用,包括參數、傳回值和執行所消耗的時間。若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
strace command
執行名稱為command的指令或程式并跟蹤系統調用
strace -p procid
strace -p procid
跟蹤ID為的procid的程序系統調用情況
strace -c -p procid
strace -c -p procid
統計ID為的procid的程序系統調用次數與用時,按
CTRL+C
結束統計,執行結果如下
[[email protected] ~]$ 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