V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
Charlie17Li
V2EX  ›  程序员

[C++] 生产环境进程不带符号表,用 perf 等最终生成的火焰图无法分析,怎么解呢?

  •  
  •   Charlie17Li · 19 小时 16 分钟前 · 793 次点击

    背景

    刚转到 C++,之前仅用 C++写过算法题,c++工程这块知之甚少。现在想分析进程的 cpu 消耗情况,于是准备采火焰图

    问题

    生产环境进程不带符号表,用 perf 采出来都是地址,火焰图上全是进程名字,看不到具体方法名怎么解呢?

    当前临时的做法是重新编译了一个带符号表的版本,想知道生产环境采火焰图的最佳实践是啥呢?以及有没有大佬推荐一些性能分析的博客呢

    6 条回复    2025-12-25 10:29:49 +08:00
    yzwduck
        1
    yzwduck  
       18 小时 43 分钟前
    虽然工作里没接触过 Linux perf, 但遇到过类似的场景, 也需要解析程序的符号.

    最好的办法是, 让生产环境有符号文件可查.

    如果遇到难以复现的问题, 并且无法拿到那份特定程序的符号信息, 就会变得很麻烦, 但总有办法.

    我目前的做法是:

    * 找到复现问题用的, 没有符号的程序 A,
    * 用类似的配置编译一份带符号的程序 B,
    * 用 BinExport 配合 IDA Pro, Binary Ninja 或者 Ghidra 分别导出程序 A 和 B 的信息,
    * 用 BinDiff 去匹配程序 A 和程序 B 里相似的函数, 生成一个 SQLite 数据库,
    * 自己写脚本读取 SQLite 里程序 A 的符号信息, 填充到收集的原始资料里.
    ysc3839
        2
    ysc3839  
       18 小时 41 分钟前 via Android
    neoblackcap
        3
    neoblackcap  
       17 小时 19 分钟前
    据我了解,生产环境是采用流量回放的去调试。将生产环境一部分流量复制出来转发到你的测试环境中去(转发到带符号或者可调试的 C++程序中去),然后观察。
    yanaraika
        4
    yanaraika  
       16 小时 33 分钟前
    你们这个发布流程不好。应该编译出来一个带全符号表的版本,然后生产环境部署一个/usr/bin/strip 掉调试信息的版本,这样可以直接在 perf 的时候手动指定带符号表的 binary
    kkhaike
        5
    kkhaike  
       8 小时 2 分钟前
    正确做法是使用 -O2 -g 制作带符号表的生产环境二进制。。。可以直接上线这个带符号表的二进制,也可以上线 strip 后的二进制,然后调试的时候再替换就好
    lixile
        6
    lixile  
       7 小时 0 分钟前
    要联合 cicd 一起来做 如果你们有的话 线上如果没有重现、重放条件 是不进行二进制替换的 只是补全调试信息罢了
    首先就是默认的 release 版本加上-g
    ```
    # 编译
    g++ -O2 -g -fno-omit-frame-pointer -o app app.cpp

    # 拆符号
    objcopy --only-keep-debug app app.debug
    strip --strip-debug app
    # 符号文件再绑定
    objcopy --add-gnu-debuglink=app.debug app

    # perf

    perf record -F 99 -g -- ./app

    #手动指定 debug 路径
    export PERF_BUILDID_DIR=/path/debugfile_dir
    perf script > out.perf

    ```
    关于   ·   帮助文档   ·   自助推广系统   ·   博客   ·   API   ·   FAQ   ·   Solana   ·   4932 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 09:30 · PVG 17:30 · LAX 01:30 · JFK 04:30
    ♥ Do have faith in what you're doing.