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