4

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

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



:该过程加载mscoree.dll,并涉及一个复杂的例程,包括CLRCreateInstanceICLRMetaHostICLRRuntimeHost、和。GetRuntime(..)Start()ExecuteInDefaultAppDomain(..)

4

3 回答 3

12

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

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

于 2012-11-12T18:12:27.443 回答
1

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

于 2019-07-04T20:45:07.250 回答
0

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

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

于 2017-04-07T11:19:39.700 回答