我有一个变量被破坏。我想看看这是在哪里发生的,所以观察点是显而易见的选择,除了这个变量经常被设置(在这种情况下,处理网络数据包并且它为每个数据包设置一次)。我想从应该写入变量的位置免除观察点。基本上,我想要的是“如果 line_number != x 则观察变量”;gdb 文档在条件表达式上似乎有点薄,所以我不确定这是可能的......
问问题
243 次
1 回答
1
在以下源文件中有几种方法可以做到这一点。
struct stuff {
int watched;
};
void dont_hit(struct stuff *foo) {
begin:
for (int i = 0; i < 100; i++)
foo->watched = i;
end:
return;
}
void hit(struct stuff *foo) {
foo->watched = 1024;
}
int main()
{
struct stuff foo;
setup:
dont_hit(&foo);
hit(&foo);
dont_hit(&foo);
}
然后我们可以使用观察点条件: if $pc != ... 如下所示:
(gdb) break main
(gdb) r
(gdb) watch foo.watched
(gdb) c
Hardware watchpoint 2: foo.watched
Old value = -8320
New value = 0
dont_hit (foo=0x7fffffffde90) at main.c:7
7 for (int i = 0; i < 100; i++)
(gdb) p $pc
$1 = (void (*)()) 0x4004c0 <dont_hit+26>
(gdb) watch -location foo->watched if $pc != 0x4004c0
ardware watchpoint 3: -location foo->watched
(gdb) delete 2
(gdb) c
Continuing.
Hardware watchpoint 3: -location foo->watched
Old value = 99
New value = 1024
hit (foo=0x7fffffffde90) at main.c:15
另一种方法是使用断点在我们不希望它触发的地方启用/禁用观察点,为了清楚起见,我在这里使用标签的 setup/begin/end,但是您可以将 main:label 替换为 filename:line_number
break main:setup
run
watch -location foo.watched
break dont_hit:begin
commands
silent
disable 2
cont
end
break dont_hit:end
commands
silent
enable 2
cont
end
第三种方法是使用 Python 和 FinishBreakpoints 来进行启用/禁用。
于 2017-04-21T02:14:44.223 回答