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的引擎.工具>选项>调试>常规>"使用托管兼容模式"设置.
| 归档时间: |
|
| 查看次数: |
3814 次 |
| 最近记录: |