2012-02-10 19 views
18

Próbuję debugować program w języku C, a gdb mówi mi, że w linii 329 pewnej funkcji występuje błąd segfault. Dlatego ustawiłem punkt przerwania dla tej funkcji i próbuję ją przejrzeć. Jednak za każdym razem, gdy trafiam linię 68, otrzymuję tę skargę od gdb:Zadzwoń do błędu malloc w sesji 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 

Nie wiem, co to oznacza. Program działa perfekcyjnie na wszystkich zestawach wejść oprócz jednego, więc to wywołanie malloc wyraźnie powiedzie się podczas innych wykonań programu. I, oczywiście, mam:

#include <stdlib.h>. 

Oto kod źródłowy:

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

Jeśli malloc nie działa, najprawdopodobniej przyczyną jest uszkodzenie sterty. Czy próbowałeś uruchomić swój program w Valgrind? – JaredPar

+4

użyj "następnego" zamiast "kroku". Próbujesz wejść do malloc, a gdb skarży się, że nie ma dostępu do kodu źródłowego dla malloc. Naprawdę nie chcesz wejść do malloc. –

+0

Ah, dzięki, "next" to naprawił. – Schemer

Odpowiedz

22

można bezpiecznie zignorować. gdb skarży się, że nie ma źródła dla malloc - i prawie pewne, że nie chcesz przechodzić przez źródło.

Dwa proste rozwiązania:

  • Stosować next zamiast kroku - to nie będzie zejść do funkcji

  • Jeśli przypadkowo step ed do funkcji już używać finish biec do instrukcja return funkcji.

i alternatywne podejście:

  • Można również złamać trochę przed segfault, zamiast intensyfikacji przez cały kod.

    • Można to zrobić poprzez umieszczenie punktu przerwania na danej linii z break <source file>:<line num> (np break foo.c:320 złamać on line 320 foo.c).
    • Lub możesz złamać konkretną funkcję za pomocą break <function name> (na przykład break foo zostanie przerwane na górze funkcji foo()).