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

2023-10-17 14:29:00 +08:00
 xuelang

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

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

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


其实还有几个问题:

1137 次点击
所在节点    C++
2 条回复
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
2023-10-17 15:19:20 +08:00
@kkocdko 是的,生产环境 -fno-omit-frame-pointer 重编是很有必要的,只是搞起来很费劲,哎

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/982761

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX