我们基于表单的应用程序有一组屏幕。可以通过单击下图中突出显示的选项卡来导航屏幕。 ARAMS屏幕(活动屏幕)之一是WPF屏幕。其他是正常形式。如果用户经常点击不同的选项卡,然后单击WPF屏幕选项卡,整个系统将挂起。发生问题后,用户必须重新启动计算机。由于整个系统被挂起,我们无法调试问题。调试时我们没有遇到问题。
应该采取什么方法来调试此问题?
我们在Win 7机器中遇到了问题
答案 0 :(得分:0)
只需使用调试器(Visual Studio调试器或WinDBG)在进入挂起状态后“附加到进程”....然后您就可以“中断”进入您的进程。
然后查看所有线程的堆栈以查看它们正在做什么...您可能会发现某个特定线程正在做的事情导致死锁。
如果你将WinDBG与SOSEX插件一起使用,你甚至可以使用!dlk命令......它有时可以自动找到任何死锁。
还有很多其他调试器命令可以检查发生的事情,例如查看垃圾收集器,终结队列(例如可能已阻止终结器线程)等。
现在我知道你说你整个系统挂起,所以这可能很棘手/不可能.....你可以尝试的一件事就是降低流程优先级和/或在处理器关联进入挂起状态之前设置它...这应该让你有更好的机会在同一台机器上加载你的调试器,因为理论上你可以阻止你的进程独占CPU。
转到任务管理器右键单击该过程并执行设置优先级或设置关联性。
现在可能的情况是,更改优先级实际上会产生副作用,因为您的应用程序不再挂起或行为不同......但如果这种情况至少发生,则会给您一个线索,问题
如果它仍然挂起(但没有那么多)并且你只能运行你的调试器......那么你现在可以附加到你的进程,并打破它。
如果上述方法不起作用,那么它在机器上安装WinDBG的时间会崩溃,设置Windows启动进入内核调试模式,然后从另一台机器(通过USB,Firewire等连接)使用WinDBG客户端与您的挂机后端调试引擎交谈,这将让您进入系统并分析机器状态。
另一种技术是通过崩溃转储捕获进程状态(您可以通过右键单击任务管理器中的进程名称并说“创建转储”或使用其他工具为您执行此操作来创建)。然后,您可以将.dmp文件加载到Visual Studio(通过使用File Open),或者加载到WinDBG(通过使用Open Crash Dump)。然后,您可以查看该过程的某些状态。
这可以使用各种工具自动化,例如ADPlus,以便当您的应用程序无响应时自动为您执行崩溃转储....如果您很幸运,即使您的系统处于挂起的系统中,它也可能以自动方式工作....或者它可能不会
请注意,如果可以访问更多信息/状态,最好进行实时调试而不是崩溃转储。
可以运行.NET应用程序,CLR运行时执行额外检查以验证您是否以核心方式执行操作。这些检查称为托管调试助手。当MDA发现问题时,它会在您的程序中引发异常。
可以使用“myapplication.mda.config”中的某些配置开关或“调试”菜单中的“例外”对话框(在树中专用于它们的分支)打开它们。一个警告,不要只是打开所有这些,因为它们中的一些是非常具有侵略性并且可能导致红色鲱鱼......你需要真正阅读每个MDA并了解检查正在做什么。