如何调试正在运行的进程?

时间:2013-05-22 23:05:28

标签: .net debugging

我有一个我正在运行的流程,它应该很久以前就已经完成了。它已经运行了13个小时,我预计它只会在几个小时内完成。它已多次成功运行。

它可能只是处理大量数据,所以我不想在中间停止它,以防它合法地需要那么多时间而且几乎完成了。

如何附加到流程以查看它是否只是坐在那里或是否实际处理?我可以查看并查看它所在的行,并计算到目前为止处理的记录数量?

我安装了windbg,但我不确定这是否是正确的工具。如果我需要,我也有这个应用程序的源代码。

3 个答案:

答案 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>

检查托管例外