2010-03-25 58 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