2012-02-10 7 views
18

Sto provando a eseguire il debug di un programma C e gdb mi sta dicendo che c'è un segfault sulla riga 329 di una certa funzione. Così ho impostato un punto di interruzione per quella funzione e sto provando ad attraversarlo. Tuttavia, ogni volta che colpisco la linea 68 ricevo questo reclamo da gdb:Chiamata a malloc fallendo nella sessione gdb

(gdb) step 
68    next_bb = (basic_block *)malloc(sizeof(basic_block)); 
(gdb) step 
*__GI___libc_malloc (bytes=40) at malloc.c:3621 
3621 malloc.c: No such file or directory. 
in malloc.c 

Non so cosa significhi. Il programma funziona perfettamente su tutti gli input tranne uno, quindi questa chiamata a malloc riesce chiaramente durante altre esecuzioni del programma. E, naturalmente, ho:

#include <stdlib.h>. 

Ecco il codice sorgente:

// Block currently being built. 
    basic_block *next_bb = NULL; 
    // Traverse the list of instructions in the procedure. 
    while (curr_instr != NULL) 
    { 
     simple_op opcode = curr_instr->opcode; 
     // If we are not currently building a basic_block then we must start a new one. 
     // A new block can be started with any kind of instruction. 
     if (!in_block) 
     { 
      // Create a new basic_block. 
      next_bb = (basic_block *)malloc(sizeof(basic_block)); 
+2

Se malloc non riesce la causa più probabile è la corruzione heap. Hai provato a eseguire il tuo programma con valgrind? – JaredPar

+4

usa 'next' invece di 'step'. Stai cercando di entrare in malloc, e gdb si lamenta che non ha accesso al codice sorgente per malloc. Davvero non vuoi entrare in Malloc. –

+0

Ah, grazie, 'successivo' risolto. – Schemer

risposta

22

È possibile ignorare questo. gdb si lamenta che non ha la fonte per malloc - ed è quasi certo che non si vuole passare attraverso la fonte.

Due soluzioni facili:

  • Uso next invece di passaggio - non scenderà in funzioni

  • Se hai accidentalmente step ed in una funzione già, utilizzare finish correre a la dichiarazione di ritorno della funzione.

E un approccio alternativo:

  • Si potrebbe anche rompere un po 'prima che il segfault, piuttosto che passando attraverso l'intero codice.

    • È possibile farlo mettendo un punto di interruzione su una linea particolare break <source file>:<line num> (ad esempio break foo.c:320 di rompere sulla linea 320 di foo.c).
    • Oppure è possibile interrompere una particolare funzione con break <function name> (ad esempio break foo si interromperà nella parte superiore della funzione foo()).
Problemi correlati