2015-04-29 7 views
10

Come posso includere/visualizzare il codice sorgente di malloc in gdb?Include il codice sorgente di malloc.c in gdb?

Voglio eseguire un'esecuzione passo-passo in gdb e passare al codice sorgente malloc.c quando viene chiamata una delle funzioni di malloc.

Attualmente quello gdb dice è: malloc.c: No such file or directory.

This ragazzo qui ha affrontato lo stesso problema, ma non menzionano una soluzione, vale a dire come fare un passo in realtà nel codice sorgente di malloc.

sono su Ubuntu server 14.04, e ho già provato ad installare il seguente: libc6-dbg, libc6-dev e libc6-dbgsym. Io non so nemmeno se uno di questi pacchetti potrebbe aiutare, ma l'installazione del libc-dbgsym mi da seguente errore:

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

Hai bisogno di trovare, o compilare, una versione di debug delle librerie. –

+0

@MartinJames è la parte in cui non riesco a farlo! :( – Paschalis

risposta

11

Quanto segue ha funzionato per me. Non sono sicuro se c'è un modo migliore.

  1. Installare libc6-DBG (che avete già fatto): sudo apt-get install libc6-dbg
  2. Installare il pacchetto EGLIBC-source (Ubuntu utilizza in realtà EGLIBC): sudo apt-get install eglibc-source.
  3. decomprimere il file tar che è stato installato in/usr/src/glibc: /usr/src/glibc $ sudo tar xvf eglibc-2.19.tar.xz
  4. Crank up gdb e aggiungere nel percorso alla sorgente malloc: (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

Funziona come un incantesimo! Inoltre, il passaggio 4 può essere aggiunto in '.gdbinit'! – Paschalis

+1

Ottimo! Un trucchetto in qualche modo correlato (che sembra che tu sappia).Ma per i futuri lettori: non rompersi su 'malloc' stesso dato che libc fa tutti i tipi di ginnastica simbolica in modo che il simbolo' malloc' non sia il vero 'malloc' che viene invocato. Invece, interrompi il chiamante e passa alla chiamata 'malloc'. – kaylum

3

Gdb può mostrare solo i codici sorgente, perché i binari debug-compilato contengono riferimenti tra il binario codice e i file di origine.

malloc() è nella libreria C. Sui sistemi normali, non è compilato con i metadati di debug e anche le sue fonti non sono installate nel sistema.

Ma sono raggiungibili, è sufficiente installare le versioni di debug di queste librerie. Ad esempio, su debian un o simile lo farà. Su SuSE, a zipper in libc6-debug (forse, forse i nomi esatti dei pacchetti potrebbero essere leggermente diversi).

+0

Avrei dovuto downvotare solo perché hai detto "gdb non è un mago"! – Paschalis

+0

Scherzi a parte, penso di averlo fatto, sono su Ubuntu e credo che libc6-dbg sia l'equivalente di quello che hai suggerito! – Paschalis

+0

@Paschalis Mi dispiace, non ho avuto alcuna intenzione negativa con questo.Ho rimosso questo dalla risposta – peterh