
刚转到 C++,之前仅用 C++写过算法题,c++工程这块知之甚少。现在想分析进程的 cpu 消耗情况,于是准备采火焰图
生产环境进程不带符号表,用 perf 采出来都是地址,火焰图上全是进程名字,看不到具体方法名怎么解呢?
当前临时的做法是重新编译了一个带符号表的版本,想知道生产环境采火焰图的最佳实践是啥呢?以及有没有大佬推荐一些性能分析的博客呢
1 yzwduck 1 天前 虽然工作里没接触过 Linux perf, 但遇到过类似的场景, 也需要解析程序的符号. 最好的办法是, 让生产环境有符号文件可查. 如果遇到难以复现的问题, 并且无法拿到那份特定程序的符号信息, 就会变得很麻烦, 但总有办法. 我目前的做法是: * 找到复现问题用的, 没有符号的程序 A, * 用类似的配置编译一份带符号的程序 B, * 用 BinExport 配合 IDA Pro, Binary Ninja 或者 Ghidra 分别导出程序 A 和 B 的信息, * 用 BinDiff 去匹配程序 A 和程序 B 里相似的函数, 生成一个 SQLite 数据库, * 自己写脚本读取 SQLite 里程序 A 的符号信息, 填充到收集的原始资料里. |
2 ysc3839 1 天前 via Android |
3 neoblackcap 1 天前 据我了解,生产环境是采用流量回放的去调试。将生产环境一部分流量复制出来转发到你的测试环境中去(转发到带符号或者可调试的 C++程序中去),然后观察。 |
4 yanaraika 1 天前 你们这个发布流程不好。应该编译出来一个带全符号表的版本,然后生产环境部署一个/usr/bin/strip 掉调试信息的版本,这样可以直接在 perf 的时候手动指定带符号表的 binary |
5 kkhaike 17 小时 57 分钟前 正确做法是使用 -O2 -g 制作带符号表的生产环境二进制。。。可以直接上线这个带符号表的二进制,也可以上线 strip 后的二进制,然后调试的时候再替换就好 |
6 lixile 16 小时 55 分钟前 要联合 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 ``` |