VS2012:调试器启动时ntdll.dll中的断点没有更多信息

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了VS2012:调试器启动时ntdll.dll中的断点没有更多信息相关的知识,希望对你有一定的参考价值。

偶尔当我使用VS2012在调试模式下启动/调试我的应用程序时,我会得到一个对话框:

<blahblah.exe>触发了一个断点。

它不包含任何其他信息,所以我打破了看看发生了什么。哦,但后来我得到“wntdll.pdb没有加载”,没有关于这个问题的其他信息。调用堆栈指向ntdll.dll,此时我的应用程序还没有开始执行。

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

这种情况经常发生(大约7次发射中的10次)。我正在运行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

我还应该添加,以防万一,我在代码中的任何地方都没有设置断点。

答案

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

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

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

再次感谢你的反馈。

Marc Paine Visual Studio调试工程经理

资料来源:Microsoft Connect

我遵循了关于在Visual Studio调试器设置中禁用“在一个进程中断时中断所有进程”复选框的建议,此时此“已删除”该问题。

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

另一答案

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

另一答案

我发现自己遇到了类似的问题,但这是我的callstack:

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

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

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

"Enable native code debugging" checkbox

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

此解决方案中的其他项目之一只是通过手动指定二进制文件作为项目的TargetPath来启动的预构建二进制文件。

在项目的Debugger Type属性页面中将Native Only更改为Debugging似乎也有所帮助。

"Native Only" Debugger type

因此,改变这两个似乎实际上已经解决了我的问题。

另一答案

看看你是否在第一次机会异常时打开了调试器。

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

以上是关于VS2012:调试器启动时ntdll.dll中的断点没有更多信息的主要内容,如果未能解决你的问题,请参考以下文章

Qt Creator 在尝试运行 OpenCV 程序时崩溃。 [ntdll.dll 崩溃]

Delphi - 在连接到 Oracle 并调用 Web 服务方法后关闭时 ntdll.dll 中的异常

vs2012 输出窗口报错 “无法查找或打开 PDB 文件”

安装 IE9 后 Visual Studio 2012 崩溃(故障模块 ntdll.dll)

将用户模式 ​​dll 中的高级函数映射到 NTDLL.dll

关于用VS2012编写fortran时出现的问题