5

Delphi で無限ループが発生すると、停止ボタンを押しても、デバッガーはスタック トレースを表示しません。プログラムが停止している疑いがある場合は、ブレークポイントを設定すると、それが正しい無限ループであれば停止します。

以下は意図的に無限ループを発生させるサンプルプログラムです。

procedure TForm1.btnDebugInfiniteLoopClick(Sender: TObject);
var I: Integer;
begin
    I:=0;
    while I<100 do begin
        I:=1+1;
        if I>64 then I:=I div 2;
    end;
end;

停止すると、次のようになります。

ntdll.RtlUserThreadStart:
776301B4 89442404         mov [esp+$04],eax
776301B8 895C2408         mov [esp+$08],ebx
776301BC E9E99C0200       jmp $77659eaa
776301C1 8DA42400000000   lea esp,[esp+$0000]
776301C8 8DA42400000000   lea esp,[esp+$0000]
776301CF 90               nop 
ntdll.KiFastSystemCall:
776301D0 8BD4             mov edx,esp

...

シングル ステップ (F7) を実行すると、数行だけステップ実行し、ブレークを再度押すまでロックされます。ブレークした時点で同じ結果が得られます。

4

2 に答える 2

7

ロブ・ケネディのコメントで回答。スレッドのリストを取得して正しいスレッドを選択するには、デバッグ ウィンドウからスレッド ビューを開く必要があります。その時点で、プログラムが無期限にループしている場所を確認できます。

于 2012-10-25T00:50:55.230 に答える
1

別の答えとして:Delphi XE3を使用していることを考えると、プロファイラー:AQTimeがバンドルされており、このようなものを非常に高速に検出します。

于 2012-10-25T07:09:03.607 に答える