是否可以通过创建转储文件然后尝试在 Visual Studio 中打开来调试 .NET 应用程序中的无限循环?
考虑以下代码:
while (fileContents.Length < charNum + 1)
{
fileContents = File.ReadAllText(_filePath);
}
所以我让它尝试读取的文件只包含 5 个字符,这意味着它将陷入这个循环。正如预期的那样,我的应用程序冻结了。
因此,我使用任务管理器创建程序转储,将其带到我的开发计算机,然后在 Visual Studio 中打开,其中还有 exe、pdb 和源代码。
但是当我尝试调试时我得到:
mscrolib.ni.pdb 未加载
mscorlib.ni.pdb 包含查找模块源所需的调试信息
显然我无法获取此 pdb,因为它是由 ngen.exe 创建的本机映像。说实话,我并不太关心它(我可以在反汇编中看到 File.ReadAllText,所以我假设这就是它停止在那里的原因),我只想看看它在我自己的代码中停止在哪里并进行调试。
我有什么办法可以做到这一点吗?我尝试查看调用堆栈,但我得到的只是:
[外部代码]
mscorlib.ni.dll![下面的帧可能不正确和/或丢失,本机调试器尝试遍历托管调用堆栈]未知
查看线程给了我 7 个线程,这是“主线程” - 其余的(工作线程)是 ntdll.dll、clr.dll 和 Combase.dll - 没有一个包含有用的信息,所以我觉得我已经在查看正确的信息线程。
编辑
所以我在调试器中打开“模块”窗口,看到除了我的应用程序和 mscorlib.ni.dll 之外,每个模块都有一个符号状态=“符号已加载”!现在,当我尝试加载应用程序的符号时,我浏览并打开原始版本中的 pdb 文件,并收到一条错误消息:
在此文件夹中未找到匹配的符号文件。
但是这是这个.exe 的符号文件!