私は、次のより複雑なバージョンがあります。私の場合は関数の終わりに、関数が返す関数に基づいて条件付きブレークポイントを設定することはできますか?
unsigned int foo();
unsigned int bar();
unsigned int myFunc() {
return foo()+bar();
}
は、myFunc
は多くの場所から呼び出されます。文脈の1つでは、何かが間違っている。私は、この関数の戻り値が悪いときに何をデバッグするかを知っていますが、残念ながら私はどのパスがこの値になったのか分かりません。
"foo()+ bar()"という式の結果を格納した一時変数を追加して、その値に条件付きブレークポイントを追加することができましたが、別の方法で実行できるかどうかは疑問でした。
私はx86アーキテクチャに取り組んでいます。
私は関数からの戻りの正確な位置にブレークポイントを設定すると考えていたthisとthis答えから:
gdb> break *$eip
そして$のEAXレジスタに基づいて、条件付きブレークポイントを追加しますが、少なくとも、私のテストでは、ここでの復帰はこの登録簿にはありません。
これは可能ですか?
あなたが逆アセンブリリストせずにこれを実行しようとしているように聞こえます。本当の場合、最初のステップはコンパイラを実行することです(フラグを今思い出すことができません-s?)。しかし、私は尋ねる必要があります:一時的な変数は本当に悪いですか?はい、あなたはメモリストア/リトリーブを持っていますが、オプティマイザはそれを削除する必要があります。ああ、あなたの最適化レベルは?デバッグには非常に低いはずです。 – kdgregory
現実の状況では、問題の関数はいくつかのboost構造体を使ったテンプレートです。これはフォームをいくつかの場所と呼んでいるので、私が探している値がわかるまで、ブレークポイントとrepeatidlyを "finish"に追加するほうが実際は速いです。私はこれを "自動化"できると思っていた。最適化に関しては、完全にオフにする必要があります:-O0。 –