使用gdb时调用malloc失败

22

我正在尝试调试一个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));

2
如果malloc失败,最有可能的原因是堆损坏。您尝试在valgrind下运行程序了吗? - JaredPar
4
请使用“next”代替“step”。您正试图步进到malloc中,而gdb正在抱怨它无法访问malloc的源代码。您真的不想步进到malloc中。 - William Pursell
2
包含 malloc 函数的源代码在 gdb 中怎么样?我们该如何做到这一点? - Paschalis
1个回答

26

您可以安全地忽略此警告。gdb报错是因为它没有malloc的源代码,而您几乎肯定不想跟踪源代码。

两个简单的解决方案:

  • 使用next而不是step - 它不会进入函数中

  • 如果您已经意外地step进入了函数,请使用finish运行到函数的return语句处。

还有一种替代方法:

  • 您也可以在segfault之前断点停止,而不是通过整个代码进行步进。

    • 您可以通过在特定行上使用break <源文件>:<行号>(例如break foo.c:320在foo.c的第320行中断)来实现这一点。
    • 或者您可以在特定函数上使用break <函数名>(例如break foo将在foo()函数的顶部中断)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接