【问题标题】:Stopping delphi program in an infinite loop在无限循环中停止delphi程序
【发布时间】: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


【解决方案1】:

由 Rob Kennedy 在 cmets 中回答。我必须从调试窗口打开线程视图以获取线程列表并选择正确的线程;那时我可以看到我的程序无限循环的地方。

【讨论】:

    【解决方案2】:

    作为替代答案:考虑到您使用的是 Delphi XE3,它与探查器捆绑在一起:AQTime,它将真正快速地找到类似的东西。

    【讨论】:

      猜你喜欢
      • 2015-02-07
      • 2015-11-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-01-13
      • 1970-01-01
      • 2018-11-03
      • 1970-01-01
      相关资源
      最近更新 更多