在gdb会话中调用malloc失败

我正在尝试调试一个C程序,gdb告诉我在某个函数的第329行有一个段错误。 所以我为该function设置了一个断点,我试图逐步完成它。 但是,每当我点击第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 . 

这是源代码:

  // 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:的特定行上放置一个断点来实现这一点(例如,在break foo.c:320break foo.c:320 )。
    • 或者你可以使用break 打破一个特定的函数(例如, break foo将在foo()函数的顶部中断)。