V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
xuelang
V2EX  ›  C++

复杂 C++ 项目堆栈保留,大家有啥好方法吗?

  •  
  •   xuelang ·
    selfboot · 2023-10-17 14:29:00 +08:00 · 1159 次点击
    这是一个创建于 434 天前的主题,其中的信息可能已经有所发展或是发生改变。

    完整文章在: 复杂 C++ 项目堆栈保留以及 ebpf 性能分析

    使用 profile 分析的一个大前提就是,服务的二进制文件要保留函数的堆栈信息。堆栈信息是程序执行过程中函数调用和局部变量的记录,当程序执行到某一点时,通过查看堆栈信息,我们可以知道哪些函数被调用,以及它们是如何相互关联的。这对于调试和优化代码至关重要,特别是在处理性能问题和内存泄露时。

    但是在实际的项目中,我们用 eBPF 来分析服务的性能瓶颈或者内存泄露的时候,往往会拿不到函数调用堆栈,遇到各种 unknown 的函数调用链。这是因为生产环境为了减少二进制文件的大小,通常不包含调试信息。此外,就算生产环境编译 C++ 代码的时候用了 -g 生成了调试信息,也可能拿不到完整的函数调用堆栈。这里面的原因比较复杂,本文将展开聊一下这个问题。


    其实还有几个问题:

    • ebpf 分析堆栈部分的代码在哪里,好像没找到;
    • 有没有啥方法,可以在没有帧指针的时候,也能拿到堆栈信息?
    kkocdko
        1
    kkocdko  
       2023-10-17 15:09:14 +08:00
    是有这方面的问题,所以很多公司最后选择了 -fno-omit-frame-pointer 重新编译所有依赖(直接在 release 模式下,生产环境)。

    比如 google 自己的 debian testing 衍生,facebook ,以及 fedora 现在也这样做了。

    https://fedoraproject.org/wiki/Changes/fno-omit-frame-pointer

    ebpf 我不是很熟悉,就不多评价了。
    xuelang
        2
    xuelang  
    OP
       2023-10-17 15:19:20 +08:00
    @kkocdko 是的,生产环境 -fno-omit-frame-pointer 重编是很有必要的,只是搞起来很费劲,哎
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5936 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 02:07 · PVG 10:07 · LAX 18:07 · JFK 21:07
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.