【问题标题】:How to get around "Binary was not built with debug information"?如何解决“二进制文件未使用调试信息构建”?
【发布时间】:2010-10-13 09:35:22
【问题描述】:

我正在尝试调试与 Delphi 程序一起使用的 C DLL。我使用 Visual C++ 构建了 DLL,并启用了调试信息。我使用 Delphi 2009 构建了 Delphi 程序,并启用了调试信息。但显然他们使用不同的格式,因为当我尝试将 VC++ 调试器附加到我的程序时,它说“二进制文件不是使用调试信息构建的”,甚至不会接受我在 C 代码中放置的有效断点,其中 是使用 VC++ 理解的格式的调试信息构建的。

有谁知道我怎样才能让它工作?

【问题讨论】:

    标签: visual-studio delphi debugging visual-c++ dll


    【解决方案1】:

    当您说“不接受有效”时,C 代码中的调试断点是什么意思?它不启用它们吗?如果是这样,当您设置断点时,DLL 是否已加载?我发现如果我等到确定有问题的 DLL 已经加载之后再设置断点,它可以简化问题。如果这不是正在发生的情况,请详细说明“有效”断点的含义。

    其他选项是设置函数断点,或使用策略性放置的DebugBreak() 调用来编译 DLL。

    您确定加载的是正确的 DLL(即调试版本)吗?同样,即使正在加载正确的 DLL,我也不确定该错误是否一定适用于 DLL 而不仅仅是主可执行文件。或者它可能在加载符号数据库时遇到问题,如 jdigital 建议的那样,假设您将它们提取出来用于 DLL 的调试构建。即使没有调试符号,调试仍然是可行的,尤其是因为它是一个 DLL,您可以使用导出的符号进行工作。

    这不是 COM 组件吗?如果是,我会仔细检查调试版本是否是您启动进程之前注册的版本。

    我仍然有兴趣了解当您尝试设置断点时会发生什么。如果您转到 VS 中的断点窗口,它应该会说明为什么无法设置断点,如果是这样的话。

    嗯。我对/Z7 没有太多经验,你还有DLL 的.obj 文件吗?文档似乎暗示这是调试所必需的。或者,我会尝试使用/Zi 构建,并为那个傻瓜获取一个.pdb。

    【讨论】:

    • 是的,已加载。我可能不得不使用 DebugBreak 调用来重建它,但我不确定它的效果如何,因为它无法识别有可用的调试信息。
    • 回复:您的编辑:“此断点当前不会被命中。没有为此文档加载任何符号。”这不是 COM DLL,它与构建过程中的完全相同。我什至将 EXE 移至 DLL 的输出文件夹。它是使用 /Z7 调试信息选项构建的。
    【解决方案2】:

    不确定 Visual C++(不再安装它),但也许这会有所帮助...

    如果您在 Delphi 中编写 DLL 并从 C++ 中使用它,并且想要调试 DLL,您需要在 Delphi 中打开 DLL 的源代码并设置断点。然后,您将使用 Run|Parameters 并将 C++ 应用程序设置为主机可执行文件并在 Delphi IDE 中运行。然后 IDE 将启动 C++ 应用程序并照常运行它,直到 DLL 中的断点被命中,然后会按您的预期中断。

    VC++ 中有类似的东西吗? (您没有说您使用的是哪个版本的 VC++,或者是哪个版本的 Visual Studio 或更早的 IDE。)

    如果没有,我能想到的唯一选择是做一个使用 DLL 并通过它进行调试的快速 VC++ 应用程序。

    【讨论】:

    • 是的,这基本上就是我想要做的。它似乎不起作用。
    • 这正是我在当前项目中所做的。在解决方案选项-调试-命令下,我放置了我的 delphi 主机应用程序并可以调试我的 dll。反过来(调试 delphi 应用程序)也可以。唯一不可能的事情(至少对我来说)是从应用程序或相反的方式进入 c++dll,所以我每次尝试只能调试这两个中的一个
    【解决方案3】:

    调试格式没有标准化 - 基本上你不能使用 Delphi 来调试 MS 编译的代码,反之亦然。

    您可以在 Delphi 中调试 Delphi DLL,并且您可以将这些 DLL 用于未使用 Delphi 编译的其他应用程序,前提是您将 Delphi 函数标记为导出。你不能做的是在第 3 方调试器中象征性地调试这些 DLL,这至少必须理解 Object Pascal 名称修改。

    【讨论】:

    • 我正在尝试使用 VS 来调试 VS 编译的代码。 Delphi 应用程序无关紧要,或者至少应该如此。我知道我之前已经能够调试非 Delphi 程序中使用的 Delphi DLL...
    • 显然与 Delphi 中的 DLL 应用程序 相关,因为您使用的前两个标签是 delphi 和 delphi2009。 :-)
    • 尼尔:回去再读一遍帖子。我想要做的是在 Visual Studio 中调试一个在 Visual Studio 中编译的 DLL。问题是,如果没有附加应用程序,您将无法调试 DLL。只有应用程序在 Delphi 中。但我不是在尝试调试 Delphi 应用程序。只是在 Visual Studio 中编译的 DLL。
    【解决方案4】:

    您是否将调试器指向您的 DLL 的符号?如果有任何疑问,请尝试使用Filemon 运行以查看调试器在尝试加载符号时是否失败。

    【讨论】:

      【解决方案5】:

      确保在调试文件夹中打开 DLL,而不是在其他文件夹中打开另一个。

      【讨论】:

        【解决方案6】:

        十年后,这发生在我身上,在调试 Team Developer 中使用的自定义 DLL 时,设置调试命令以启动 Team Developer IDE。目标是通过第 3 方代码单步执行从 DLL 调用导出函数的点。

        启动调试器会正确启动 IDE,但在 TD IDE 中运行 TD 项目会导致 VS 中 TD IDE 使用的 DLL 出现异常。

        如何忽略来自项目外部的异常?自 09 年以来,有没有人能够解决这个问题?

        【讨论】:

          猜你喜欢
          • 2014-03-12
          • 1970-01-01
          • 1970-01-01
          • 2012-09-25
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-12-11
          • 1970-01-01
          相关资源
          最近更新 更多