Включить исходный код 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, возможно, точные имена пакетов могут немного отличаться).