断点未在托管代码中命中

Grh*_*rhm 4 debugging unmanaged c++-cli managed

我继承了一个由许多C#,C++/CLI和本机C++项目组成的应用程序.

该应用程序作为MFC应用程序启动,但在启动期间加载CLR(通过我不确定我完全理解的过程).

我发现我可以在本机C++代码中放置断点,并且这些断点可以按预期工作.但是,托管代码中的断点不起作用.

在C#我得到:

"断点当前不会被命中.此文档没有加载任何符号".

在C++/CLI中我得到:

"断点当前不会被命中.没有可执行代码与此行相关联.可能的原因包括:预处理程序指令或编译器/链接器优化".

我甚至可以在同一个C++文件中设置两个断点,并且只有一个工作,例如

#pragma unmanaged

int CMyClass::UnmanagedFunc()
{
    // Breakpoint here works
    return 1
}

#pragma managed

int CMyClass::ManagedFunc()
{
    // Breakpoint here DOES NOT WORK!!
    return 2
}
Run Code Online (Sandbox Code Playgroud)

"启用非托管代码调试"(在托管库项目中)的项目设置对这些断点没有影响.有一些设置或配置或东西,我不这样做,让我中断,并通过代码库的管理部分步骤?



:该进程加载mscoree.dll,并涉及复杂的程序,包括CLRCreateInstance,ICLRMetaHost,ICLRRuntimeHost,GetRuntime(..),Start()ExecuteInDefaultAppDomain(..).

Han*_*ant 11

由于主EXE是本机程序,因此调试器很可能以非托管模式启动,因此不支持在托管代码上设置断点.项目+属性,调试,调试器类型设置.将其从默认值"自动"更改为"混合"或"仅管理".混合调试仅适用于32位模式.

更新:从VS2012开始,您还必须强制调试器使用传统的托管代码调试引擎,即仍支持C++/CLI的引擎.工具>选项>调试>常规>"使用托管兼容模式"设置.

  • 将此答案与工具 - >选项 - >调试 - >常规转为'使用托管兼容模式'相结合,为我解决了这个问题.TNX! (3认同)