自动化gdb:每10毫秒显示回溯

时间:2010-03-25 00:54:59

标签: profiling gdb backtrace

我想为gdb编写一个脚本,它将每隔10 ms保存backtrace(堆栈)进程。我怎么能这样做?

对于“身无分文”(对于不能使用任何类型的高级探查器的人)来说,它可以像调用图表分析一样。

是的,有很多高级的分析器。适用于流行的CPU和流行的操作系统。 Shark非常令人印象深刻并且易于使用,但是我希望使用这样的脚本获得基本功能,使用gdb。

3 个答案:

答案 0 :(得分:3)

你能得到 lsstack 吗?也许你可以从应用程序外的脚本运行它。为什么10ms?百分比将在100毫秒或更长时间内大致相同。如果应用程序太快,你可以通过外循环人为地降低它,这也不会改变百分比。就此而言,你可以使用Ctrl-C在gdb下手动获取样本,如果应用程序运行的时间足够长,并且你的目标是找出性能问题的位置。

答案 1 :(得分:1)

(1)手册。在shell中执行以下操作。在shell提示符下反复按Ctrl + C.

gdb -x print_callstack.gdb -p pid

或,(2)在另一个shell上重复发送信号到pid,如下面的循环

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

来自(1)的print_callstack.gdb来源如下:

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

pstack https://linux.die.net/man/1/pstack

的手册页

答案 2 :(得分: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

然后使用do

kill -INT $pid ; sleep 0.01

在另一个脚本的循环中。

kill -INT是操作系统在点击 ctrl-C 时的作用。为读者练习:使gdb脚本使用$ n次迭代的循环。