Как отладить дамп ядра, прерванный в плагине dlopen()?
У меня есть дамп ядра от пользователя. Основная программа загружает выбранные плагины через dlopen
, Процесс прерван в модуле плагина. Пользователь предоставил обратную трассировку, которая включает имя файла плагина и функцию, в которой он прерван.
Мне нужно посмотреть на данные, такие как аргументы, переданные функции. Как мне сказать GDB, где плагин был загружен, чтобы он мог выяснить, как показать источник и данные?
2 ответа
Как мне сказать GDB, где плагин был загружен, чтобы он мог выяснить, как показать источник и данные?
GDB должен сделать это автоматически (адреса загрузки содержатся внутри core
).
Все, что вам нужно сделать, это предоставить двоичные файлы, которые точно соответствуют среде клиента. Смотрите также этот ответ.
Если основной файл хорош, то он должен содержать стек вызовов для сбоя. Вы указали, что произошел сбой в модуле и функции плагина. Пройдя "вверх" по стеку, вы сможете увидеть точку сбоя и содержащую его функцию. В общем, вы должны иметь возможность просматривать локальные переменные, включая аргументы функции / метода.
Короче говоря, просто отладьте его, как любой другой файл ядра. После успешного завершения вызова dlopen разделяемая библиотека выглядит (почти) такой же, как и другие, загруженные при запуске.
Если вы поделитесь bt, я могу дать несколько более точных указателей.
Как заметил Employed Russian, ваши локальные исполняемые и разделяемые библиотеки должны быть побитовыми так же, как ваши клиенты. Если локальная версия отличается, она отбросит отображение, которое делает GDB между ядром и исполняемым файлом. Это обычно приводит к мусору, но иногда приводит к стеку, который выглядит неопределенно правильным. В результате программист тратит время на погоню за ложными следами. Эта ситуация действительно усугубляет!