стек вызовов для кода, скомпилированного без опции -g (компилятор gcc) - PullRequest
3 голосов
/ 13 ноября 2010

Как мне проанализировать дамп ядра (используя gdb), который не скомпилирован с опцией -g GCC?

Ответы [ 3 ]

6 голосов
/ 13 ноября 2010

Создать файл карты.Файл карты сообщит вам адрес, с которого начинается каждая функция (в качестве смещения от начала exe, поэтому вам нужно будет знать также и базовый адрес, который он загружает).Затем вы посмотрите на указатель инструкций и посмотрите, где он находится в файле карты.Это дает вам хорошее представление о расположении в данной функции.

Ручная размотка стека - это немного чёрного искусства, так как вы не знаете, какие оптимизации выполнил компилятор.Когда вы примерно знаете, где вы находитесь в коде, вы обычно можете определить, что должно быть в стеке, и просканировать память, чтобы найти указатель возврата.его довольно сложно, однако.Вы эффективно тратите много времени на чтение данных в памяти и на поиск чисел, похожих на адреса памяти, а затем проверяете, логично ли это.Это вполне выполнимо, и я, и я уверен, что многие другие, делали это много раз:)

2 голосов
/ 13 ноября 2010

С помощью бинарных файлов ELF можно разделить символы отладки в отдельный файл.Цитирование из man-страниц objcopy :

  1. Связать исполняемый файл как обычно (используя флаг -g).Предполагая, что это называется foo затем ...
  2. Запустите objcopy --only-keep-debug foo foo.dbg, чтобы создать файл, содержащий отладочную информацию.
  3. Запустите objcopy --strip-debug foo для создания удаленного исполняемого файла.
  4. Запустите objcopy --add-gnu-debuglink = foo.dbg foo, чтобы добавить ссылку на информацию отладки в удаленный исполняемый файл.
1 голос
/ 13 ноября 2010

это не должно быть проблемой, вы можете снова скомпилировать исходный код с параметром -g и передать gdb ядро ​​и новый откомпилированный двоичный файл отладки, это должно работать без проблем.

Кстати, вы можете сгенерироватьфайл карты с помощью приведенной ниже команды в gcc

gcc -Wl, -Map = system.map file.c

Приведенная выше строка должна сгенерировать файл карты system.map, как только файл картысгенерированный вы можете сопоставить адрес, как указано выше, но я не уверен, как вы собираетесь сопоставить разделяемую библиотеку, это очень сложно

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...