2015-12-08 8 views
0

Я написал простую программу, что все, что она делает, это вызвать функцию meller1, которая вызывает meller2 и т. Д. До тех пор, пока некоторая функция не вызовет ошибки и не сработает. При запуске GDB трассировку по этой программе с CoreDump файл, я получаю:Как gdb backtrace знает, из какой библиотеки берутся каждая функция?

gdb bt

Мой вопрос, как же GDB BT знает, что бесплатно берется из /lib/libc.so.6? Есть ли ручной способ, который я мог бы сделать сам, с помощью файла Coredump и самого исполняемого файла? Спасибо.

ответ

1

Мой вопрос в том, как gdb bt знает, что бесплатный взят из /lib/libc.so.6?

Это не так. Все GDB знает (в начале), что авария произошла по адресу 0xf7e3bf9c. Затем GDB должен работать, чтобы отобразить этот адрес во что-то значимое.

Способ, которым GDB делает это, просматривая карту-загрузчик текущих изображений ELF, чтобы найти правильное изображение - изображение, которое «покрывает» данный адрес (это дает ему /lib/libc.so.6), а затем чтение таблицы символов в этом изображении ELF для определения функции, которая покрывает данный адрес (который, наконец, производит free).

Есть ли способ вручную, я мог бы сделать это сам с помощью файла Coredump и самого исполняемого файла?

Sure: GDB - это просто программа, и вы можете, конечно, написать еще одну программу, которая будет выполнять все те же шаги. Для написания такой программы потребуется несколько лет.