我继承了一个由许多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
,涉及复杂的例程,包括CLRCreateInstance
,ICLRMetaHost
,{{1 },ICLRRuntimeHost
,GetRuntime(..)
和Start()
。
答案 0 :(得分:11)
由于您的主EXE是本机程序,因此调试器很可能以非托管模式启动,因此不支持在托管代码上设置断点。项目+属性,调试,调试器类型设置。将其从默认值“自动”更改为“混合”或“仅管理”。混合调试仅适用于32位模式。
更新:从VS2012开始,您还必须强制调试器使用传统的托管代码调试引擎,即仍支持C ++ / CLI的引擎。工具>选项>调试>一般> “使用托管兼容模式”设置。
答案 1 :(得分:0)
对于同样的错误,当我将调试器类型指定为:
时,它适用于我“仅限原生”或“仅管理”不为混合或自动!!!
答案 2 :(得分:0)
对我来说,关键是将调试器类型从“自动”更改为“混合”,但对于启动应用程序,而不是包含C ++ / CLI代码的库(这是我正在尝试的)。