2015-04-29 6 views
10

Wie kann ich den Quellcode von malloc in gdb einschließen/anzeigen?Include Quelltext von malloc.c in gdb?

Ich möchte eine schrittweise Ausführung in gdb ausführen und in malloc.c Quellcode, wenn eine der malloc-Funktionen aufgerufen wird.

Derzeit was gdb sagt, ist: malloc.c: No such file or directory.

This Kerl hier das gleiche Problem konfrontiert, aber sie erwähnen nicht eine Lösung, dh wie tatsächlich in den Quellcode von malloc Schritt zu.

Ich bin auf Ubuntu server 14.04, und ich habe bereits folgendes versucht zu installieren: libc6-dbg, libc6-dev und libc6-dbgsym. Ich weiß nicht, selbst wenn eines dieser Pakete helfen könnten, aber die libc-dbgsym Installation gibt mir die folgende Fehlermeldung:

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) 
+0

Sie benötigen, zu finden oder Kompilieren, eine Debug-Version der Bibliotheken. –

+0

@MartinJames das ist der Teil, bei dem ich versage! :( – Paschalis

Antwort

11

Folgendes funktionierte für mich. Nicht sicher, ob es einen besseren Weg gibt.

  1. installieren libc6-dbg (die Sie bereits getan haben): sudo apt-get install libc6-dbg
  2. Installieren Sie die eglibc-Source-Paket (ubuntu tatsächlich verwendet eglibc): sudo apt-get install eglibc-source.
  3. Entpacken Sie die tar-Datei, die im Verzeichnis/usr/src/glibc installiert wurde: /usr/src/glibc $ sudo tar xvf eglibc-2.19.tar.xz
  4. Crank up gdb und fügen Sie in dem Pfad zur malloc Quelle: (gdb) dir /usr/src/glibc/eglibc-2.19/malloc

(gdb) n

13 char *c = malloc(100);

(gdb) s

__GI___libc_malloc (bytes=100) at malloc.c:2876 2876

{

(gdb)

+0

Funktioniert wie Charme! Außerdem kann Schritt 4 in '.gdbinit' hinzugefügt werden! – Paschalis

+1

Großartig! Ein etwas verwandtes Gotcha (das klingt, als wüsstest du davon).Aber für zukünftige Leser: Brechen Sie nicht auf "malloc" selbst, da libc alle Arten von Symbolgymnastik macht, so dass das "malloc" -Symbol nicht das tatsächliche "malloc" ist, das aufgerufen wird. Brechen Sie stattdessen den Anrufer ein und treten Sie in den Anruf "malloc". – kaylum

3

Gdb kann nur die Quellcodes zeigen, da die Debug-Binaries Verweise zwischen den binären enthalten Code und die Quelldateien.

ist in der C-Bibliothek. Auf normalen Systemen wird es nicht mit Debug-Metadaten kompiliert und seine Quellen sind ebenfalls nicht im System installiert.

Aber sie sind erreichbar, Sie müssen nur die Debug-Versionen dieser Bibliotheken installieren. Zum Beispiel, auf Debian ein apt-get install glibc-debug oder ähnliches wird es tun. Auf SuSE, zipper in libc6-debug (afaik, vielleicht sind die genauen Paketnamen ein wenig anders).

+0

Ich hätte runterstimmen sollen, nur weil du gesagt hast "gdb ist kein wizard!" – Paschalis

+0

Witze beiseite, ich denke, ich habe das. Ich bin auf Ubuntu, und ich glaube 'libc6-dbg' ist das Äquivalent von dem, was du vorgeschlagen hast! – Paschalis

+0

@Paschalis Es tut mir leid, ich hatte keine negative Absicht damit. Ich entfernte das aus der Antwort. – peterh