菜单
开源

eBPF 安装故障排除

了解如何排除和解决 eBPF 安装问题。

剖析解释型语言

使用此实现剖析 Ruby、JavaScript 等解释型语言并不理想。这些语言中的 JIT 编译方法通常不采用 ELF 文件格式,需要额外的步骤才能进行剖析。例如,使用 perf-map-agent 并为 Java 启用帧指针。

解释型方法将显示解释器函数的名称,而不是实际函数。

未知符号故障排除

符号从各种来源提取,包括

  • ELF 文件中的 .symtab.dynsym 部分。
  • 调试 ELF 文件中的 .symtab.dynsym 部分。
  • Go 语言 ELF 文件中的 .gopclntab 部分。

查找调试文件的流程遵循 gdb 算法。例如,如果探查器想要找到 /lib/x86_64-linux-gnu/libc.so.6 的调试文件,该文件有一个 .gnu_debuglink 设置为 libc.so.6.debug 且构建 ID 为 0123456789abcdef,则会检查以下路径:

  • /usr/lib/debug/.build-id/01/0123456789abcdef.debug
  • /lib/x86_64-linux-gnu/libc.so.6.debug
  • /lib/x86_64-linux-gnu/.debug/libc.so.6.debug
  • /usr/lib/debug/lib/x86_64-linux-gnu/libc.so.6.debug

处理未知符号

您收集的配置文件中出现的未知符号表示探查器无法访问与跟踪中给定地址关联的 ELF 文件。

这可能是由于以下几种原因造成的:

  • 进程已终止,导致 ELF 文件无法访问。
  • ELF 文件已损坏或未被识别为 ELF 文件。
  • /proc/pid/maps 中没有与堆栈跟踪中地址相对应的 ELF 文件条目。

地址解析未解析的符号

如果您只看到模块名称(例如,/lib/x86_64-linux-gnu/libc.so.6),而没有相应的函数名称,则表示无法将符号映射到其各自的函数名称。

这可能是由于以下几种原因造成的:

  • 二进制文件已被剥离,ELF 文件中没有 .symtab.dynsym.gopclntab 部分。
  • 调试文件丢失或无法找到。

要修复二进制文件中的此问题,请确保它们要么没有被剥离,要么您有单独的调试文件可用。您可以通过运行以下命令来实现此目的:

bash
objcopy --only-keep-debug elf elf.debug
strip elf -o elf.stripped
objcopy --add-gnu-debuglink=elf.debug elf.stripped elf.debuglink

对于系统库,请确保已安装调试符号。例如,在 Ubuntu 上,您可以通过执行以下命令来安装 libc 的调试符号:

bash
apt install libc6-dbg

了解扁平化堆栈跟踪

如果您的配置文件显示许多浅层堆栈跟踪(通常深度为 1-2 帧),则您的二进制文件可能是在没有帧指针的情况下编译的。

要使用帧指针编译代码,请在编译器选项中包含 -fno-omit-frame-pointer 标志。