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