9.11 strace:跟蹤進程的系統調用 、ltrace:跟蹤進程調用庫函數


 strace

  是Linux環境下的一款程序調試工具,用於檢查一個應用程序所使用的系統調用以及它所接收的系統信息。strace會追蹤程序運行時的整個生命周期,輸出每一個系統調用的名字、參數、返回值和執行所消耗的時間等,是高級運維和開發人員排查問題的殺手銅。 

strace命令的參數選項及說明

 
-c    統計每一個系統調用所執行的時間、次數和出錯的次數等
-d    輸出strace關於標准錯誤的調試信息
-f    跟蹤目標進程,以及目標進程創建的所有子進程
-ff   如果提供-o filename,則將所有進程的跟蹤結果輸出到相應的filename.pid中,pid是各進程的進程號
-i    輸出系統調用的入口指針
-q    禁止輸出關於脫離的消息
-r    輸出每一個系統調用的相對時間
-t    在輸出中的每一行前加上時間信息。例如16:4528
-tt   在輸出中的每一行前加上時間信息,精確到微秒。例如11:1859.759546端
-ttt  在輸出中的每一行前加上時間信息,精確到微秒,而且時間表示為UNIX時間戳。例如1486111461.650434
-T    顯示每次系統調用所花費的時間
-v    對於某些相關調用,把完整的環境變量、文件stat結構等打印出來
-x    以十六進制形式輸出非標准字符率
-xx   所有字符串以十六進制形式輸出
 
