debugging 未命中托管代码中的断点

uqjltbpv  于 2022-11-14  发布在  其他
关注(0)|答案(4)|浏览(232)

我继承了一个由许多C#、C++/CLI和本机C项目组成的应用程序。
该应用程序作为MFC应用程序启动,但在启动过程中加载CLR(通过一个我还不确定是否完全理解的过程†)。
我发现我可以在原生C
程式码中放置中断点,而且这些中断点可以如预期般运作。但是,Managed程式码中的中断点无法运作。
在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,并涉及一个复杂的例程,包括CLRCreateInstanceICLRMetaHostICLRRuntimeHostGetRuntime(..)Start()ExecuteInDefaultAppDomain(..)

ego6inou

ego6inou1#

对于同样的错误,当我将调试器类型指定为以下值时,它也适用:
“仅限本机”或“仅限托管”而不是为“混合”或“自动”!!!

zyfwsgd6

zyfwsgd62#

对我来说,它是在项目属性-〉链接器-〉调试-〉可调试的程序集设置为YES(/ASSEMBLYDEBUG)

jmp7cifd

jmp7cifd3#

由于主EXE是本机程序,因此调试器很可能在非托管模式下启动,因此将不支持在托管代码上设置断点。“项目+属性”、“调试”、“调试器类型”设置。请将其从默认值“自动”更改为“混合”或“仅托管”。混合调试仅在32位模式下有效。
更新:从VS 2012开始,您还必须强制调试器使用遗留托管代码调试引擎,该引擎仍支持C++/CLI。工具〉选项〉调试〉常规〉“使用托管兼容模式”设置。

sxpgvts3

sxpgvts34#

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

相关问题