2017-04-21 4 views
0

変数が壊れています。この変数が頻繁に設定される(この場合、ネットワークパケットを処理し、パケットごとに1回設定される)ことを除いて、ウォッチポイントが明白な選択です。私は変数がと書かれていると想定されている場所からウォッチポイントを免除したいと思います。基本的に、私が望むのは "line_numberならば変数を見てください!="です。 gdbドキュメントは条件式では少し薄いと思われるので、これが可能かどうかはわかりません...特定の場所でトリガされた場合を除き、gdbウォッチポイント

答えて

1

次のソースファイルでは、これを行う方法がいくつかあります。 !$ 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 

もう一つの方法は、我々は場所で有効/無効にするためにウォッチポイントをブレークポイントを使用することである私たちは、その後、ウォッチポイントの条件を使用することができます

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

、それが引き金にしたくない私は、わかりやすくするために、ラベルのここでのセットアップ/開始/終了を使用していますが、あなたはメイン置き換えることができます。ファイル名でレーベル:

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 

第三の方法LINE_NUMBER、Pを使用しようとしていますython、およびFinishBreakpointsを使用して、有効化/無効化を行います。

+0

$ _!= 0x8049831ならばwatch_pktlenを試してみました(アドレスはウォッチポイントがトリップしたときのアドレスです)しばらくしてから実行しました:再帰的内部問題。 中止(コアダンプ) – abatie

+0

$ _ – abatie

+0

の代わりに$ pcを使用した場合と同じ結果gdbの問題点を示しています。再現性のないものを言うのは難しい。とにかくこれは良い答えであり、このテクニックはうまくいきます。 –

関連する問題