1. 程式人生 > >linux動態追蹤神器——Strace實例介紹【轉】

linux動態追蹤神器——Strace實例介紹【轉】

fork signal lin 通過 調用次數 命令 roc nal 說了

Strace是Linux下一款通用的進程動態跟蹤工具,用來追蹤程序執行時的系統調用和所接收的信號。其應用方法如下圖(部分)。

技術分享圖片

首先,簡單說說它的使用參數,Strace的參數包括輸出參數、過濾參數、統計參數、跟蹤參數、啟動參數和其他雜項。詳細的看幫助文檔或者搜索它的用法,我們只簡單介紹幾個常用的參數:

-p Pid 跟蹤指定的進程號的進程。

-o 文件 輸出追蹤信息到文件。

-f 跟蹤由fork調用所產生的子進程。

-e expr 表達式,用指定追蹤的方法,常見有:

-e trace=open,close,rean,write 跟蹤這四個系統函數的調用,默認的為set=all。

-e trace=file 跟蹤有關文件操作的系統調用。

-e trace=process 跟蹤進程調用。

-e trace=network 跟蹤網絡調用。

-e strace=signal 跟蹤所系統信號調用。

-e trace=ipc 跟蹤ipc通訊調用。

其他更多篩選公式略。。。

-d 輸出debug信息到標準錯誤輸出。

-c 統計功能,統計系統調用次數,時間和出錯次數等信息。

-t/r 輸出調用的絕對/相對時間戳。

-u 用戶名 追蹤特定用戶的進程。

1、查找實際加載的配置文件

常有人會問我,為什麽我的配置改了,實際沒生效。我問他你改完重啟了麽,哦,忘了。過了一會又來問,哥我重啟了,還是一樣沒效果。我問你改的那個文件?他說,找網上百度的,不知道為啥不生效。

這個場景估計很多人都遇到過,那對付這類問題有沒有啥好的、一勞永逸的辦法,還是只憑經驗或者頻繁的問人老司機呢?

其實最好的一個方法,就是用strace追蹤下進程加載的文件,這裏面的加載的配置文件肯定就是真正使用的配置文件,修改這個文件,重啟就肯定生效了。

舉例,我們要找mysql的配置文件

strace -tf mysql 2>&1|grep cnf

技術分享圖片

結果如上圖,我們看出來了,實際的調用文件是/etc/my.cnf。

至於命令中的“2>&1” ,有認真的同學會有疑問,去掉可以麽?然後去試了,結果grep沒起作用,所有內容一股腦全出來了。為什麽如此呢?原來starce輸出結果是輸出到標準錯誤2的,當做debug信息了。而|管道傳遞給grep的只是標準輸出1 ,所以內容全部顯示了(標準錯誤),而grep 篩選沒起作用(標準輸出為空)。所以必須要加上“2>&1”,要把標準錯誤的信息先重定向到標準輸出1。這樣結果才對。

同樣的方法,適用於查找配置文件,加載類庫文件找不到等等。舉一反三嘗試好了。

2、追蹤耗時進程

如果你突然發現你的程序啟動很慢,或者占用cpu,內存等特別大;或者你發現系統負載很大,你通過top,ps等發現是某個進程導致,比如msyql程序;再者可能服務器被黑了,有個木馬進程占了很大資源。我們想進一步細化分析,究竟為啥mysql占的資源特別大?這個木馬進程都幹了什麽壞事?這時候祭出strace神器就ok了。

我們前面說了strace有統計參數,最簡單就是-c參數,對一個進程加-c參數,strace會統計程序系統調用的統計。會統計那些項呢?我們上面介紹-c參數時候說了,有系統調用、耗時、和錯誤次數。

統計mysql的調用如下圖:

技術分享圖片

看出來系統調用主要是調用nmap,這是和內存有關的。可以明確mysql主要在做內存操作。

我們再通過Pid動態跟蹤下,執行-c -p Pid 一段時間,ctrl+c退出,就有結果:

技術分享圖片

可見大部分時間在做pull調用。

3、綜合追蹤java耗時、內存泄露,debug錯誤等

1)首先查找最好資源的子進程:

top -H -p `ps aux|perl -lane ‘print $F[1] if $F[0]=~/tomcat/‘

技術分享圖片

2)用trace追蹤最耗時子進程

strace -p 31164

技術分享圖片

發現是futex進程同步線程時候,有大量鏈接超時。

3)結合jstack 追蹤代碼級別的問題

此子進程轉化為16進制,然後用jstack 分析,並搜索這個子進程的16進制,得到具體VM的具體debug信息,從而進一步做代碼排查。

技術分享圖片

好了,其實 strace有更多的擴展應用,網上有很多文章介紹可供學習參考。當然你可以根據自己實際的環境進一步深挖,發現更大的寶藏。

jstack使用方法參考

tomcat+java的web程序持續占cpu高問題調試【轉】 - paul_hch - 博客園 http://www.cnblogs.com/paul8339/p/7144736.html

Java線上應用故障排查之一:高CPU占用【轉】 - paul_hch - 博客園 http://www.cnblogs.com/paul8339/p/7464206.html

Java線上應用故障之CPU占用高排查與定位 - paul_hch - 博客園 http://www.cnblogs.com/paul8339/p/7591226.html

轉自

「安全工具」linux動態追蹤神器——Strace實例介紹 https://www.toutiao.com/i6521168589418922504/

linux動態追蹤神器——Strace實例介紹【轉】