我如何调试在外部 C# 应用程序中 SWIGed 的 C++ DLL(不能从调试器启动)

Posted

技术标签:

【中文标题】我如何调试在外部 C# 应用程序中 SWIGed 的 C++ DLL(不能从调试器启动)【英文标题】:How can i debug C++ DLLs SWIGed in external C# app (that can not be started from debugger) 【发布时间】:2019-03-19 16:37:48 【问题描述】:

我不知道如何调试托管应用程序中使用的代码的 C++ 部分。我似乎比其他现有的类似问题更具体

上下文:

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

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

在 VS 2015 的调试输出窗口中,我没有看到可执行文件尝试加载我的 C++ dll,但在进程资源管理器中查看时我看到它们已加载。痛饮 (或托管应用程序的插件系统)可能正在做一些魔术来加载 c++ dll

有什么技巧可以帮忙吗?

【问题讨论】:

将调试附加到进程并指示 VS2015 调试本机代码或本机和托管。它显示在下拉组合框中 @JensMunk 我已经这样做了。我已经写过我做到了 接下来我会尝试 WinDbg 【参考方案1】:

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

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

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

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

如果失败,可能是因为调用者的目标配置与被调用者不兼容。一般来说,不建议混合调试和发布模式代码,尤其是在编组数据时。在发布模式下重建 DLL,包括 PDB,并按照上述说明运行。仍然可以调试发布模式代码,尽管由于优化有时会很困难。

【讨论】:

"加载 DLL 及其 PDB 时,断点应该是不透明的,并且会在代码行执行时被命中。"我实际上没有在调试输出中看到我的 c++ dll 加载,但是自从我运行他们的代码以来它们确实被加载到内存中:( 您确定 DLL 是来自调试版本的 DLL,并且完全限定的路径是您所期望的吗?这可以通过在进程监视器中检查进程的 DLL 来获得。 PDB 呢? 是的,我明确地将 PATH 设置为这些 DLL 的构建文件夹,以便在我的开发环境中找到它们

以上是关于我如何调试在外部 C# 应用程序中 SWIGed 的 C++ DLL(不能从调试器启动)的主要内容,如果未能解决你的问题,请参考以下文章

c#/wpf OpenMP 在外部 dll 中

如何在外部浏览器而不是应用内(instagram)中打开链接?

如何在外部服务器上安装和使用嵌入式 C 的编译器?

vscodec语言怎么不能在外部运行直接退出

Webview 链接在外部浏览器中打开

如何在外部存储库中使用顺风?类不工作