У меня есть код, который вылетел и произвел дамп ядра. Верхняя часть выглядит так (с измененными именами) при печати в 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++
символов при обработке исключений) - хотя, по общему признанию, там также отсутствует один символ