-e expr 輸出過濾器,通過表達式,可以過濾掉你不想要的輸出
        expr是一個表達式,用於控制如何跟蹤:[qualifier=][!][valuel[,value2]..
        說明:
        ①qualifier 只能是trace、abbrev、verbose、raw、signal、read、write其中之一
        ②value是用來限定的符號或數字
        ③默認的qualifier是trace
        ④感嘆號是否定符號
        例如:
        -e open等價於-e trace=open,表示只跟蹤open調用
        而-e trace!=open表示跟蹤除了open以外的其他調用
        常見選項:
        -e trace=[set]    只跟蹤指定的系統調用
        -e trace=file     只跟蹤與文件操作有關的系統調用
        -e trace=process  只跟蹤與進程控制有關的系統調用
        -e trace-network  只跟蹤與網絡有關的系統調用
        -e trace=signal   只跟蹤與系統信號有關的系統調用
        -e trace=desc     只跟蹤與文件描述符有關的系統調用
        -e trace=ipc      只跟蹤與進程通信有關的系統調用
        -e abbrev=[set]   設定strace輸出的系統調用的結果集
        -e raw=[set]      將指定的系統調用的參數以十六進制顯示
        -e signal=[set]   指定跟蹤的系統信號
        -e read=[set]     輸出從指定文件中讀出的數據
        -e write=[set]    輸出寫入到指定文件中的數據
 
-o filename    將strace的輸出寫入文件filename
-p pid         指定要跟蹤的進程pid,要同時跟蹤多個pid,重復多次p選項即可*
-s strsize     指定輸出的字符串的最大長度,默認為32。並沒有將文件名視為字符串,默認全部輸出
-u username    以usemame的UID和GID執行所跟蹤的命令

 

 

排查Nginx403 forbidden錯誤

strace -tt -f /applicatton/nginx/sbin/nginx
 
 
 

只跟蹤與文件操作有關的系統調用

 strace -tt -f -e trace=file /application/nginx/sbin/nginx    #只跟綜與文件操作有關的系統調用。
 
 

通過pid 跟蹤進程

 
[root@bzhl ~]# pgrep nginx
1884
7785
7786
7787
 
[root@bzhl ~]# pstree -p 1884
nginx(1884)─┬─nginx(7785)
            ├─nginx(7786)
            └─nginx(7787)
 
[root@bzhl ~]# strace -tt -f -e trace=file -p 7785
strace: Process 7785 attached 

跟蹤系統調用統計

 strace不僅能夠追蹤系統調用,使用選項-c還能對進程所有的系統調用做一個統計分析。 
[root@bzhl ~]# which nginx
/usr/bin/nginx
[root@bzhl ~]# strace -c /usr/bin/nginx
% time     seconds  usecs/call     calls    errors syscall
------ ----------- ----------- --------- --------- ----------------
22.33    0.001129           7       153        52 open
15.55    0.000786           6       123           close
10.80    0.000546           6        95           mmap
  8.53    0.000431          13        32           write
  7.66    0.000387          10        39           read
  6.47    0.000327           7        48           mprotect
  5.38    0.000272          12        22           munmap
  4.35    0.000220           3        87           fstat
  3.20    0.000162          32         5           nanosleep
  2.87    0.000145           8        19           socket
  2.67    0.000135           4        38           pread64
  2.29    0.000116          29         4         4 connect
  1.19    0.000060           4        15        15 bind
  1.03    0.000052           3        16         5 stat
  1.03    0.000052           9         6           getdents
  0.99    0.000050           3        15           setsockopt
  0.65    0.000033          11         3           openat
  0.63    0.000032           2        15           ioctl
  0.63    0.000032           5         6         6 mkdir
  0.47    0.000024           2        12           fcntl
  0.16    0.000008           8         1           statfs
  0.14    0.000007           7         1         1 readlink
  0.10    0.000005           5         1           epoll_create
  0.08    0.000004           2         2           rt_sigaction
  0.08    0.000004           2         2           uname
  0.08    0.000004           2         2           gettimeofday
  0.08    0.000004           4         1           futex
  0.06    0.000003           3         1           poll
  0.06    0.000003           3         1           lseek
  0.06    0.000003           2         2           getrlimit
  0.06    0.000003           3         1           getppid
  0.06    0.000003           3         1           sched_getaffinity
  0.04    0.000002           1         2           brk
  0.04    0.000002           2         1           rt_sigprocmask
  0.04    0.000002           2         1           getuid
  0.04    0.000002           2         1           arch_prctl
  0.04    0.000002           2         1           set_tid_address
  0.04    0.000002           2         1           set_robust_list
  0.02    0.000001           1         1           geteuid
  0.00    0.000000           0         1         1 access
  0.00    0.000000           0         1           execve
------ ----------- ----------- --------- --------- ----------------
100.00    0.005055                   779        84 total

     上面的結果將清楚地告訴我們調用了哪些系統函數,調用的次數是多少,消耗了多少時間等信息,這對我們分析程序來說是非常有用的。 

 

重定向輸出。

 strace -c -o tongji.log /application/nginx/sbin/nginx  #用 -o 選項將strace的結果輸出到文件中 

對系統調用進行計時

 strace -T /application/nginx/sbin/ngirnx    #<=使用選項-T將每個系統調用所花費的時間打印出來,每個調用的時間花費在調用行最右邊的尖括導里面。 
 
小結:strace命令很適合處埋程序僵屍、命令執行報錯等問題,如果從程序日志和系統日志中看不出問題出現的原因,則可以strace一下,也許會有答案,不過也需要使用者有足夠的耐心去查看輸出! 
 

ltrace:跟蹤進程調用庫函數

ltrace 能夠跟蹤進程的庫函數調用,它會顯現出調用了哪個庫函數,而 strace則是跟蹤進程的每個系統調用。 

ltrace命令的參數選項及說明

-c    統計庫函數每次調用的時間,最后程序退出時打印摘要
-C    解碼低級別名稱(內核級)為用戶級名稱
-d    打印調試信息
-e expr    輸出過濾器,通過表達式,可以過濾掉你不想要的輸出
          -e printf  表示只查看printf函數調用
          -e !printf 表示查看除printf函數以外的所有函數調用
-f         跟蹤子進程
-o filename   將ltrace的輸出寫入文件filename
-p pid     指定要跟蹤的進程pid
-r         輸出每一個調用的相對時間
-S         顯示系統調用
-t         在輸出中的每一行前加上時間信息。例如16:4528
-tt        在輸出中的每一行前加上時間信息,精確到微秒。例如11:1859.759546
-ttt       在輸出中的每一行前加上時間信息,精確到微秒,而且時間表示為UNIX時間截。例如1486111461.650434
-T          顯示每次調用所花費的時間
-u username 以username的UID和GID執行所跟蹤的命令

  

Itrace使用
ltrace的用法與strace非常相似,選項功能也是類似
[root@bzhl ~]# ltrace /usr/bin/nginx
 
通過pid 跟蹤進程調用庫函數。
 
[root@bzhl ~]# pgrep nginx
1884
7785
7786
7787
 
[root@bzhl ~]# ltrace -p 1884 
 
 
 
 
 
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM