GDB:是否有一个命令可以让你看到一个函数被调用了多少次?

时间:2011-10-20 03:53:11

标签: c gdb

我目前不得不编写malloc()和free()的实现,并且给出了一个将运行我的两个实现的驱动程序。

但是目前,我是segfaulting,因为free()试图释放数十亿字节(这是错误的)有效载荷大小。我有运行GDB的行号和行号,但是我需要知道malloc()和free()是否被多次调用,以确认确实存在至少一个的情况运行顺利。

4 个答案:

答案 0 :(得分:10)

首先为malloc和free设置断点。然后使用具有高值的“ignore”命令来抑制在这些断点处真正停止。 GDB仍将计算断点被击中的次数。当您调用“info breakpoints”时,GDB会向您显示这些计数。

答案 1 :(得分:5)

只需完成Martin的信息,运行gdb,然后在gdb提示符下运行:

b <file:line_number or function name>
ignore <breakpoint identifier> 100000

然后你运行你的可执行文件(或你恢复),然后,当你想在gdb提示符上检查断点被击中的次数时:

info breakpoints

答案 2 :(得分:0)

这是条件断点的一个很好的用例,您可以过滤掉超出大小阈值的调用。使用vertices$size[vertices$size==0] <- sub(".*\\.", "", vertices$name[vertices$size==0]) 中的if (condition)子句。

linux上的另一个选择是使用break来设置探测和捕获参数。有关详细信息,请参阅perf。这使您可以非侵入地检测二进制文件并跟踪所有调用。 perf probe适用于输出结果。

答案 3 :(得分:-2)

(gdb)帮助打破了 在指定的行或功能处设置断点 break [LOCATION] [thread THREADNUM] [if CONDITION]
LOCATION可以是行号,功能名称或“*”和地址 如果指定了行号,则在该行的代码开头处中断 如果指定了某个函数,则在该函数的代码开头处中断 如果指定了地址,请在该确切地址处中断 如果没有LOCATION,则使用所选堆栈帧的当前执行地址 这对于在返回堆栈帧时中断非常有用。