我想为gdb编写一个脚本,这将每10毫秒节省backtrace
(堆栈)的进程。我怎样才能做到这一点?自动化gdb:每10毫秒显示一次回溯
它可以像电话图表分析“无形”(对于不能使用任何类型的高级分析器的人员)。
是的,有很多先进的分析器。适用于流行的CPU和流行的操作系统。鲨鱼是非常令人印象深刻和易于使用的,但我想用这种脚本获得基本功能,使用gdb。
我想为gdb编写一个脚本,这将每10毫秒节省backtrace
(堆栈)的进程。我怎样才能做到这一点?自动化gdb:每10毫秒显示一次回溯
它可以像电话图表分析“无形”(对于不能使用任何类型的高级分析器的人员)。
是的,有很多先进的分析器。适用于流行的CPU和流行的操作系统。鲨鱼是非常令人印象深刻和易于使用的,但我想用这种脚本获得基本功能,使用gdb。
您能否得到lsstack?也许你可以从应用程序之外的脚本运行它。为什么是10ms?在100ms或更长时间内,百分比大致相同。如果该应用程序速度太快,则可能会通过外部循环人为地减慢速度,这也不会改变百分比。对于这个问题,如果应用程序运行时间足够长,并且您的目标是找出性能问题的位置,则可以使用Ctrl-C在gdb下手动获取样本。
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。
请不要练习 – osgx 2010-06-02 16:11:46
(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
替代方法是pstack或gstack – 2015-11-18 16:55:22
S R Bandi,你可以添加http链接到手册(例如纯文本)吗? – osgx 2015-11-18 20:06:44
如果你能在平台上使用Dtrace,你最好使用Dtrace。 – 2010-03-25 00:58:56
我没有平台的dtrace。我有平台的gdb。 – osgx 2010-03-25 07:00:58