Улучшение отладки при сбое Linux в программе на C

У нас есть встроенная версия ядра Linux, работающая на ядре MIPs. Программа, которую мы написали, запускает определенный набор тестов. Во время одного из стресс-тестов (выполняется около 12 часов) мы получаем seg fault. Это, в свою очередь, генерирует дамп ядра.

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

EDIT: Еще одно замечание, backtrace и backtrace_symbols не поддерживаются в нашем инструментарии.

Отсюда:

  1. Есть ли способ отловить seg fault и сгенерировать больше данных бэктрейса, указателей стека, стека вызовов и т.д.?

  2. Есть ли способ получить больше данных из дампа ядра, которое разбилось в .so файле?

Спасибо.

7
задан user626201 24 November 2011 в 05:27
поделиться