【发布时间】: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