天天看點

strace指令

strace - trace system calls and signals 

usage: strace [-dffhiqrtttTvVxx] [-a column] [-e expr] ... [-o file] 

              [-p pid] ... [-s strsize] [-u username] [-E var=val] ... 

              [command [arg ...]] 

   or: strace -c [-e expr] ... [-O overhead] [-S sortby] [-E var=val] ... 

1。 -c -- count time, calls, and errors for each syscall and report summary 

為每個系統調用計算時間、調用、錯誤,并報告摘要 

2。 -f -- follow forks, -ff -- with output into separate files 

-f 跟蹤fork的程序;-ff 把輸出定向到獨立的檔案 

3。 -F -- attempt to follow vforks, -h -- print help message 

-F 嘗試跟蹤vfork的程序,當今平台與-f功能相同;-h 列印幫助資訊 

4。 -i -- print instruction pointer at time of syscall 

在系統調用時,列印指令指針 

5。 -q -- suppress messages about attaching, detaching, etc. 

抑制附加、分離等資訊 

6。 -r -- print relative timestamp, -t -- absolute timestamp, -tt -- with usecs 

-r 列印相對時間戳;-t 絕對時間戳;-tt 微秒 

7。 -T -- print time spent in each syscall, -V -- print version 

-T 列印每個系統調用的時間花費;-V 列印版本 

8。 -v -- verbose mode: print unabbreviated argv, stat, termio[s], etc. args 

-v 詳細模式,列印非簡略的參數、狀态、termio[s]等 

9。 -x -- print non-ascii strings in hex, -xx -- print all strings in hex 

-x 列印非ascii的字元串為16進制;-xx 列印所有的字元串為16進制 

10。-a column -- alignment COLUMN for printing syscall results (default 40) 

對系統調用結果對齊列(預設為40列) 

11。-e expr -- a qualifying expression: option=[!]all or option=[!]val1[,val2]... 

    options: trace, abbrev, verbose, raw, signal, read, or write 

在-e後附表達式。一個合格的表達式:選項=[!]所有 或者 選項=[!]值1[,值2]....;可選項:跟蹤、縮寫、冗長、原始的東東、信号、讀、寫。 

12 -o file -- send trace output to FILE instead of stderr 

發送跟蹤輸出到檔案,而不是stderr 

13。-O overhead -- set overhead for tracing syscalls to OVERHEAD usecs 

設定跟蹤系統調用的最大時間 

14。-p pid -- trace process with process id PID, may be repeated 

跟蹤值為ID的程序,可以重複多個哦(注:最多32個) 

15。-s strsize -- limit length of print strings to STRSIZE chars (default 32) 

限制列印字元串的最大長度,預設為32位元組 

16。-S sortby -- sort syscall counts by: time, calls, name, nothing (default time) 

排序,以系統調用過程中的時間、或者調用名等作為排序項。 

17。-u username -- run command as username handling setuid and/or setgid 

以其他使用者名或者組名運作指令 

18。-E var=val -- put var=val in the environment for command 

設定環境變量 

19。-E var -- remove var from the environment for command 

清除環境變量 

========================================================

1。檢視CPU運作時間 

[guest@localhost tmp]$ strace -c ./b.out         

% time     seconds usecs/call     calls    errors syscall 

------ ----------- ----------- --------- --------- ---------------- 

42.72    0.000692          87         8           open 

38.40    0.000622         622         1           set_thread_area 

16.85    0.000273         137         2           munmap 

   2.04    0.000033           5         7           read 

   0.00    0.000000           0         8           close 

   0.00    0.000000           0         1           execve 

   0.00    0.000000           0         1           access 

   0.00    0.000000           0         3           brk 

   0.00    0.000000           0         4           mprotect 

   0.00    0.000000           0        17           mmap2 

   0.00    0.000000           0         7           fstat64 

100.00    0.001620                    59           total 

2。檢視相對運作時間 

[guest@localhost tmp]$ strace -r ./b.out 

