天天看點

程序照妖鏡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

結束統計,執行結果如下

[[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
           

繼續閱讀