2012-04-16 3 views
7

gdb-7.0.1を使用していて、 にforループがあるコードの特定のセクションでバグが検出されたと思います。 forループはここでgdb内の特定の反復回数まで

for (int i=0 ; i< end ; ++i) 
{ 
    //Code here. 
} 

endのように見える非常に大きな整数です。コードは最初の反復でクラッシュせず、反復番号end/2のどこかでクラッシュするようです。

私はこの反復点に達するまでi=0から反復数end/2、ちょうどsteppingnextingでのコードの動作を理解したいので、実現不可能です。

し、手動で反復数end/2をステップ実行するユーザのために値end/2待ってますiまでforループを続行するgdbを伝える方法はありますか?

私はあなたがそこからステッピング続けることができると思われる、Fooのにブレークポイントを設定し、そこにif (i == (end/2 -1)) { Foo; }を配置することができるはずUbuntu Linuxの

+0

http://blog.vinceliu.com/2009/07/gdbs-conditional-breakpoints.html –

答えて

5

ブレークポイントを設定すると、ブレークポイント番号が与えられます(現時点では1と仮定します)。次に、そのブレークポイントを条件付きにします。

condition 1 i==end/2 
1

gcc-4.5.2を使用しています。

+0

+1 @LuchianGrigoreが示唆するように、条件付きブレークポイントが見つかるまでこれは私の方法でした。 –

+0

ありがとう、私は十分にgdbを流暢にそれで拾っていないよ。私は、それがより鋭敏なものに直面してもそれを放置する十分に一般的な解決策であると考えました。 –

6

conditional breakpointsとgdbのチュートリアルです。

私はあなたがこの言葉を知らなかったと思っています。そうでなければ、グーグルにとっては簡単でした。

+0

もう1つの方法は、 '(gdb)ignore end/2-1'です。 –

5

条件付きブレークポイントを使用する必要があります。ここではそれについての詳細です:http://www.cs.cmu.edu/~gilpin/tutorial/#3.4

など:How do I set a conditional breakpoint in gdb, when char* x points to a string whose value equals "hello"?あなたのケースでは

(テストしていません):

break <line_number> if i==end/2 
+0

これが行く方法であることを確認できます。私はいつもgdbを使っています... –

1

endは大きな(数万で)、その後、条件付きである場合ブレークポイントの解決は非常に遅くなる可能性があります - gdbはループのたびに条件を評価する必要があります。これはあなたのための問題である場合は、このトリックを使用することができます

for (int i=0 ; i< end ; ++i) 
{ 
    if (i == end/2) 
     i %= end ; // This has no effect, but lets you set a breakpoint here 
    //Code here. 
} 

を、私はこれを行う:-)

別の解決策のすべての時間は、ブレークポイントにスキップカウントを設定することです。私はQt環境でgdbを使用しているので、gdbの構文を与えることはできません。しかし、条件を設定するよりも速いです。

関連する問題