0.000560 mprotect(0xb91000, 8192, PROT_READ) = 0 

     0.000196 mprotect(0x45c000, 4096, PROT_READ) = 0 

     0.000884 mprotect(0x42a000, 16384, PROT_READ) = 0 

     0.000191 mprotect(0xa4a000, 4096, PROT_READ) = 0 

     0.000144 munmap(0xb7f12000, 45307) = 0 

     0.000577 brk(0)                    = 0x8c2b000 

     0.000171 brk(0x8c4c000)            = 0x8c4c000 

     0.000183 open("sleeper.cpp", O_RDONLY|O_LARGEFILE) = 3 

     0.000225 read(3, "#include <unistd.h>\n#include <io"..., 8191) = 355 

     0.000372 read(3, "", 8191)         = 0 

     0.000298 close(3)                  = 0 

     0.000192 exit_group(0)             = ? 

3。檢視檔案變動相關的信号 

[guest@localhost tmp]$ strace -e trace=desc ./b.out 

open("/etc/ld.so.preload", O_RDONLY)    = 3 

fstat64(3, {st_mode=S_IFREG|0444, st_size=17, ...}) = 0 

close(3)                                = 0 

open("/lib/libcwait.so", O_RDONLY)      = 3 

read(3, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0\20\3\0\0004\0\0\0"..., 512) = 512 

fstat64(3, {st_mode=S_IFREG|0755, st_size=2572, ...}) = 0 

open("/etc/ld.so.cache", O_RDONLY)      = 3 

fstat64(3, {st_mode=S_IFREG|0644, st_size=45307, ...}) = 0 

open("/usr/lib/libstdc++.so.6", O_RDONLY) = 3 

read(3, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0P\2348\0004\0\0\0"..., 512) = 512 

fstat64(3, {st_mode=S_IFREG|0755, st_size=936908, ...}) = 0 

open("/lib/libm.so.6", O_RDONLY)        = 3 

4。strace -o output.txt -T -tt -e trace=all -p 28979

上面的含義是 跟蹤28979程序的所有系統調用(-e trace=all),并統計系統調用的花費時間,以及開始時間(并以可視化的時分秒格式顯示),最後将記錄結果存在output.txt檔案裡面

5。檢視程序是否卡住

strace -p 36699

Process 36699 attached - interruptto quit

futex(0x22d8400, FUTEX_WAIT_PRIVATE, 0, NULL

# 到這裡沒有任何輸出 一直挂起

6。尋找被程式讀取的配置檔案

stracephp 2>&1 | grepphp.ini

open("/usr/bin/php.ini", O_RDONLY) = -1 ENOENT (Nosuchfileor directory)

open("/etc/php.ini", O_RDONLY) = 3

lstat("/etc/php.ini", {st_mode=S_IFREG|0644, st_size=69345, ...}) = 0

7。跟蹤指定的系統調用

strace指令的-e選項僅僅被用來展示特定的系統調用(例如,open,write等等)

讓我們跟蹤一下cat指令的 open 系統調用。

stracecat /tmp/trace.2043925204.012003.xt | head

execve("/bin/cat", ["cat", "/tmp/trace.2043925204.012003.xt"], [/* 35 vars */]) = 0

brk(0) = 0x167f000

mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fb7d8991000

access("/etc/ld.so.preload", R_OK) = -1 ENOENT (Nosuchfileor directory)

open("/etc/ld.so.cache", O_RDONLY) = 3

fstat(3, {st_mode=S_IFREG|0644, st_size=74047, ...}) = 0

mmap(NULL, 74047, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7fb7d897e000

close(3) = 0

open("/lib64/libc.so.6", O_RDONLY) = 3

read(3, "\177ELF\2\1\1\3\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0p\356\1\0\0\0\0\0"..., 832) = 832

fstat(3, {st_mode=S_IFREG|0755, st_size=1920936, ...}) = 0

mmap(NULL, 3750152, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7fb7d83df000

mprotect(0x7fb7d8569000, 2097152, PROT_NONE) = 0

mmap(0x7fb7d8769000, 20480, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x18a000) = 0x7fb7d8769000

...

8。 統計概要

它包括系統調用的概要,執行時間,錯誤等等。使用-c選項能夠以一種整潔的方式展示:

strace -c ls

environments generate githooks hieradata manifests master modules README.md

% time seconds usecs/call calls errors syscall

------ ----------- ----------- --------- --------- ----------------

0.00 0.000000 0 10 read

0.00 0.000000 0 1 write

0.00 0.000000 0 12 open

0.00 0.000000 0 14 close

0.00 0.000000 0 12 fstat

0.00 0.000000 0 28 mmap

9。解決庫依賴問題

下一篇: 排序算法

繼續閱讀