没有它,SysProf没有正确生成调用堆栈,GProf根本就不准确。而且,没有-fno-omit-frame-pointer的分析器是否与依赖它的那些一样准确?
答案 0 :(得分:2)
我没有意识到这一点。使用帧指针,走一个堆栈是一个相当简单的练习。您只需取消引用帧指针以找到旧帧指针,堆栈指针和指令指针,然后重复直到完成为止。如果没有帧指针,则无法在没有附加信息的情况下可靠地遍历堆栈,这在ELF平台上通常意味着DWARF CFI。 DWARF解析相当复杂,需要您读入大量额外信息,这些信息在分析器需要工作的时间限制内很难处理。
实现这一目标的一种合理方法是简单地在每个样本中保存堆栈内存,然后使用CFI将其脱机以正确展开。根据堆栈的深度,这可能需要相当多的存储空间,并且复制可能会令人望而却步。我从来没有听说过使用这种技术的探查器,但Julian Seward floated it as a potential implementation strategy用于Firefox的内置探查器。
答案 1 :(得分:2)
可以使用最近版本的linux perf
(使用--call-graph dwarf
):
perf record -F99 --call-graph dwarf myapp
它使用.eh_frames
(或.debug_frames
)与libunwind来展开堆栈。
根据我的经验,它有时会丢失。
使用Haswell上最新版本的perf +内核,您可以use the Last Branch Record使用--call-graph lbr
。
答案 2 :(得分:1)
当-fomit-frame-pointer被断言时,大多数分析器很难工作。如果你想进行合理的分析,你可能不需要使用它并链接到库的调试版本(几乎可以肯定是在没有-fomit-frame-pointer的情况下编译)。