breakpad 的 dump_syms 工具是否处理 gnu_debuglink 部分?

Does breakpad's dump_syms tool handle gnu_debuglink sections?

我很难从剥离的二进制文件在 Linux 上生成 breakpad 符号。

我编译:

gcc-4.4 -c -I../include -D_LINUX -m64 -fPIC -D__LP64__ -D_GNU_SOURCE -Wno-switch -Wno-missing-braces -fno-strict-aliasing -Wreturn-type -Wall -Wno-unknown-pragmas -Wno-parentheses -pipe -fmessage-length=0 -g -DRELEASE -O3 -o lin/voxl.o voxl.c -fvisibility=hidden

还有一些 C++ 文件。

然后我 link 与:

g++-4.4 -o ../liblin/foo.so -shared  <objects> <libs> -z origin -Wl,-R,$ORIGIN -Wl,-rpath,../liblin

最后将调试信息剥离到 .debug 文件中:

objcopy --only-keep-debug ../liblin/foo.so ../liblin/foo.so.debug
objcopy --strip-debug ../liblin/foo.so
objcopy --add-gnu-debuglink=../liblin/foo.so.debug ../liblin/foo.so

生成的二进制文件可以使用带有完整符号信息的 GDB 进行调试。它包含一个 .gnu_debuglink 部分,它引用 foo.so.debug (没有目录路径),这是正确的。

但是,dump_syms 似乎没有跟随 link、even though the code being edited in this patch strongly suggests that it should。我在 stderr 中得到这个输出:

liblin/foo.so, section '.eh_frame': the call frame entry at offset 0x18 uses a DWARF expression to describe how to recover register '.cfa',  but this translator cannot yet translate DWARF expressions to Breakpad postfix expressions
liblin/foo.so: file contains no debugging information (no ".stab" or ".debug_info" sections)

生成的符号文件为 2MB,无论 ELF 中是否存在 .gnu_debuglink 部分。当将这个 2MB 的符号文件与 minidump_stackwalk 一起使用时,堆栈帧上会出现错误的函数。当我 运行 dump_syms 在带有嵌入符号的二进制文件上时,输出文件为 9MB 并且堆栈帧是正确的。

我做错了什么?

原来是两件事:

  1. 要从外部文件加载符号,您必须提供 dump_syms 的目录路径,即使这些符号与二进制文件位于同一文件夹中。例如dump_syms foo.so .
  2. Breakpad 中存在一个错误,这意味着即使找到外部符号,也永远不会 加载它们。 I've submitted a patch to fix it.