调试时能否通过GDB获取两断点间类gprof的性能分析信息?
在GDB调试中获取断点间的性能分析数据
当然可以!在调试过程中获取两个断点之间类似gprof的性能数据是完全可行的,之前折腾gmon.out没成功很正常——毕竟gprof默认是从程序启动到退出全程记录,不太适配调试时的“片段式”性能分析需求。下面给你两种实用的方法:
方法一:结合Perf和GDB(推荐)
Perf是Linux下强大的性能分析工具,能和GDB完美配合抓取断点间的性能数据:
- 启动GDB并加载你的程序:
gdb ./your_program - 设置第一个断点并运行到该位置:
b breakpoint_label_or_address,然后输入run,程序会停在第一个断点 - 在GDB中启动Perf记录:输入
shell perf record -g -p $(pidof your_program),其中-g用于记录调用栈,-p指定当前调试进程的PID - 继续执行到第二个断点:输入
c(continue),程序运行到第二个断点后自动暂停 - 停止Perf记录:输入
shell pkill -SIGINT perf,Perf会把数据写入默认的perf.data文件 - 查看性能报告:输入
shell perf report,你就能看到这段时间内各函数的CPU耗时占比、调用栈等信息,效果和gprof类似,甚至更详细
方法二:使用GDB内置的Profiling功能
较新版本的GDB自带了轻量的profiling功能,不需要额外工具:
- 同样先启动GDB、加载程序并运行到第一个断点
- 启动profiling:输入
start-profiling my_debug_profile.data(指定输出文件,也可以留空用默认) - 继续执行到第二个断点:
c - 停止profiling:输入
stop-profiling - 分析结果:你可以直接用GDB的
show-profiling查看简要统计,或者导出数据后用gprof分析:gprof ./your_program my_debug_profile.data,就能得到和gprof格式一致的报告
为什么之前用gmon.out没成功?
gprof的工作机制是程序启动时通过-pg编译选项注入的初始化代码启动 profiling,只有当程序正常退出时才会生成gmon.out。调试过程中我们是中途暂停/继续,gprof不会主动在断点间生成数据,所以直接操作gmon.out自然得不到想要的结果。
内容的提问来源于stack exchange,提问作者Wolkowa Anastacia
相关产品推荐
相关产品推荐

