2009-09-04 12 views
3

私は、次のより複雑なバージョンがあります。私の場合は関数の終わりに、関数が返す関数に基づいて条件付きブレークポイントを設定することはできますか?

unsigned int foo(); 
unsigned int bar(); 

unsigned int myFunc() { 
    return foo()+bar(); 
} 

は、myFuncは多くの場所から呼び出されます。文脈の1つでは、何かが間違っている。私は、この関数の戻り値が悪いときに何をデバッグするかを知っていますが、残念ながら私はどのパスがこの値になったのか分かりません。

"foo()+ bar()"という式の結果を格納した一時変数を追加して、その値に条件付きブレークポイントを追加することができましたが、別の方法で実行できるかどうかは疑問でした。

私はx86アーキテクチャに取り組んでいます。

私は関数からの戻りの正確な位置にブレークポイントを設定すると考えていたthisthis答えから:

gdb> break *$eip 

そして$のEAXレジスタに基づいて、条件付きブレークポイントを追加しますが、少なくとも、私のテストでは、ここでの復帰はこの登録簿にはありません。

これは可能ですか?

+0

あなたが逆アセンブリリストせずにこれを実行しようとしているように聞こえます。本当の場合、最初のステップはコンパイラを実行することです(フラグを今思い出すことができません-s?)。しかし、私は尋ねる必要があります:一時的な変数は本当に悪いですか?はい、あなたはメモリストア/リトリーブを持っていますが、オプティマイザはそれを削除する必要があります。ああ、あなたの最適化レベルは?デバッグには非常に低いはずです。 – kdgregory

+0

現実の状況では、問題の関数はいくつかのboost構造体を使ったテンプレートです。これはフォームをいくつかの場所と呼んでいるので、私が探している値がわかるまで、ブレークポイントとrepeatidlyを "finish"に追加するほうが実際は速いです。私はこれを "自動化"できると思っていた。最適化に関しては、完全にオフにする必要があります:-O0。 –

答えて

3

これはおそらくあなたがしたくないことですが、私にとっては、$ eax(または$ raxの場合は64ビットの場合は最後の命令に条件付きブレークポイントを設定します。 x86)はうまく動作します。

コードGDBを使用して

unsigned int foo(void) { return 1; } 
unsigned int bar(void) { return 4; } 
unsigned int myFunc(void) { return foo()+bar(); } 

については

..

(gdb) disass myFunc 
Dump of assembler code for function myFunc: 
0x080483d8 <myFunc+0>: push %ebp 
0x080483d9 <myFunc+1>: mov %esp,%ebp 
0x080483db <myFunc+3>: push %ebx 
0x080483dc <myFunc+4>: call 0x80483c4 <foo> 
0x080483e1 <myFunc+9>: mov %eax,%ebx 
0x080483e3 <myFunc+11>: call 0x80483ce <bar> 
0x080483e8 <myFunc+16>: lea (%ebx,%eax,1),%eax 
0x080483eb <myFunc+19>: pop %ebx 
0x080483ec <myFunc+20>: pop %ebp 
0x080483ed <myFunc+21>: ret  
End of assembler dump. 
(gdb) b *0x080483ed if $eax==5 
Breakpoint 1 at 0x80483ed 
(gdb) run 
Starting program: /tmp/x 
Breakpoint 1, 0x080483ed in myFunc() 
(gdb) 
0

コマンドラインからコンパイルするかどうかはわかりませんが、Visual Studioではブレークポイントを設定したら右クリックしてダイアログの「条件...」オプションをクリックしますブレークポイントのブレークポイントの条件を編集できるように見えるようにします。

希望すると便利です。 :-)

+0

返事をありがとう。私の場合、私はLinux上でg ++/gdbを使用しています。しかし、これは条件付きブレークポイントを追加することではなく、プログラム内で変数として表現されていないものの条件を追加することです。 VSでは、名前付き変数を実際に持たなくても返される値を参照できますか? –

+0

関数が返す結果に応じてブレークすることがあるので、正しく理解すれば変数はまだ分かっていません。しかし、私はLinuxプログラミングについてよく知らない。私はより良い助けになることができればと思います。 –

関連する問題