使用转储调试应用程序冻结(无限循环)

问题描述 投票:0回答:1

是否可以通过创建转储文件然后尝试在 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 的符号文件!

c# .net visual-studio debugging
1个回答
0
投票

我使用了与您类似的无限循环项目并生成了转储。调试时,我能够正常追踪到原因代码,并没有出现和你一样的情况: enter image description here

在调试时,我打开模块窗口,mscorlib.ni.dll 的状态是 Native debuggerilakedloadingsymbolsfordriven module: enter image description here

请检查“工具 > 选项 > 调试 > 常规”中的“仅启用我的代码”选项是否已启用,以及“工具 > 选项 > 调试 > 符号”中的“Microsoft 符号服务器”选项是否已选中。 相关帖子可参考:post1post2.

© www.soinside.com 2019 - 2024. All rights reserved.