如何使用perf收集一些可读的堆栈跟踪? 我想用随机抽样方法在Linux上对C++程序进行描述:

如何使用perf收集一些可读的堆栈跟踪? 我想用随机抽样方法在Linux上对C++程序进行描述:,linux,profiling,perf,Linux,Profiling,Perf,但是,如果您很匆忙,可以手动中断 当调试器下的程序主观上运行缓慢时 查找性能问题的简单方法 问题是我不能使用gdb调试器,因为我想在高负载下对生产环境进行评测,而调试器过于侵入性,大大降低了程序的速度。但是,我可以使用perf record和perf report在不影响程序性能的情况下查找瓶颈。有没有一种方法可以用perf而不是gdb来收集大量可读(类似gdb)堆栈跟踪?perf提供三种不同技术的调用堆栈记录 默认情况下,is使用帧指针(fp)。这通常是受支持的,并且性能良好,但在某些优化中

但是,如果您很匆忙,可以手动中断 当调试器下的程序主观上运行缓慢时 查找性能问题的简单方法


问题是我不能使用gdb调试器,因为我想在高负载下对生产环境进行评测,而调试器过于侵入性,大大降低了程序的速度。但是,我可以使用
perf record
perf report
在不影响程序性能的情况下查找瓶颈。有没有一种方法可以用perf而不是gdb来收集大量可读(类似gdb)堆栈跟踪?

perf
提供三种不同技术的调用堆栈记录

  • 默认情况下,is使用帧指针(
    fp
    )。这通常是受支持的,并且性能良好,但在某些优化中不起作用。使用
    -fn编译应用程序,不要忽略帧指针
    等,以确保其正常工作
  • dwarf
    为每个样本使用一堆袋子进行后处理。这会造成严重的性能损失
  • 现代系统可以使用硬件支持的最后分支记录,
    lbr
堆栈可在
perf
分析工具中访问,如
perf报告
perf脚本


有关更多详细信息,请查看
man perf record

IIRC,Chandler Carruth提到启用帧指针进行编译(
-fno省略帧指针
),以让perf在他的CppCon2015中高效地收集堆栈回溯。但我忘了他接下来用什么perf选项告诉
perf
它可以使用帧指针,甚至可以让它收集父调用方。这是一个非常好的视频,值得观看。谢谢,您知道如何在
perf script
中向堆栈跟踪添加行号吗?我尝试了
perf script-F+srcline
,但似乎没有添加它们。是
perf script
bug还是我做错了?