1

我们有一个 .NET 应用程序。在某些特定机器上,应用程序不再响应。但是,在任务管理器中,该应用程序被列为“活动”(而不是“无响应”)。我们还可以在任务管理器中看到该进程一直使用 10% 的处理器。我们不知道它在做什么?

有没有办法我们可以看到正在调用什么代码或进程当前正在做什么(调用堆栈?)

编辑:显然我们不能使用远程调试器,因为机器没有通过网络连接,不支持通过互联网进行调试。CPU-analyzer.exe 程序看起来很棒,但我们无法让它工作?我们创建了一个转储文件并使用 windb 对其进行分析,这是输出:

.................................................WARNING: rsaenh overlaps cryptsp

.WARNING:RpcRtRemote 与 rsaenh 重叠 ......WARNING:WindowsCodecs 与 System_Drawing_ni 重叠 ........ ..WARNING:msdart 与 shfolder 重叠 ...WARNING:comsvc​​s 与 oledb32 重叠 ..... ..........警告:dhcpcsvc6 与 dhcpcsvc 重叠 .............警告:apphelp 与 GdiPlus 重叠 .........警告:winhttp 与 Faultrep 重叠.WARNING: webio 与 comctl32_71bf0000 重叠 ...... ...... wow64win!NtUserPeekMessage+0xa: 00000000`732efdea c3 ret 0:000> !analyze -v


  • *
  • 异常分析 *
  • *

* 警告:无法验证 AppName.exe 的校验和 错误:模块加载完成,但无法为 AppName.exe 加载符号 警告:符号时间戳错误 0x4ce7c496 0x4f9235ab 用于 GdiPlus.dll *警告:符号时间戳错误 0x4a5bdf81 0x4a5bda2e 用于 comsvc​​s.dll

FAULTING_IP: +a7d01d0 00000000`00000000 ?? ???

EXCEPTION_RECORD: ffffffffffffffff -- (.exr 0xffffffffffffffff) ExceptionAddress: 0000000000000000 ExceptionCode: 80000003 (Break 指令异常) ExceptionFlags: 00000000 NumberParameters: 0

FAULTING_THREAD:0000000000001678

PROCESS_NAME:AppName.exe

OVERLAPPED_MODULE:“msdart”和“shfolder”重叠的地址区域

ERROR_CODE: (NTSTATUS) 0x80000003 - {EXCEPTION} 断点 已到达断点。

EXCEPTION_CODE: (HRESULT) 0x80000003 (2147483651) - 一个或多个参数无效

MOD_LIST:

NTGLOBALFLAG:0

APPLICATION_VERIFIER_FLAGS:0

MANAGED_STACK: !dumpstack -EE 找不到导出转储堆栈

ADDITIONAL_DEBUG_TEXT:基于属性 [Is_ChosenCrashFollowupThread] 的后续集来自 Frame:[0] on thread:[PSEUDO_THREAD]

LAST_CONTROL_TRANSFER:从 00000000732cadb3 到 00000000732efdea

BUGCHECK_STR:APPLICATION_FAULT_STACKIMMUNE_NOSOS

PRIMARY_PROBLEM_CLASS:堆栈免疫

DEFAULT_BUCKET_ID:堆栈免疫

STACK_TEXT:
00000000 00000000 0000000000000000 未知!AppName.exe+0x0

SYMBOL_NAME:未知!AppName.exe

FOLLOWUP_NAME:机器所有者

MODULE_NAME:未知

IMAGE_NAME:未知

DEBUG_FLR_IMAGE_TIMESTAMP:0

STACK_COMMAND: ** 伪上下文 ** ; KB

FAILURE_BUCKET_ID:STACKIMMUNE_80000003_unknown!已卸载

BUCKET_ID:X64_APPLICATION_FAULT_STACKIMMUNE_NOSOS_unknown!AppName.exe

跟进:MachineOwner

这可能是罪魁祸首:“msdart”和“shfolder”重叠的地址区域?

4

4 回答 4

1

使用 Visual Studio 或 WinDbg 连接到此进程以查看调用堆栈和调试,和/或在您的应用程序中包含日志记录。这样您就可以将您的应用正在执行的操作写入日志文件。

听起来你正在阻止你的 GUI,但后台线程仍在工作。

于 2013-05-16T09:11:09.900 回答
1

在正在运行应用程序的主机上安装Visual Studio 远程调试器,然后附加到正在运行的进程。您将需要具有相同的 pdb 文件和源代码,以便您可以插入断点和调试。

检查此链接:

http://msdn.microsoft.com/en-us/library/vstudio/bt727f1t.aspx

您还可以将调试配置为在其他机器上远程启动应用程序,而不是连接到正在运行的进程。

于 2013-05-16T09:13:03.453 回答
1

你可以捕获一个转储并在windbg中打开它,输入!analyze -v让windbg为你做分析。对于挂起/无响应问题,!analyze -v不如崩溃有效。我通常~*kb200会列出所有线程的堆栈跟踪,这对于初步了解线程正在做什么非常有帮助,然后!locks可以告诉我是否有任何关键部分问题,有时我会检查堆栈上是否出现任何异常

于 2013-05-16T14:28:06.820 回答
0

问题是多线程死锁。在我们的主窗口下方显示了一个错误。因为我们无法在错误上单击确定,并且我们的主窗口正在等待关闭错误窗口,所以我们的应用程序挂起......

We identified the actual error by screen recording, while we shut down the app with task manager. For less than a second, we could see the error window, and by playing back the recording we could see what exactly the error was and fix it.

于 2013-06-05T11:10:04.233 回答