Stoppen des Delphi-Programms in einer Endlosschleife
Wenn in Delphi eine unbestimmte Schleife auftritt, gibt mir der Debugger nicht einmal einen Stack-Trace, wenn ich die Stop-Taste drücke. Wenn ich den Verdacht habe, dass das Programm blockiert, kann ich einen Haltepunkt setzen, der stoppt, wenn dies die richtige unbestimmte Schleife ist.
Hier ist ein Beispielprogramm, um absichtlich eine unbestimmte Schleife zu verursachen:
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;
Wenn ich angehalten werde, erhalte ich etwas, das so aussieht:
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
...
Wenn ich einen Schritt (F7) mache, springt er ein paar Zeilen weiter und bleibt dann stehen, bis ich wieder break drücke. An diesem Punkt erhalte ich das gleiche Ergebnis.