完整文章在: 复杂 C++ 项目堆栈保留以及 ebpf 性能分析
使用 profile 分析的一个大前提就是,服务的二进制文件要保留函数的堆栈信息。堆栈信息是程序执行过程中函数调用和局部变量的记录,当程序执行到某一点时,通过查看堆栈信息,我们可以知道哪些函数被调用,以及它们是如何相互关联的。这对于调试和优化代码至关重要,特别是在处理性能问题和内存泄露时。
但是在实际的项目中,我们用 eBPF 来分析服务的性能瓶颈或者内存泄露的时候,往往会拿不到函数调用堆栈,遇到各种 unknown 的函数调用链。这是因为生产环境为了减少二进制文件的大小,通常不包含调试信息。此外,就算生产环境编译 C++ 代码的时候用了 -g 生成了调试信息,也可能拿不到完整的函数调用堆栈。这里面的原因比较复杂,本文将展开聊一下这个问题。
其实还有几个问题:
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 我不是很熟悉,就不多评价了。 |