Инструмент dump_syms breakpad обрабатывает секции gnu_debuglink?

Мне тяжело генерировать символы разбивки на Linux из раздетых двоичных файлов.

Я компилирую с:

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++.

Я тогда связываюсь с:

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 (нет пути dir), что правильно.

Однако dump_syms, похоже, не следует по ссылке, хотя код, редактируемый в этом патче, настоятельно рекомендует это делать. Я получаю этот вывод в 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)

Полученный файл символов составляет 2 МБ, независимо от того, .gnu_debuglink раздел присутствует в ELF. При использовании этого файла символов размером 2 МБ с minidump_stackwalk неправильные функции появляются в кадрах стека. Когда я бегу dump_syms в двоичном файле со встроенными символами выходной файл равен 9 МБ, а кадры стека верны.

Что я делаю неправильно?

1 ответ

Решение

Это оказалось две вещи:

  1. Для загрузки символов из внешних файлов необходимо указать путь к каталогу dump_syms, даже если символы находятся в той же папке, что и двоичные файлы. например dump_syms foo.so .
  2. В Breakpad есть ошибка, которая означает, что внешние символы никогда не будут загружены, даже если они найдены. Я представил патч, чтобы исправить это.
Другие вопросы по тегам