LINUX 程式設計定位工具gstack,pstack

2022-06-17 18:42:17 字數 2717 閱讀 8686

pstack:

pstack命令可顯示每個程序的棧跟蹤。

pstack 命令必須由相應程序的屬主或 root 執行。

可以使用 pstack 來確定程序掛起的位置。

此命令允許使用的唯一選項是要檢查的程序的 pid。

pstack 看活動的程序內的堆疊

用法:root# pstack pid

gstack:

gstack -列印正在執行的程序的堆疊跟蹤

使用方法:

gstack pid

描述gstack連線到命令列中pid的活動程序

列印執行堆疊跟蹤。如果elf符號存在於二進位制(usu -)中

如果你沒有執行條帶(1),那麼這個例子就會被列印出來

同樣如此。

如果程序是執行緒組的一部分,那麼gstack將列印出乙個堆疊

對組中的每個執行緒進行跟蹤。

思路分析

我們知道gdb的bt(backtrace)可以列印函式呼叫棧,但需要手動敲命令執行,不能批量多次執行,似乎不太方便。有沒有更好的工具和方法搞定這個需求呢?有的,gstack就是一款用於方便檢視函式呼叫棧的工具。gstack的用途是「print a stack trace of a running process」,即列印乙個正在執行的程序的函式呼叫棧。下面以乙個正在執行的redis-server程序為例,執行gstack `pidof redis-server`即可看到該程序當前正在執行的3個執行緒各自的函式呼叫棧。這其實與gdb bt看到的差不多,而且我們的目標是只需要函式名,而不需要位址資訊,那麼gstack有沒有什麼引數可以去掉每行的位址,以精簡列印呢?

如下所示,gstack竟然沒有幫助,這不像是乙個正常的程式啊。用file `which gstack`檢視,果然,它只是乙個指令碼,並不是乙個正常的程式。

檢視/usr/bin/gstack指令碼源**,發現它其實只是包裝了gdb bt,並用sed對gdb bt的輸出結果做了過濾而已。如下給出gstack指令碼源**的解讀,該指令碼分為五部分:

第一部分:檢查是否提供乙個入參,如果入參數量不是1,則列印用法提示,並退出指令碼。

第二部分:檢查入參必須是乙個當前正在執行的程式的pid,如果不是,則退出指令碼。

第四部分:執行gdb,通過「gdb [options] [executable-file] [process-id]」方式附著到指定pid的程序上,通過第五部分:用sed去掉gdb輸出的無效行,只提取含有執行緒資訊、函式資訊的行。

通過上述對gstack指令碼源**的分析可知,gstack只是gdb bt的簡單封裝,與我們的目標還有一定差距。看來需要自己編寫一些擴充套件指令碼或程式,才能進一步達成目標。

首先,需要編寫乙個指令碼,重複執行多次gstack,採集目標程式足夠多次函式呼叫棧;其次,需要進一步淨化資料,比如函式位址資訊就需要過濾掉;還有,需要歸併出不同的函式呼叫棧,找到不同的函式呼叫鏈,因為gstack輸出的函式棧是用thread行分隔的,可以編寫乙個程式來解析thread行,將每個thread塊(多行)放到雜湊桶中排重(即,排除重複項),從而得到唯一不同的函式呼叫鏈。

三.擴充套件程式設計

首先,編寫乙個makefile指令碼,用shell for迴圈不斷呼叫gstack,將輸出結果追加到臨時文字檔案中。

仍以redis-server為例,執行 make gstack_log pid=`pidof redis-server` nn=5,即可對redis-server連續執行5次gstack,並將結果儲存到乙個臨時檔案tmp_gstack_1353.txt中。在正式採集時,可以將nn設定為很大,比如nn=2000次,以採集到足夠多的不同的函式呼叫棧資訊。

然後,檢視一下輸出的臨時檔案的內容,即多次gstack輸出結果的羅列。下一步需要將每個thread行所分隔的塊(多行),如塊1、塊2、塊3、塊4、、、進行淨化和排重。

編寫乙個node.js小程式gstack_data_format.js,用於對gstack輸出結果淨化併排重。程式讀入gstack結果檔案(如:tmp_gstack_1353.txt),一行一行地讀入並累加到乙個字串變數中,遇到thread行則停止累加,並將該字串作為key新增到乙個hash桶中,因為hash key天然不會重複,利用這個特點進行排重;遇到thread行後,清空該字串變數,重新開始累加;依次往復,直到讀完整個檔案。程式基本流程如下,具體源**請見本文附錄。

如下給出gstack_data_format.js的執行效果。該gstack結果檔案為1186行,採集到237個函式棧,進行淨化、排重後,得到2個唯一不同的函式呼叫棧。

Linux網路問題定位工具

分類 network 本文將linux中使用到的網路問題定位工具進行了初步彙總。linux nc命令 netcat是網路工具中的 瑞士軍刀 短小精悍 功能實用,簡單 可靠。可通過tcp或udp協議傳輸讀寫資料。也是乙個網路應用debug分析器,因為它可以根據需要建立各種不同型別的網路連線。tcpdu...

Linux負載查詢定位工具

1 uptime命令,負載查詢命令 02 34 03 當前時間 up 2 days,20 14 系統執行時間 1 user 正在登入使用者數 而最後三個數字呢,依次則是過去 1 分鐘 5 分鐘 15 分.2 模擬工具stress 模擬cpu負載 stress cpu 1 timeout 600 模擬...

linux程式設計工具makefile

linux中對大量的工程檔案進行編譯,通常利用make工具來自動完成編譯,make工具通過乙個makefile makefile 檔案來完成自動維護編譯工作。makefile基本規則 分為三部分 target dependencies tab鍵 command 目標 target 需要生成的目標檔案...