我想为gdb编写一个脚本,它将每隔10 ms保存backtrace
(堆栈)进程。我怎么能这样做?
对于“身无分文”(对于不能使用任何类型的高级探查器的人)来说,它可以像调用图表分析一样。
是的,有很多高级的分析器。适用于流行的CPU和流行的操作系统。 Shark非常令人印象深刻并且易于使用,但是我希望使用这样的脚本获得基本功能,使用gdb。
答案 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
的手册页
答案 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次迭代的循环。