【发布时间】:2012-10-24 20:25:04
【问题描述】:
当 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) 时,它单步走几行,然后锁定,直到我再次按下 break,此时我得到相同的结果。
【问题讨论】:
-
您没有在这个问题或上一个问题中指出您使用的是哪个版本的 Delphi。由于这可能是特定于版本的,因此您可能需要添加一个指示该版本以及一般
delphi的标签。 -
Delphi XE3 是开始使用的版本。
-
如果您在可疑循环中设置断点,您将看到程序执行是否在那里停止。
-
当您开始单步执行时,您确定您正在执行正确的线程吗? Delphi 不知道你想要哪个线程,所以它只是选择一个。确保选择主线程,然后然后检查调用堆栈。
-
我的问题是如何让调试器向我显示程序停止的位置。出于某种原因,即使我只使用一个线程,调试器中也有四个线程。 Rob Kennedy 回答了我的问题,指出我必须选择正确的线程,然后我才能看到程序停止的位置。发生的事情是我试图在汇编中单步运行,希望能找到我的源代码,但我在错误的线程中(而且我从未创建过)。
标签: delphi debugging delphi-xe3