除非在特定位置触发,否则gdb观察点?

时间:2017-04-21 01:03:04

标签: gdb watchpoint

我有一个变量被破坏了。我想看看这发生了什么,所以观察点是明显的选择,除了这个变量经常被设置(在这种情况下,处理网络数据包并为每个数据包设置一次)。我想将观察点从变量假设的位置中豁免写入。基本上,我想要的是“如果line_number!= x,则观察变量”;条件表达式上的gdb文档似乎有点薄,所以我不确定这是可能的......

1 个答案:

答案 0 :(得分: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

另一种方法是使用断点在我们不希望触发的地方启用/禁用观察点,为了清楚起见,我使用标签设置/开始/结束,但是你可以用filename:line_number

替换main:label
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来启用/禁用。