Ошибка вызова malloc в сеансе GDB - PullRequest
20 голосов
/ 10 февраля 2012

Я пытаюсь отладить программу на C, и GDB сообщает мне, что в строке 329 определенной функции есть ошибка. Поэтому я установил точку останова для этой функции и пытаюсь пройти через нее. Однако всякий раз, когда я набираю номер 68, я получаю эту жалобу от 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

Я не знаю, что это значит. Программа отлично работает на всех, кроме одного набора входных данных, так что этот вызов 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));

1 Ответ

25 голосов
/ 10 февраля 2012

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

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

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

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

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

  • Вы могли бы также немного сломаться перед segfault, вместо того, чтобы перебирать весь код.

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