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