有一个C#程序很常见。程序的执行发生在远程机器上,并且启动调试器不是一种选择。运行外部分析器更加真实,但也遇到了巨大的困难。如何在没有探查器或调试器的情况下确定程序挂起点?
选项"详细记录FS"是不合适的。该程序包含大约2万行代码并且不经常挂起。
我已经尝试过Process Explorer但它的工作非常奇怪(或者我还没有理解它)。如果你已经设法"赶上"当线程进入无限循环时,可以在那一刻看到堆栈。但是这个线程很快消失了(无论是在PE中还是它真的被环境杀死了。)
创建另一个应用程序application-monitor的选项是可以接受的。如果您可以说如何创建主进程的转储或获取有关主进程的线程的信息,那就太棒了。如果你有一些现成的工具,它会更好。
答案 0 :(得分:0)
通过'hang',你的意思是程序在重新启动之前停止工作,或程序暂停一段不寻常的时间。如果是后者,它可能是一个沉重的GC集合。如果它是前者并且您怀疑某种无限循环,那么在任务管理器(或进程资源管理器)中,您应该看到它几乎占用了其中一个处理器核心。例如,如果您有四个内核并且程序处于紧密循环状态,那么您将在性能面板中看到大约25%的CPU使用率(假设装载较轻的机器)。
MS支持托管调试,请参阅Debugging Managed Code Using the Windows Debugger您可以使用sos扩展来破坏代码执行并查看程序的状态。如果你采用这种方法,你可能想要使用pdb程序。
答案 1 :(得分:0)
当应用程序崩溃时,通常应该登录到Window的Application Event Log
。它不是非常详细,但无论如何都应该提供非常可靠的线索,而无需任何外部工具。
要到达那里,您可以在“开始”菜单中搜索“事件日志”,也可以在“控制面板”中找到它。它位于Administrative Tools
部分。
进入事件查看器后,打开左侧的Windows Logs
项,然后选择Application
。您应该能够使用“源”列在列表中找到您的应用程序。
在底部,您可以找到错误详细信息,时间戳和一些可以帮助您调试应用程序的信息。
图片来自Cyberlink.com