【问题标题】:Program freezes but the CPU utilization is zero程序冻结但 CPU 利用率为零
【发布时间】:2017-02-06 11:36:26
【问题描述】:

有时我的程序会冻结。如果我点击“暂停程序”,它会显示:

ntdll.RtlUserThreadStart:
773301C4 89442404         mov [esp+$04],eax
773301C8 895C2408         mov [esp+$08],ebx
773301CC E9E9960200       jmp $773598ba
773301D1 8DA42400000000   lea esp,[esp+$0000]
773301D8 8DA42400000000   lea esp,[esp+$0000]
773301DF 90               nop 

“调用堆栈”窗口为空!

按三下F8,程序跳转到

ntdll.RtlInitializeExceptionChain:
7735989F 8BFF             mov edi,edi

我无法按需重现它,但我每天都会看到一次问题(也许更少?)。
编译器/调试器以 32 位运行。

知道这是调试器的问题吗?我过去遇到过类似的情况:有时当您从 Delphi 应用程序运行外部应用程序时,调试器会冻结。这是 Delphi XE7 的记录错误。所以,我在想,也许这是一个类似/相关的错误?


【问题讨论】:

  • 这是一个类似的问题,但在我的情况下,CPU 为 0%,我无法选择线程:stackoverflow.com/questions/13057133/…
  • 很难说。很容易成为您的代码中的缺陷。这肯定是最有可能的解释。
  • 这正是它所做的。由于代码中的缺陷,闻起来像死锁。作为一般规则,在找到相反证据之前,您应该假设缺陷存在于您的代码中,而不是系统中。
  • 当我点击“暂停程序”时,调试器不应该在当前执行的代码中停止吗?它在“正常”冻结期间执行此操作,例如,当程序进入一个大的 FOR 循环(100% CPU 利用率)时。它显示了堆栈。那么,为什么这个案例很特别呢?如果没有 CPU 利用率,为什么程序会冻结。我不使用线程(确实,我有一个可以使用线程的 TWebBrowser)。
  • 添加 madExcept 并在程序冻结时使用 madTraceProcess 拉出堆栈跟踪。然后寻找你的缺陷。

标签: delphi delphi-xe7


【解决方案1】:

我在这里取得了进步!我在我的一个程序中发现了类似的问题。由于此代码,当我尝试在自定义列表框中加载大文本(超过 100000)时出现冻结:

MyListBox.Items.Text:= xxx;


procedure TMyListBox.LBADDSTRING(var M: TMessage);   { This makes the control slow when I work with 100000 lines }
begin
 inherited;
 if Assigned(FOnChange)
 then FOnChange(Self, lbAdded);
end;

执行点每行运行 LBADDSTRING(100000 次)。所以,它似乎被冻结了。

奇怪的是,如果我暂停程序,Delphi 无法准确显示我的程序的执行点(我检查了所有 5 个线程)。所以,这一切归根结底都是Delphi调试器的缺陷。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-26
    • 1970-01-01
    • 2019-11-22
    • 2021-03-02
    相关资源
    最近更新 更多