【问题标题】:App busy but not responding : how to check what it's doing?应用程序忙但没有响应:如何检查它在做什么?
【发布时间】:2013-05-16 09:08:01
【问题描述】:

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

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

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

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

.WARNING: RpcRtRemote 与 rsaenh 重叠 ......警告:WindowsCodecs 与 System_Drawing_ni 重叠 ........... .......警告:msdart 与 shfolder 重叠 ...警告: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 for GdiPlus.dll * 警告:comsvc​​s.dll 的符号时间戳错误 0x4a5bdf81 0x4a5bda2e

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

EXCEPTION_RECORD: ffffffffffffffff -- (.exr 0xffffffffffffffff) 异常地址:0000000000000000 ExceptionCode:80000003(Break指令异常) 异常标志: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] 线程:[PSEUDO_THREAD]

LAST_CONTROL_TRANSFER:从 00000000732cadb3 到 00000000732efdea

BUGCHECK_STR:APPLICATION_FAULT_STACKIMMUNE_NOSOS

PRIMARY_PROBLEM_CLASS:堆栈免疫

DEFAULT_BUCKET_ID:堆栈免疫

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

SYMBOL_NAME:未知!AppName.exe

FOLLOWUP_NAME:MachineOwner

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”的地址区域重叠??

【问题讨论】:

  • 我们倾向于使用this live profiler - 可以很好地完成工作(尽管我们修改了它来为我们聚合堆栈,因为我们随时都有很多工作要做)。它的好处是不需要任何工具 - 只需运行 exe。
  • 现在不可以从错误的机器中获取任务管理器中的进程转储并将它们加载到 VS 中吗?我会提交这个答案,但我不确定这会给你从一个实时(非崩溃)过程中带来什么。
  • @Marc:谢谢,我们下载了 cpu-analyzer.exe,但是当我们从命令行启动它时,例如:cpu-analyzer AppName /S 10 /I 1000,我们只能得到有关使用情况的信息和一个例子:Usage: cpu-analyzer ProcessName:PID [options] ... etc.. but no other information?
  • @RunCMD 你用你自己的 exe 名字代替了 AppName 吗?
  • 是的,如果是错误的应用程序名称,我们会收到错误:错误:找不到具有该名称的任何进程

标签: c# .net windows debugging remote-debugging


【解决方案1】:

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

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

【讨论】:

  • 如果 GUI 以经典方式被阻止,它将报告为“无响应” - 系统只是将消息放到队列中并查看应用程序是否选择它
  • 好吧,应用程序“不再响应”——不管这意味着什么 ;-) 只能猜测...
【解决方案2】:

在运行应用程序的主机上安装visual studio remote debugger,然后附加到正在运行的进程。您需要拥有相同的 pdb 文件和源代码,以便插入断点和调试。

查看此链接:

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

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

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

      我们通过屏幕录制确定了实际错误,同时使用任务管理器关闭了应用程序。在不到一秒钟的时间里,我们可以看到错误窗口,通过回放录音,我们可以看到究竟是什么错误并修复它。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-03-30
        • 1970-01-01
        • 2015-08-16
        • 1970-01-01
        • 2020-01-21
        相关资源
        最近更新 更多