Означает ли единственный отсутствующий символ из .so плохую сборку или повреждение? - PullRequest
1 голос
/ 16 марта 2020

У меня есть код, который вылетел и произвел дамп ядра. Верхняя часть выглядит так (с измененными именами) при печати в GDB

#0  0x00007f66be37d428 in __GI_raise (sig=sig@entry=6) at ../sysdeps/unix/sysv/linux/raise.c:54
#1  0x00007f66be37f02a in __GI_abort () at abort.c:89
#2  0x00007f66be9b784d in __gnu_cxx::__verbose_terminate_handler() () from /usr/lib/x86_64-linux-gnu/libstdc++.so.6
#3  0x00007f66be9b56b6 in ?? () from /usr/lib/x86_64-linux-gnu/libstdc++.so.6
#4  0x00007f66be9b5701 in std::terminate() () from /usr/lib/x86_64-linux-gnu/libstdc++.so.6
#5  0x00007f66be9b5919 in __cxa_throw () from /usr/lib/x86_64-linux-gnu/libstdc++.so.6
#6  0x00007f66be9de14f in std::__throw_logic_error(char const*) () from /usr/lib/x86_64-linux-gnu/libstdc++.so.6
#7  0x00007f66bf9798e4 in ?? () from /path/to/my/libname.so
#8  0x00007f66bf979c69 in MyNamespace::MyClass::function_3() () from /path/to/my/libname.so
#9  0x00007f66bf86020a in MyNamespace::MyClass::function_2() () from /path/to/my/libname.so
#10 0x00007f66bf855c0f in MyNamespace::MyClass::function_1() () from /path/to/my/libname.so

Исключение в строке 6 было

what():  basic_string::_M_construct null not valid

Однако - элемент в строке 7 не содержит символов - это заставило меня задуматься о том, что я смотрю на проблему коррупции или что эта библиотека каким-то образом была плохо построена. Я не могу объяснить, почему у нас есть символы вплоть до момента провала.

Существуют ли допустимые случаи, когда символ был бы пропущен из дампа ядра, а другие нет?

Эта библиотека была построена с CMake с CMAKE_BUILD_TYPE=Release, поэтому нет символов отладки - но AFAIK это не должно препятствовать генерированию и использованию символов для фактических имен функций (например, libstdc++ символов при обработке исключений) - хотя, по общему признанию, там также отсутствует один символ

1 Ответ

1 голос
/ 19 марта 2020

Однако - элементу в строке 7 не хватает символов - это заставило меня задуматься о том, что я смотрю на проблему с повреждением или что каким-то образом эта библиотека была как-то плохо построена.

Ваше предположение неверно.

Библиотека libstdc++.so.6 полностью удалена (для экономии места). Единственная информация о символах, которая остается, относится к символам, которые экспортированы из библиотеки (те, которые формируют ее API), в то время как все внутренние символы удалены.

Вы можете проверить это с помощью nm /usr/lib/x86_64-linux-gnu/libstdc++.so.6 и nm -D /usr/lib/x86_64-linux-gnu/libstdc++.so.6 - первый должен выдавать «без символов», а последний будет перечислять много символов.

Решение простое: установить пакет libstdc++6-dbg. Как только вы это сделаете, GDB должен предоставить вам стек (используя тот же файл core) без отсутствующих имен функций (и с информацией о файле и строке для загрузки).

...