2017-04-21 58 views
0

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

回答

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); 
} 

然后我们就可以使用观察点条件:如果$ 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 

另一种方法是使用断点允许/禁止的地方观察点我们不希望它触发,我使用的标签的位置设置/开始/为清楚起见结束,但可以更换主:与文件名标签: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 

第三种方法,是要请使用P ython和FinishBreakpoints来执行启用/禁用。

+0

我试过“看orig_pktlen如果$ _!= 0x8049831”(地址是它在观察点跳闸时的地址),它跑了一段时间然后给出:递归内部问题。 Aborted(核心转储) – abatie

+0

使用$ pc而不是$ _的相同结果_ – abatie

+0

这表明gdb中存在一些不良问题。很难说没有繁殖者。无论如何,这是一个很好的答案,这种技术确实有效。 –