程序挂点识别

Program hanging point identification

有一个 C# 程序很少挂起。程序的执行发生在远程机器上,启动调试器不是一个选项。 运行 external profiler 比较现实,但共轭难度也很大。在没有分析器或调试器的情况下如何确定程序挂起的点?

选项 "detailed logging on FS" 不适合。该程序由大约 20,000 行代码组成,并且不经常挂起。

我已经尝试过 Process Explorer,但它的工作原理很奇怪(或者我不明白)。如果您设法 "catch" 线程进入无限循环的那一刻,就可以看到那一刻的堆栈。但是这个线程消失得挺快的(不管是在PE里还是真的被环境杀了)

创建另一个应用程序 application-monitor 的选项是可以接受的。如果您能说出如何创建主进程的转储或获取有关主进程线程的信息,那就太好了。如果有现成的工具就更好了

'hang' 是指程序停止运行直到重新启动,还是程序暂停了异常长的时间。如果是后者,它可能处于繁重的 GC 收集中。如果是前者并且您怀疑存在某种无限循环,那么在任务管理器(或进程资源管理器)中您应该会看到它几乎耗尽了一个处理器内核。例如,如果您有四个内核并且一个程序挂在一个紧密的循环中,您将在性能面板中看到大约 25% cpu 的使用率(假设机器负载较轻)。

MS 支持托管调试,参见Debugging Managed Code Using the Windows Debugger 您可以使用 sos 扩展来中断代码执行并查看程序状态。如果采用这种方法,您可能希望手边有程序 pdb。

当应用程序崩溃时,它通常应该登录到 Window 的 Application Event Log。它不是非常详细,但无论如何应该提供非常可靠的线索,而不需要任何外部工具。

要到达那里,您可以在“开始”菜单中搜索 "Event Log" 或在“控制面板”中找到它。它位于 Administrative Tools 部分。

进入事件查看器后,打开左侧的 Windows Logs 项,然后 select Application。您应该能够使用源列在列表中找到您的应用程序。

在底部,您会找到错误详细信息、时间戳和一些可以帮助您调试应用程序的信息。

图片取自Cyberlink.com