【发布时间】:2015-01-25 23:39:14
【问题描述】:
我正在尝试从本机 C++ 可执行文件调试 C# dll。我有一个通过 IDispatch 从本机代码加载和运行的 C# COM 对象。一切都是在调试中构建的,包括 C# 和 C++ 代码。虽然我可以看到所有 c++ 代码,并且所有 c++ dll 都加载了它们的符号并可用于调试、断点等,但 C# 代码拒绝播放。
我所看到的是 C# dll 都拒绝加载它们的符号 pdb,在模块窗口中报告“跳过加载 ngen 二进制文件的符号”。
顺便说一下,我这里调试的是 C# 解决方案,我在 COM 项目的调试设置中将本机可执行文件设置为“启动外部程序”。
现在我可以启动 C++ 可执行文件,然后附加到它,然后一切都按我的预期工作 - 符号加载,我可以在 C# 中设置断点。
这是使用 Visual Studio 2013u4。是否有启用混合模式调试的设置?一个小问题是原生代码是用 VS2010 构建的。
这是“模块”窗口 - 请注意所有 pdb 和 dll 都在一个目录中,您可以看到加载的 c++ dll,但看不到 C# 的。
这是模块窗口 - 请注意 EvCom dll(COM 对象)的第三个条目,我认为它是启用调试的条目。
Output 窗口中没有任何有趣的内容,在加载 COM dll 时,我看到以下内容(在附加到正在运行的进程的情况下,另一个只有 2 个 Loaded 行而不是 3 个)。
'Explorer.exe' (Win32): Loaded 'C:\Dev\...\lib\debug\EvCom.dll'.
'Explorer.exe' (Win32): Loaded 'C:\Dev\...\lib\debug\EvCom.dll'.
'Explorer.exe' (Win32): Unloaded 'C:\...\lib\debug\EvCom.dll'
'Explorer.exe' (Win32): Loaded 'C:\Dev\...\lib\debug\EvCom.dll'.
有趣的一件事 - 我在调试设置中检查了“使用托管兼容模式”,并认为在开始调试时它仍然没有加载我的符号,它只在模块列表中显示 1 个条目。这次对 C# dll 说“符号文件中没有本机符号”。
看起来问题是无法在 VS2013(或 2012)中选择调试器类型。 This connect article 建议其“按设计”并提供一些解决方法。
【问题讨论】:
-
右击你的C++项目,属性,调试,调试器类型=混合。
-
没有C++项目,我在VS2013中调试我的C#项目,那里没有这样的设置,原生项目是外部构建的,没有在VS内部作为项目引用。
-
“我可以看到所有的 c++ 代码”是......那么奇怪。您必须已经启用了混合模式调试,这是查看 C++ 代码的唯一方法。专注于有关 ngen 二进制文件的怪异警告,这是不正常的。你永远不应该调试代码。运行 ngen /uninstall 以摆脱它。
-
我知道,并且 c# 代码没有生成。注意 vs2013 将调试 C# 代码,只要我附加到 exe 而不是自动启动它。我假设它以本机调试模式启动,因为即使我只调试 C# 项目,启动程序也是本机的,但我看不出为什么或如何改变它。
-
@HansPassant 谢谢,看起来您在开始调试时无法再选择调试器类型。 .NET 4.0 引入的更改。
标签: c# debugging visual-studio-2013 mixed-mode