進程照妖鏡strace命令

strace命令介紹

strace是個功能強大的Linux調試分析診斷工具,可用於跟蹤程序執行時進程系統調用(system call)和所接收的信號,尤其是針對源碼不可讀或源碼無法再編譯的程序。

在Linux系統中,用戶程序運行在一個沙箱(sandbox)裏,用戶進程不能直接訪問計算機硬件設備。當進程需要訪問硬件設備(如讀取磁盤文件或接收網絡數據等)時,必須由用戶態模式切換至內核態模式,通過系統調用訪問硬件設備。strace可跟蹤進程產生的系統調用,包括參數、返回值和執行所消耗的時間。若strace沒有任何輸出,並不代表此時進程發生阻塞;也可能程序進程正在自己的沙箱裏執行某些不需要與系統其它部分發生通信的事情。strace從內核接收信息,且無需以任何特殊方式來構建內核。

一個簡單例子來說明strace命令的作用

  1. 我們先寫一個簡單的測試程序,源碼如下
#include <stdio.h>
#include <unistd.h>

int main(int argc, char** argv)
{
	char buffer[256];

	getcwd(buffer, 255);

	printf(buffer);

	return 0;
}

  1. 將上面源碼保存爲test.c文件,然後執行gcc test.c命令進行編譯,編譯後生成a.out可執行文件
gcc test.c
  1. 執行./a.out命令,輸出如下,測試程序僅僅獲取當前路徑進行輸出
/home/devl
  1. 執行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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章