2012-02-10 9 views
18

Estoy intentando depurar un programa en C y gdb me dice que hay una segfault en la línea 329 de una determinada función. Así que establecí un punto de quiebre para esa función y estoy tratando de atravesarlo. Sin embargo, cada vez que toco la línea 68 obtengo esta queja de gdb:Llamada a error de malloc en la sesión de 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 

No sé lo que esto significa. El programa funciona perfectamente con todos los conjuntos, excepto uno, por lo que esta llamada a malloc claramente tiene éxito durante otras ejecuciones del programa. Y, por supuesto, que tengo:

#include <stdlib.h>. 

Aquí está el código fuente:

// 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

Si malloc está fallando, la causa más probable es la corrupción del montón. ¿Has probado ejecutar tu programa en valgrind? – JaredPar

+4

usa 'siguiente' en lugar de 'paso'. Está intentando ingresar a malloc, y gdb se queja de que no tiene acceso al código fuente de malloc. Realmente no quieres entrar en malloc. –

+0

Ah, gracias, 'siguiente' lo arreglé. – Schemer

Respuesta

22

Puede ignorar esto. gdb se queja de que no tiene la fuente de malloc, y es casi seguro que no quiere pasar por la fuente.

Dos soluciones fáciles:

  • Use next lugar de paso - no va a descender en funciones

  • Si tienes accidentalmente step ed en una función ya, utilizar finish para funcionar a la declaración de devolución de la función.

Y un enfoque alternativo:

  • También podría romper un poco antes de la violación de segmento, en lugar de pasar a través de todo el código.

    • Usted puede hacer esto poniendo un punto de interrupción en una línea determinada con break <source file>:<line num> (por ejemplo break foo.c:320 para romper la línea 320 de foo.c).
    • O puede interrumpir una función particular con break <function name> (por ejemplo, break foo se romperá en la parte superior de la función foo()).
Cuestiones relacionadas