Недостающие символы в трассировке стека Valgrind
Я использую 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 ответ
Если вы используете dlopen
для загружаемой библиотеки есть вероятность, что она была выгружена до завершения программы. Поэтому Valgrind не может разрешить свои символы. Старайтесь избегать звонков dlclose
в этой библиотеке. См. http://valgrind.org/docs/manual/faq.html для получения дополнительной информации.