【问题标题】:Breakpoint not hit in managed code托管代码中未命中断点
【发布时间】:2012-11-01 02:45:12
【问题描述】:

我继承了一个由许多 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
}

“启用非托管代码调试”的项目设置(在托管库项目中)对这些断点没有影响。 是否有一些设置或配置或 something 允许我中断并单步执行代码库的托管部分?



†:进程加载mscoree.dll,并涉及一个复杂的例程,包括CLRCreateInstance、ICLRMetaHost、ICLRRuntimeHost、GetRuntime(..)、Start()和ExecuteInDefaultAppDomain(..)。

【问题讨论】:

    标签: debugging c++-cli unmanaged managed


    【解决方案1】:

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

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

    【讨论】:

    • 哦。我知道这将是我忽略的一些简单的事情。将其从“自动”更改为“混合”已经成功了.....
    • 将此答案与工具->选项->调试->常规转'使用托管兼容模式'相结合为我解决了这个问题。 Tnx!
    【解决方案2】:

    对我来说,关键是将调试器类型从 Auto 更改为 Mixed,但对于启动应用程序,而不是包含 C++/CLI 代码的库(这是我试图做的)。

    【讨论】:

      【解决方案3】:

      对于同样的错误,当我将调试器类型指定为:

      “仅限本机”或“仅限托管”不混合或自动!!!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-08-28
        • 1970-01-01
        • 2011-01-29
        • 1970-01-01
        • 2012-07-03
        • 2010-12-10
        相关资源
        最近更新 更多