我正在尝试调试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));
答案 0 :(得分:24)
你可以放心地忽略这一点。 gdb抱怨它没有malloc的源代码 - 而且几乎可以肯定你不想逐步完成源代码。
两个简单的解决方案:
使用next
代替步骤 - 它不会进入功能
如果您已经意外地step
加入了某个函数,请使用finish
运行该函数的return语句。
另一种方法:
你也可以在segfault之前稍微破解一下,而不是单步执行整个代码。
break <source file>:<line num>
的特定行上设置断点(例如break foo.c:320
来断开foo.c的第320行)来执行此操作。break <function name>
打破特定功能(例如break foo
会在foo()
功能的顶部中断。