如何解决“Binary没有用调试信息构建”?

时间:2009-03-14 20:43:23

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

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

有谁知道如何才能让它发挥作用?

6 个答案:

答案 0 :(得分:2)

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

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

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

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

同样,我仍然有兴趣了解当您尝试设置断点时会发生什么。如果你去VS中的断点窗口,它应该澄清为什么断点不能被设置,如果那是正在发生的事情。

嗯。我对/Z7没有太多经验,你还有DLL的.obj文件吗?文档似乎暗示了调试所必需的。或者,我尝试使用/Zi构建并获取该吸盘的.pdb。

答案 1 :(得分:1)

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

您可以在Delphi中调试Delphi DLL,并且可以将这些DLL与其他未使用Delphi编译的应用程序一起使用,只要您标记要导出的Delphi函数。你不能做的是在第三方调试器中象征性地调试这些DLL,这至少需要理解Object Pascal名称的修改。

答案 2 :(得分:1)

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

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

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

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

答案 3 :(得分:0)

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

答案 4 :(得分:0)

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

答案 5 :(得分:0)

十年后,这发生在我身上,在调试Team Developer中使用的自定义DLL时,设置调试命令以启动Team Developer IDE。目的是单步执行第三方代码,直到从DLL调用导出功能。

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

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