c-在gdb会话中调用malloc失败



我正在调试一个C程序,gdb告诉我某个函数的329行有一个segfault。所以我为这个函数设置了一个断点,我正试图通过它。然而,每当我到达第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));

您可以安全地忽略这一点。gdb抱怨它没有malloc的源代码,而且几乎可以肯定的是,您不想遍历源代码。

两个简单的解决方案:

  • 使用next而不是步骤-它不会下降到功能

  • 如果您已经意外地将step插入到函数中,请使用finish运行到该函数的return语句。

还有一种替代方法:

  • 您也可以在segfault之前中断一点,而不是遍历整个代码。

    • 您可以通过在具有break <source file>:<line num>的特定行上放置断点来实现这一点(例如,在foo.c的第320行中断break foo.c:320
    • 或者,您可以使用break <function name>中断特定函数(例如,break foo将在foo()函数的顶部中断)

相关内容

  • 没有找到相关文章

最新更新