调用malloc在gdb会话中失败

问题描述:

我想调试一个C程序,gdb告诉我在某个函数的第329行有段错误。所以我为这个功能设定了一个中断点,并且我试图通过它。然而,无论何时我击中第68行,我都会收到gdb的投诉:调用malloc在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 2012-02-10 00:03:45

+4

使用'下一步'而不是'步骤'。你正在尝试进入malloc,并且gdb抱怨说它无法访问malloc的源代码。你真的不想步入malloc。 – 2012-02-10 00:12:42

+0

啊,谢谢,'接下来'修好了。 – Schemer 2012-02-10 00:23:10

可以放心地忽略这一点。 gdb抱怨说它没有malloc的源代码 - 而且几乎可以肯定你不想单步执行源代码。

两个简单的解决方案:

  • 使用next,而不是一步 - 它不会陷入功能

  • 如果你不小心step编入功能已经使用finish运行到函数的返回语句。

而另一种方法:

  • 您也可以在段错误之前打破了一下,而不是通过整个代码加强。

    • 您可以通过将一个断点在特定符合break <source file>:<line num>做到这一点(例如break foo.c:320打破在文件foo.c的320线)。
    • 或者您可以使用break <function name>(例如break foo将在foo()函数的顶部中断)打破特定功能。