本篇文章給大家?guī)砹薼inux命令動態(tài)追蹤工具的相關知識,其中主要介紹工作中常用的動態(tài)追蹤工具strace、arthas、bpftrace等。希望對大家有幫助。
線程與內(nèi)存剖析,只能觀測到進程的整體情況,有些時候我們需要觀測到某一方法級別,比如調(diào)用方法test()時,傳入的參數(shù)是什么,返回值是多少,花費了多少時間?這種情況下,我們就需要使用一些動態(tài)追蹤工具了,如strace、arthas、bpftrace、systemtap等。
strace與ltrace
strace是Linux中用來觀測系統(tǒng)調(diào)用的工具,學過操作系統(tǒng)原理都知道,操作系統(tǒng)向應用程序暴露了一批系統(tǒng)調(diào)用接口,應用程序只能通過這些系統(tǒng)調(diào)用接口來訪問操作系統(tǒng),比如申請內(nèi)存、文件或網(wǎng)絡io操作等。
用法如下:
# -T 打印系統(tǒng)調(diào)用花費的時間 # -tt 打印系統(tǒng)調(diào)用的時間點 # -s 輸出的最大長度,默認32,對于調(diào)用參數(shù)較長的場景,建議加大 # -f 是否追蹤fork出來子進程的系統(tǒng)調(diào)用,由于服務端服務普通使用線程池,建議加上 # -p 指定追蹤的進程pid # -o 指定追蹤日志輸出到哪個文件,不指定則直接輸出到終端 $ strace -T -tt -f -s 10000 -p 87 -o strace.log
實例:抓取實際發(fā)送的SQL
有些時候,我們會發(fā)現(xiàn)代碼中完全沒問題的SQL,卻查不到數(shù)據(jù),這極有可能是由于項目中一些底層框架改寫了SQL,導致真實發(fā)送的SQL與代碼中的SQL不一樣。
遇到這種情況,先別急著扒底層框架代碼,那樣會比較花時間,畢竟程序員的時間很寶貴,不然要加