У нас есть встроенная версия ядра Linux, работающая на ядре MIP. Программа, которую мы написали, запускает определенный набор тестов. Во время одного из стресс-тестов (продолжительностью около 12 часов) мы получаем ошибку сегмента. Это, в свою очередь, создает дамп ядра.
К сожалению, дамп ядра не очень полезен. Сбой происходит в какой-то системной библиотеке, которая динамически связана (возможно, pthread или glibc). Обратная трассировка в дампе ядра не полезна, потому что она показывает только точку сбоя и никаких других вызывающих абонентов (наше приложение пользовательского пространства построено с -g -O0, но по-прежнему нет информации обратной трассировки):
Cannot access memory at address 0x2aab1004
(gdb) bt
#0 0x2ab05d18 in ?? ()
warning: GDB can't find the start of the function at 0x2ab05d18.
GDB is unable to find the start of the function at 0x2ab05d18
and thus can't determine the size of that function's stack frame.
This means that GDB may be unable to access that stack frame, or
the frames below it.
This problem is most likely caused by an invalid program counter or
stack pointer.
However, if you think GDB should simply search farther back
from 0x2ab05d18 for code which looks like the beginning of a
function, you can increase the range of the search using the `set
heuristic-fence-post' command.
Еще одна неприятность заключается в том, что мы не можем запустить gdb / gdbserver. GDB / GDBserver продолжает работать на __nptl_create_event. Видя, что тест создает потоки, таймеры и уничтожает их, каждые 5 секунд практически невозможно долго сидеть, продолжая их.
EDIT:
Еще одно замечание, backtrace и backtrace_symbols не поддерживаются в нашей цепочке инструментов.
Таким образом:
Есть ли способ перехвата ошибки сегмента и генерирования большего количества данных обратной трассировки, указателей стека, стека вызовов и т. Д .?
Есть ли способ получить больше данных из дампа ядра, который упал в файле .so?
Спасибо.