недостающие символы в трассировке стека Valgrind - PullRequest
2 голосов
/ 15 февраля 2012

Я использую valgrind для отладки двоичного файла, который использует загружаемые библиотеки через dlopen.В стабильном выпуске Debian стек трассировки не содержит символов для вызовов внутри загружаемой библиотеки.

| | ->11.55% (114,688B) 0x769492C: ???
| | | ->11.55% (114,688B) 0x7697289: ???
| | |   ->11.55% (114,688B) 0x769806F: ???
| | |     ->11.55% (114,688B) 0x419812: myfunc (main.c:1010)

Valgrind в нестабильном выпуске Debian работает нормально, и символы правильно разрешены.Поэтому я начал искать то, что отличается.У меня есть эти пакеты в обеих системах (valgrind был обновлён до 3.7 из нестабильного):

ii  valgrind                      1:3.7.0-1+b1
ii  libtool                       2.2.6b-2
ii  gcc                           4:4.4.5-1
ii  binutils                      2.20.1-16

. Библиотеки не разделены и содержат debuginfo:

 ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, BuildID[sha1]=0x33ffd210859178c15bb3923c5491e1a1b6065015, not stripped

Приглядываясь, я заметил, чтоРазмер библиотек различен, в нестабильной Debian библиотека немного большеСравнивая их с readelf, размер информации отладки больше.

  [26] .debug_aranges    PROGBITS        0000000000000000 00a74c 000090 00      0   0  1
  [27] .debug_pubnames   PROGBITS        0000000000000000 00a7dc 000385 00      0   0  1
  [28] .debug_info       PROGBITS        0000000000000000 00ab61 00512f 00      0   0  1
  [29] .debug_abbrev     PROGBITS        0000000000000000 00fc90 0006e2 00      0   0  1
  [30] .debug_line       PROGBITS        0000000000000000 010372 002314 00      0   0  1
  [31] .debug_str        PROGBITS        0000000000000000 012686 0019d3 01  MS  0   0  1
  [32] .debug_loc        PROGBITS        0000000000000000 014059 000f24 00      0   0  1
  [33] .debug_macinfo    PROGBITS        0000000000000000 014f7d 179082 00      0   0  1
  [34] .debug_ranges     PROGBITS        0000000000000000 18dfff 000060 00      0   0  1

Это заставляет меня думать, что чего-то не хватает в разделе информации отладки в двоичных файлах, построенных на основе стабильного Debian.Теперь мой вопрос: почему и чем отличаются двоичные файлы?Инструменты (gcc, libtool, binutils), используемые в сборке, одинаковы, включая флаги и команды компилятора / компоновщика (я проверял это с помощью diff при выводе make).

Обновление: Разница в размере раздела debug_info произошла из-за того, что там также хранится полный путь к исходному файлу, а домашняя страница сборки была другой.Также есть разные версии openssl для unstable / stable, которые добавили несколько разных символов в раздел debug_info.Следовательно, разница в размере debug_info.

Запуск valgrind в режиме отладки (-d -v -v) показывает, что он читает символы из загружаемой библиотеки в обоих случаях:

--19837-- Reading syms from /usr/lib/myplugin.so (0x6c62000)

1 Ответ

8 голосов
/ 15 февраля 2012

Если вы используете dlopen для загружаемой библиотеки, есть вероятность, что она была выгружена до завершения программы.Поэтому Valgrind не может разрешить свои символы.Старайтесь не вызывать dlclose в этой библиотеке.См. http://valgrind.org/docs/manual/faq.html#faq.unhelpful для получения дополнительной информации.

...