7

forgdb-7.0.1を使用していますが、コードの特定のセクションでループが発生しているバグを検出したと思います。forループは次のようになります

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

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

end/2反復回数でのコードの動作を理解したいので、steppingこの反復ポイントに到達nextingするi=0までは実行不可能です。

値を取得するgdbまでforループを続行し、ユーザーが反復番号を手動でステップ実行するのを待つように指示する方法はありますか?iend/2end/2

gcc-4.5.2UbuntuLinuxで使用しています

4

5 に答える 5

6

これは、gdbを使用した条件付きブレークポイントに関するチュートリアルです。

私はあなたがこれの用語を知らなかったと思います、さもなければそれはグーグルするのが簡単だったでしょう。

于 2012-04-16T18:19:06.730 に答える
5

ブレークポイントを設定すると、ブレークポイント番号が表示されます(今のところ、1であると仮定します)。次に、そのブレークポイントを条件付きにします。たとえば、次のようになります。

condition 1 i==end/2
于 2012-04-16T18:19:29.213 に答える
5

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

そしてSOについて:char * xが値が「hello」に等しい文字列を指している場合、gdbに条件付きブレークポイントを設定するにはどうすればよいですか?

あなたの場合(テストされていません):

break <line_number> if i==end/2
于 2012-04-16T18:20:25.343 に答える
1

そこにを配置しif (i == (end/2 -1)) { Foo; }、Fooにブレークポイントを設定すると、そこからステップを続行できるようになります。

于 2012-04-16T18:19:05.397 に答える
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構文を説明することはできません。ただし、条件を設定するよりも高速です。

于 2012-04-16T19:26:06.597 に答える