【问题标题】:Debugging of native code本机代码的调试
【发布时间】:2010-03-26 11:32:03
【问题描述】:

我有一个 C# 服务正在调用最初用 VC6 编写的 C DLL。

我正在尝试检查的 DLL 中有一个错误。

在经历了一场试图让调试工作的噩梦之后,我最终将 dll 添加到包含 C# 服务的 VS2005 解决方案中,并添加了必要的_CRT_SECURE_NO_WARNINGS

服务的调试版本是使用“installutil.exe”工具注册的。

我可以通过调用System.Diagnostics.Debugger.Break(); 让调试器在输入 dll 的行之前中断。

我在网上找到了一些关于调试非托管代码的说明,并启用了“启用非托管代码调试”复选框,我还尝试打开选项->调试->本机“加载 DLL 导出”和“启用 RPC 调试”(即使它不是 COM)。我还将调试 dll 和 .pdb 复制到与服务相同的 bin 目录中。

然而,我真正需要的是非托管代码。

更新:我在 DLL 属性中找到了调试类型,并根据多个站点的建议将其设置为“混合”,但无济于事。

UPDATE2:我的项目现在将调试 dll 和 pdb 发送到与调试服务相同的目录。仍然无法调试 dll。

【问题讨论】:

    标签: c# debugging dll visual-studio-2005 service


    【解决方案1】:

    尝试将非托管代码设置为启动项目。我知道这没有意义,但我记得这适用于一个非常相似的项目。

    由于 DLL 没有关联的可执行文件,当您尝试运行它时会弹出询问要运行的应用程序。浏览到您的 C# 应用程序,然后您就可以开始使用了。

    调试愉快!

    编辑:已经有一段时间了,但我认为混合调试类型是正确的

    【讨论】:

    • 这是一项服务 - 您不能将服务作为应用程序运行。
    • 嗯,我在想这个。恐怕我对服务了解不多。如何在没有 DLL 问题的情况下调试服务?
    • 另外,如果你不能通过任何其他方式让它工作,你可以编写一个非常简单的 C# 应用程序来调试 DLL。
    • 好吧,我创建了一个简单的控制台应用程序来执行 dll 未能正确执行的操作(创建一个 unc 路径 - 相反,它在 c: 的根目录中创建了一个 unc 名称的文件夹)。简单的测试有效,所以我猜 dll 中还有其他一些交互。使用实际的 dll 是不行的,因为它是一个包含 17952 行稀疏注释的 c 代码的单个文件。
    • 在调用 DLL 之前,您在服务上设置了一个断点。那么为什么不从控制台应用程序调用 DLL 中的相同函数呢?您可以传递与服务相同的参数,并希望在您的 DLL 中找到错误
    【解决方案2】:

    最后,我创建了一个控制台应用程序并重新创建了所有先前的调用,以确保调用在实际服务中的行为与实际服务中的行为相同。

    我在my site 记录了我的修复和生成的代码。

    【讨论】:

      【解决方案3】:

      Visual Studio 2013 中有一个解决方法。从 cmd 行运行应用程序。当System.Diagnostics.Debugger.Break(); 被点击时,应该会弹出一个 Visual Studio 即时调试器窗口。选中“手动选择调试引擎。”,单击“是”并确保选中“本机”引擎。单击“确定”。现在您应该能够像在 VS 中运行代码一样单步执行本机代码了。

      【讨论】:

        猜你喜欢
        • 2016-08-02
        • 2020-06-21
        • 2011-06-22
        • 2011-03-28
        • 2012-09-20
        • 1970-01-01
        • 2011-10-03
        • 2012-05-31
        • 2013-07-09
        相关资源
        最近更新 更多