12

有时,当我使用 VS2012 在调试模式下启动/调试我的应用程序时,会出现一个对话框:

<blahblah.exe> 已触发断点。

它不包含其他信息,所以我点击 break 看看发生了什么。哦,但是后来我得到“wntdll.pdb not loaded”,并且没有关于该问题的其他信息。调用堆栈指向 ntdll.dll,此时我的应用程序似乎还没有开始执行。

此时选择继续将使应用程序/调试器像往常一样继续。

这种情况经常发生(大约 10 次发射中的 7 次)。我正在运行 Windows 8(64 位)和带有更新 1 的 Visual Studio 2012。

以前我有 Windows 7(64 位)和 VS2010,从来没有遇到过这个问题。这个特定项目已经从它在 (2010) 中创建的版本升级,所以这可能是问题的一部分。

以前有人遇到过这个问题吗?我不知道从哪里开始寻找原因。虽然我运行的是 64 位 Windows,但我应该提到我正在构建一个 32 位应用程序。

更新: 启用 Microsoft 符号服务器后,调用堆栈如下所示:

>   ntdll.dll!_LdrpDoDebuggerBreak@0()  Unknown
    ntdll.dll!_LdrpInitializeProcess@8()    Unknown
    ntdll.dll!__LdrpInitialize@8()  Unknown
    ntdll.dll!_LdrpInitialize@8()   Unknown
    ntdll.dll!_LdrInitializeThunk@8()   Unknown

我还应该补充一点,以防万一,我的代码中绝对没有手动设置断点。

4

4 回答 4

5

这个烦人的问题源于 Visual Studio 中的一个错误:

发生的事情是我们没有同时正确处理来自不同进程的多个加载程序断点事件。一旦进程启动并运行,但在执行任何操作之前,操作系统会触发加载程序断点,以便调试器实例化断点并采取其他操作。通常我们会成功忽略这些(至少在单个启动案例中)。您可以通过禁用工具->选项->调试器中的“当一个进程中断时中断所有进程”复选框来解决此问题。另请注意,这不是致命错误。我们只是停在一个内部中断点,您可以再次按 F5 继续前进。

这是一个竞争条件,所以我们不会那么容易追踪,而且 VS 中的多次启动使用率相当低,所以我不会解决这个问题,假设上面的解决方法足以让你畅通无阻并且如果我们看到更多来自其他客户的报告,我们将重新审视这一点。你觉得这听起来合理吗?

再次感谢你的反馈。

Marc Paine Visual Studio 调试器工程经理

来源:微软连接

我遵循了在 Visual Studio 调试器设置中禁用“当一个进程中断时中断所有进程”复选框的建议,这暂时“消除”了这个问题。

也许如果我们能让更多人报告这个错误的相同问题/烦恼,微软最终会按照他们的建议修复它。

于 2017-05-30T07:42:08.647 回答
3

如果您在调试器下运行应用程序,则进程一开始就会有一个自动断点。此断点使您有机会在进程开始执行之前设置更多断点。如果您不喜欢它,调试器中通常有一个选项可以忽略初始默认断点。例如,在cdb 选项中是-g.

于 2014-10-06T13:46:31.130 回答
0

我刚刚发现自己遇到了类似的问题,不过,这是我的调用堆栈:

ntdll.dll!LdrpDoDebuggerBreak()
ntdll.dll!LdrpInitializeProcess()
ntdll.dll!_LdrpInitialize() 
ntdll.dll!LdrInitializeThunk()

就我而言,我的 Visual Studio 解决方案有几个项目,其中三个项目通过解决方案的“多个启动项目”设置设置为启动(和调试)。

其中两个启动项目是(非托管)C++,其中一个是 C#。通过打开 C# 项目的项目属性并启用“本机代码调试”,我能够摆脱这个启动断点。

编辑:显然这并没有完全解决我的问题,它只是大大降低了它发生的频率。但是,我认为相同的通用解决方案可能仍然可以解决它。

此解决方案中的其他项目之一只是一个预构建的二进制文件,通过手动将二进制文件指定为项目的TargetPath.

在项目的属性页面中更改Debugger Typeto似乎也有帮助。Native OnlyDebugging

所以,改变这两个似乎实际上已经为我解决了这个问题。

于 2017-01-13T16:57:36.947 回答
-1

查看您是否已打开在第一次机会异常时闯入调试器。

您可以在“调试/异常...”下看到这一点。查看是否选中了任何框。(至少这是旧 VS 变体中的菜单位置 - 我目前没有 VS 2012)如果启用,这会导致调试器在抛出异常时中断,即使应用程序可以正确处理它。如果禁用,调试器仅在未处理异常时中断。如果检查了任何异常,请尝试取消选中它们并查看是否仍然存在。

于 2014-10-06T13:32:27.233 回答