我有一个正在运行的进程,它应该在很久以前就完成了。它已经运行了 13 个小时,我预计它会在几个小时内完成。它之前已经成功运行了很多次。
它可能只是在处理大量数据,所以我不想只是在中间停止它,以防它合法地需要那么多时间并且它几乎完成了。
我如何附加到该进程以查看它是只是坐在那里还是实际上正在处理?我可以闯入并查看它在哪一行,并计算到目前为止它处理了多少条记录?
我安装了windbg,但我不确定这是否是正确的工具。如果需要,我也有此应用程序的源代码。
您可以使用 Visual Studio。
打开项目的解决方案,然后从“调试”菜单中选择“附加到进程”。
你说你已经安装了windbg,但我不确定你的意思是在你的开发机器上还是在运行长时间运行的进程的机器上。如果是后者,并且由于这是一个 .NET 进程,windbg 和进程的位数必须匹配(例如,32 位 windbg 调试 32 位 .NET 进程或 64 位 windbg 调试 64 位进程)。一旦确定了进程的位数,然后将匹配的位数附加到进程(文件|附加到进程...)
然后修复你的符号路径.symfix;.reload
接下来加载托管调试扩展.loadby sos.dll clr
(注意:以上适用于 .NET v4 及更高版本。需要 .NET 的早期版本.loadby sos.dll mscorwks
)
现在您可以转储所有托管线程堆栈~*e !clrstack
并检查每个托管堆栈以查看每个线程在做什么。
要尝试的另一件事是查看每个托管线程的最后一个托管异常!threads
。这将列出每个托管线程并指示该线程的最后一个托管异常(如果存在)。然后,您可以检查托管异常!pe <ex-addr>
如果你不能使用 Visual Studio,你可以使用远程调试。您仍然需要安装远程调试器客户端,但这是一个小型安装,不需要重新启动(公平)