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