我们有一个.NET应用程序。 在某些特定的机器上,应用程序不再响应。但是,在任务管理器中,应用程序被列为“活动”(而不是“未响应”)。我们还可以在任务管理器中看到该进程持续使用10%的处理器。 我们不知道它在做什么?
有没有办法可以看到调用什么代码或进程当前正在做什么(调用堆栈?)
编辑:显然我们不能使用远程调试器,因为机器没有通过网络连接,不支持通过互联网进行调试。 CPU-analyzer.exe程序似乎很棒,但我们无法让它工作? 我们已经创建了一个转储文件并使用windb对其进行了分析,这是输出:
.................................................WARNING: rsaenh overlaps cryptsp
。警告:RpcRtRemote与rsaenh重叠 ......警告:WindowsCodecs与System_Drawing_ni重叠 ........ .......警告:msdart与shfolder重叠 ...警告:comsvcs与oledb32重叠 ...............警告:dhcpcsvc6重叠dhcpcsvc ................警告:apphelp与GdiPlus重叠 .........警告:winhttp与Faultrep重叠 。警告:webio与comctl32_71bf0000重叠 ............. ...... wow64win NtUserPeekMessage +是0xA! 00000000`732efdea c3 ret 0:000> !analyze -v
*警告:无法验证AppName.exe的校验和 错误:模块加载已完成但无法为AppName.exe加载符号 警告:符号时间戳错误0x4ce7c496 0x4f9235ab for GdiPlus.dll * 警告:符号时间戳错误0x4a5bdf81 0x4a5bda2e for comsvcs.dll
FAULTING_IP: + a7d01d0 00000000`00000000 ?? ???
EXCEPTION_RECORD:ffffffffffffffff - (.exr 0xffffffffffffffff) 异常地址:0000000000000000 ExceptionCode:80000003(中断指令异常) 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 没有找到导出dumpstack
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:STACKIMMUNE
DEFAULT_BUCKET_ID:STACKIMMUNE
STACK_TEXT:
00000000 00000000 00000000
00000000 unknown!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
这可能是罪魁祸首:'msdart'和'shfolder'的地址区重叠?
答案 0 :(得分:1)
使用Visual Studio或WinDbg连接到此进程以查看callstack和调试,和/或在应用程序中包含日志记录。这样您就可以将日记文件写入您的应用程序。
听起来你正在阻止你的GUI,但后台线程仍在运行。
答案 1 :(得分:1)
在主机上安装 visual studio远程调试器正在运行应用程序,然后附加到正在运行的进程。您需要具有相同的pdb文件和源代码,以便插入断点和调试。
检查此链接:
http://msdn.microsoft.com/en-us/library/vstudio/bt727f1t.aspx
您还可以将debug配置为在其他计算机上远程启动应用程序,而不是连接到正在运行的进程。
答案 2 :(得分:1)
你可以捕获转储并在windbg中打开它,输入!analyze -v
让windbg为你做分析。对于挂起/无响应问题,!analyze -v
不如崩溃有效。我通常~*kb200
列出所有线程的堆栈跟踪,这对于获得线程正在做什么的初步概述非常有帮助,然后,!locks
可以告诉我是否存在任何关键部分问题,有时,我将检查堆栈上是否出现任何异常
答案 3 :(得分:0)
问题是多线程死锁。在我们的主窗口下方显示错误。因为我们无法在错误上单击“确定”,并且我们的主窗口正在等待关闭错误窗口,我们的应用程序挂起...
我们通过屏幕录制确定了实际错误,同时我们使用任务管理器关闭了应用程序。在不到一秒的时间内,我们可以看到错误窗口,通过回放录音,我们可以看到错误到底是什么并修复它。