Включить исходный код malloc.c в gdb?
Как включить/просмотреть исходный код malloc
в gdb?
Я хочу выполнить пошаговое выполнение в gdb
и перейти в исходный код malloc.c
при вызове любой из функций malloc.
В настоящее время gdb говорит:
malloc.c: No such file or directory.
Этот парень столкнулся с той же проблемой, но они не упоминают решение, то есть как на самом деле перейти в исходный код malloc.
Я нахожусь на Ubuntu server 14.04
, и я уже пытался установить следующее:
libc6-dbg
, libc6-dev
и libc6-dbgsym
.
Я даже не знаю, может ли помочь один из этих пакетов, но установка libc-dbgsym
дает мне следующую ошибку:
dpkg: error processing archive /var/cache/apt/archives/libc6-dbgsym_2.19-0ubuntu6.6_amd64.ddeb (--unpack): trying to overwrite
'/usr/lib/debug/usr/lib/x86_64-linux-gnu/audit/sotruss-lib.so', which
is also in package libc6-dbg:amd64 2.19-0ubuntu6.6 dpkg-deb: error:
subprocess paste was killed by signal (Broken pipe)
Ответы
Ответ 1
Следующие работали для меня. Не уверен, есть ли лучший способ.
- Установите libc6-dbg (который вы уже сделали):
sudo apt-get install libc6-dbg
- Установите пакет eglibc-source (ubuntu на самом деле использует eglibc):
sudo apt-get install eglibc-source
.
- Распакуйте tar файл, который был установлен в /usr/src/glibc:
/usr/src/glibc $ sudo tar xvf eglibc-2.19.tar.xz
- Поднимите gdb и добавьте путь к источнику malloc:
(gdb) dir /usr/src/glibc/eglibc-2.19/malloc
(gdb) n
13 char * c = malloc (100);
(gdb) s
__ GI___libc_malloc (bytes = 100) в файле malloc.c: 2876 2876
{
(gdb)
Ответ 2
Gdb может показывать только исходные коды, потому что скомпилированные двоичные файлы содержат ссылки между двоичным кодом и исходными файлами.
malloc()
находится в библиотеке C. В обычных системах он не скомпилирован с метаданными отладки, а его источники также не установлены в системе.
Но они достижимы, вам нужно только установить отладочные версии этих библиотек. Например, на debian будет apt-get install glibc-debug
или аналогичный. На SuSE a zipper in libc6-debug
(afaik, возможно, точные имена пакетов могут немного отличаться).