调用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));
答
可以放心地忽略这一点。 gdb抱怨说它没有malloc的源代码 - 而且几乎可以肯定你不想单步执行源代码。
两个简单的解决方案:
使用
next
,而不是一步 - 它不会陷入功能如果你不小心
step
编入功能已经使用finish
运行到函数的返回语句。
而另一种方法:
-
您也可以在段错误之前打破了一下,而不是通过整个代码加强。
- 您可以通过将一个断点在特定符合
break <source file>:<line num>
做到这一点(例如break foo.c:320
打破在文件foo.c的320线)。 - 或者您可以使用
break <function name>
(例如break foo
将在foo()
函数的顶部中断)打破特定功能。
- 您可以通过将一个断点在特定符合
如果malloc失败,最可能的原因是堆损坏。你有没有尝试在valgrind下运行你的程序? – JaredPar 2012-02-10 00:03:45
使用'下一步'而不是'步骤'。你正在尝试进入malloc,并且gdb抱怨说它无法访问malloc的源代码。你真的不想步入malloc。 – 2012-02-10 00:12:42
啊,谢谢,'接下来'修好了。 – Schemer 2012-02-10 00:23:10