如何在外部C#app中调试C ++ DLL(无法从调试器启动)

问题描述 投票:0回答:1

我无法想象如何调试托管应用程序中使用的C ++部分代码。我似乎在一个更具体的情况下,其他现存的类似问题

背景:

  • 我想调试我的C ++ DLL
  • 它们使用swig包装在C#中
  • 我还为使用包装的C#dll的应用程序构建了C#插件
  • 该应用程序无法从调试器启动,我必须在之后附加它
  • 我在VS2015中以调试和x64模式构建了所有内容(c#dll实际上位于'AnyCPU'平台中,'Prefer-32-bit'未标记)
  • 我处于运行代码的适当环境中(代码工作的其他部分),它只是C ++部分中的一个错误,当它从C#部分发生时我想调试它

我尝试将程序作为C ++ DLL的外部调试程序启动(指定'混合'调试,或作为C#dll的外部调试程序(启用'本机代码调试')。但我认为这些选项可能会被忽略,因为我无法在调试器中启动exe,只是在事后附加到进程。我附加了选择Native和Managed调试器的进程。我只能破解我的托管代码

在VS 2015的Debug输出窗口中,我没有看到可执行文件试图加载我的C ++ dll,但我看到它们在查看进程资源管理器时被加载。 swig(或托管应用程序的插件系统)可能正在加载c ++ dll

任何帮助的伎俩?

c# c++ debugging visual-studio-2015 swig
1个回答
0
投票

你说“我试图将程序作为C ++ DLL的外部调试程序启动...但我认为这些选项可能会被忽略,因为我无法在调试器中启动exe ...”。我想这可能是你出错的地方。

您需要将C ++ DLL项目设置为启动项目(右键单击该项目并选择Set as StartUp Project)。然后打开项目的属性页面,在Debugging下,在Command字段中输入应用程序可执行文件的完整路径。输入Command Arguments字段中所需的任何命令行参数。还要确保您的DLL项目在C ++ / General下生成PDB。清理并重建DLL项目。

在您希望调用的函数中设置断点 - 理想情况下,在入口点附近的某个位置,以及要调试的代码中的另一个断点。现在开始调试(F5)。应用程序应该运行(断点可能会显示为“挖空”,并显示断点未绑定或类似的消息 - 不要担心这一点)。执行应用程序中所需的任何操作以调用本机DLL。加载DLL及其PDB时,断点应该显示为不透明,并在代码行执行时被触发。

如果断点未命中/未绑定,我建议将C ++ DLL及其PDB复制到应用程序可执行文件夹,以减少加载错误DLL的可能性。然后重新启动调试器。如果您的应用程序以编程方式设置工作文件夹,请尝试将DLL / PDB复制到此位置。

如果失败,可能是因为调用者针对与被调用者不兼容的配置。通常,不建议混合使用调试和释放模式代码,尤其是在编组数据时。在发布模式下重建DLL,包括PDB,并运行上面的说明。它仍然可以调试释放模式代码,尽管有时由于优化而很难。

© www.soinside.com 2019 - 2024. All rights reserved.