2010-03-25 71 views
3

我想爲gdb編寫一個腳本,這將每10毫秒節省backtrace(堆棧)的進程。我怎樣才能做到這一點?自動化gdb:每10毫秒顯示一次回溯

它可以像電話圖表分析「無形」(對於不能使用任何類型的高級分析器的人員)。

是的,有很多先進的分析器。適用於流行的CPU和流行的操作系統。鯊魚是非常令人印象深刻和易於使用的,但我想用這種腳本獲得基本功能,使用gdb。

+1

如果你能在平臺上使用Dtrace,你最好使用Dtrace。 – 2010-03-25 00:58:56

+0

我沒有平臺的dtrace。我有平臺的gdb。 – osgx 2010-03-25 07:00:58

回答

3

您能否得到lsstack?也許你可以從應用程序之外的腳本運行它。爲什麼是10ms?在100ms或更長時間內,百分比大致相同。如果該應用程序速度太快,則可能會通過外部循環人爲地減慢速度,這也不會改變百分比。對於這個問題,如果應用程序運行時間足夠長,並且您的目標是找出性能問題的位置,則可以使用Ctrl-C在gdb下手動獲取樣本。

+0

我想要自動定期堆棧轉儲。對於可以運行幾分鐘的大型應用程序。 手動模式下按下ctrl-c的 – osgx 2010-03-25 15:38:45

+0

是不可能的,因爲在應用程序中有2-3個這樣的點時,不會從最熱點獲取堆棧。 – osgx 2010-03-25 15:39:28

+0

不,我不能得到一個lststack。我可以使用gdb,並且gdb在處理我的應用程序方面有更好的能力。 – osgx 2010-03-25 15:40:56

0
cat > gdb.run 
set pagination 0 
backtrace 
continue 
backtrace 
continue 
... as many more backtrace + continue's as needed 
backtrace 
continue 
detach 
quit 

當然,省略了重複的換行符,你如何在這個論壇軟件中做單行換行呢? :(

gdb -x gdb.run -p $pid 

然後,只需使用另一種語言的循環做

kill -INT $pid ; sleep 0.01 

kill -INT是OS做什麼,當你打CTRL-C。讀者做練習:使gdb腳本使用一個循環,迭代次數爲$ n。

+0

請不要練習 – osgx 2010-06-02 16:11:46

1

(1)手動。在shell中執行以下操作:在s中重複按Ctrl + C地獄提示。

gdb -x print_callstack.gdb -p pid 

或,(2)發送的信號爲PID重複相同次數的另一個外殼如下面循環

let count=0; \ 
while [ $count -le 100 ]; do \ 
    kill -INT pid ; sleep 0.10; \ 
    let $count=$count+1; \ 
done 

print_callstack.gdb源從(1)是如下:

set pagination 0 
set $count = 0 
while $count < 100 
    backtrace 
    continue 
    set $count = $count + 1 
end 
detach 
quit 
+0

替代方法是pstack或gstack – 2015-11-18 16:55:22

+0

S R Bandi,你可以添加http鏈接到手冊(例如純文本)嗎? – osgx 2015-11-18 20:06:44