如何在创建条件断点时使GDB用其当前值替换变量

时间:2010-12-28 16:41:06

标签: gdb

我希望GDB在创建条件断点时执行变量替换。例如:

set variable $my_value = 1
b my_function if my_param == $my_value
set variable $my_value = 5
b my_function if my_param == $my_value

这实际上创建了2个相同的断点,当my_param等于$ my_value的当前值时,断点在my_function()中。因此,当运行我的程序时,只有当my_param等于5时才会触发断点。我真正想要的是两个不同的条件断点,值为1和5。

有没有办法让GDB使用方便变量的当前值而不是变量本身设置这样的条件断点?

我问这个问题,因为我正在尝试创建一个GDB脚本来跟踪内存释放,这将自动设置条件断点,例如。

# set breakpoint after malloc() statement of interest
b some_file.c:2238
# define commands to execute when the above breakpoint is hit
commands
# $last is set to the allocated memory address
set variable $last = new_pointer
# set conditional breakpoint in free() to check when allocated pointer is released
b free if ptr == $last
continue
end

但当然我发现这只适用于最后一个指针值,因为我所有自动生成的断点都是相同的!

我将调查Python脚本的使用,看看这是否可以解决我的问题,但由于我没有Python的经验,我想先发布这个问题!我确信应该可以做我想做的事情,并且非常感谢任何帮助或建议。

2 个答案:

答案 0 :(得分:5)

为了完整起见,这里是如何在原始示例中使用eval命令:

set variable $my_value = 1
eval "b my_function if my_param == %d", $my_value
set variable $my_value = 5
eval "b my_function if my_param == %d", $my_value

根据需要为值1和5生成两个断点!

答案 1 :(得分:3)

使用eval命令(显然在gdb 7.2及更高版本中)