2017-01-06 42 views
4

У меня есть дамп ядра от пользователя. Основная программа загружает выбранные плагины через dlopen. Процесс прерывается в модуле плагина. Пользователь предоставил обратную трассировку, которая включает имя файла плагина и функцию, в которой он был прерван.Как отлаживать дамп ядра, который прерывается в плагине dlopen() 'ed?

Мне нужно посмотреть на данные, такие как аргументы, переданные функции. Как сообщить gdb, где был загружен плагин, чтобы он мог выяснить, как показать источник и данные?

ответ

3

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

GDB должен сделать автоматически (адрес загрузок содержится внутри core).

Все, что вам нужно сделать, это предоставить двоичные файлы, соответствующие условиям клиента точно. См. Также this answer.

+0

нанял-russion и @ matthew-fisher Я предполагаю, что программные двоичные файлы, должно быть, были немного разными. Я хочу, чтобы пользователь послал его. –

1

Если файл ядра хорош, он должен содержать стек вызовов для сбоя. Вы указали, что авария произошла в модуле плагина и функции. Переходя «вверх» в стек, вы должны иметь возможность видеть точку срыва и содержащую функцию. В общем, вы должны иметь возможность посмотреть на локальные переменные, включая аргументы функции/method.

Короче говоря, просто отлаживайте его, как и любой другой файл ядра. Как только вызов dlopen завершится успешно, общая библиотека выглядит (почти) так же, как и другие, загруженные при запуске.

Если вы разделите bt, я могу дать некоторые более определенные указатели.

Как отметил русский сотрудник, локальные исполняемые и разделяемые библиотеки должны быть побитовыми так же, как ваши клиенты. Если локальная версия отличается, она сбрасывает отображение, которое выполняет gdb между ядром и исполняемым файлом. Это обычно приводит к мусору, но иногда приводит к тому, что стек выглядит смутно правильным. В результате программист проводит время, преследуя ложные выводы. Эта ситуация действительно усугубляется!