当在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)时,单步几行,然后锁定直到我再次击中,此时我得到相同的结果。
答案 0 :(得分:6)
Rob Kennedy在评论中回答。我必须从调试窗口打开一个线程视图来获取线程列表并选择正确的线程;在那一点上,我可以看到我的程序无限循环。
答案 1 :(得分:0)
作为替代答案:考虑到你正在使用Delphi XE3,它与探查器捆绑在一起:AQTime会发现这样的事情真的很快。