2012-02-10 4 views
18

Я пытаюсь отлаживать программу на C, и gdb сообщает мне, что существует строка segfault в строке 329 определенной функции. Поэтому я установил точку останова для этой функции, и я пытаюсь ее преодолеть. Однако всякий раз, когда я нажимаю строку 68, я получаю эту жалобу от gdb:Call to malloc failing in gdb session

(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 

Я не знаю, что это значит. Программа работает отлично на всех, кроме одного набора входов, поэтому этот вызов malloc явно преуспевает во время других исполнений программы. И, конечно, у меня есть:

#include <stdlib.h>. 

Вот исходный код:

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

Если malloc терпит неудачу, наиболее вероятной причиной является куча коррупции. Вы пытались запустить свою программу под valgrind? – JaredPar

+4

используйте 'next' вместо 'step'. Вы пытаетесь войти в malloc, и gdb жалуется, что у него нет доступа к исходному коду для malloc. Вы действительно не хотите вступать в malloc. –

+0

Ах, спасибо, 'next' исправил это. – Schemer

ответ

22

Вы можете спокойно игнорировать это. gdb жалуется, что у него нет источника для malloc - и почти наверняка вы не хотите проходить через источник.

Два простых решения:

  • Используйте next вместо шага - это не спускающиеся в функции

  • Если вы случайно step ред в функции уже используется finish бежать оператор возврата функции.

И альтернативный подход:

  • Вы также мог бы сломать немного перед Segfault, а не шагать через весь код.

    • Вы можете сделать это, поставив точку останова на конкретной линии с break <source file>:<line num> (например break foo.c:320 разбить на линии 320 foo.c).
    • Или вы можете прорваться на определенную функцию с помощью break <function name> (например, break foo будет ломаться в верхней части функции foo()).