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

时间:2013-01-17 10:04:21

标签: c++ windows debugging windows-8 visual-studio-2012

有时当我在调试模式下启动/调试我的应用程序时,使用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

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

4 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:3)

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

  

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

     

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

     

再次感谢您的反馈。

     

Marc Paine Visual Studio调试工程经理

来源:Microsoft Connect

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

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

答案 2 :(得分:0)

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

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

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

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

"Enable native code debugging" checkbox

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

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

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

"Native Only" Debugger type

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

答案 3 :(得分:-1)

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

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