如何在Delphi中调试被另一个DLL调用的DLL

11
假设我有一个名为A的EXE文件,它加载了一个名为B的DLL文件,而B又加载了另一个名为C的DLL文件。所有这三个文件都是用Delphi编写的,我拥有它们的源代码。
如果我想调试DLL B,我没有问题。我转到“运行|参数”并将A.EXE作为主机输入。当我点击运行时,Delphi运行A,它加载B,我可以尽情地进行调试。
但是调试DLL C就不同了。看起来Delphi只允许我调试从EXE直接加载的DLL。但这是从另一个DLL加载的DLL。
有没有什么办法?谢谢。
这是Delphi 7。

我认为现代Delphi调试器可以让你轻松地进行全程调试。 - David Heffernan
2
Delphi-XE2在“选项|调试器选项|Embarcadero调试器”下有一个“调试生成的进程”的选项。Delphi-7有这个选项吗?它是“选中的”吗?您是否尝试设置运行|DLL C参数为A.EXE? - James L.
另一个想法是,在加载 DLL C 后,您可能能够加载符号表。XE2 有一个调试“模块”窗口,您可以右键单击一个模块并强制重新加载符号表,如此处所讨论的:https://dev59.com/xmoy5IYBdhLWcg3wEJ9n#12707464 -- 或许 Delphi-7 也有类似的功能? - James L.
1
James L.的“调试生成的进程”解决了问题。谢谢。我以前从未知道过这个功能。如果您把它放在答案中,我会接受它。 - David Dubois
你确定在Delphi IDE中无法打开DLL“C”并将其“宿主”设置为A.Exe吗?我真的怀疑Delphi对DLL的加载方式,直接或间接,并不太关心。我会在其他地方寻找问题,也许你的“B” DLL正在从不同的位置加载不同的“C” DLL,也许你没有在被调用的例程中设置断点。 - Cosmin Prund
1个回答

9

使用“调试生成的进程”复选框。

在 Delphi 7 中,该选项位于 工具 -> 调试器选项 -> 常规。

在 Delphi XE-2 和 XE-5 中,该选项位于 工具 -> 选项 -> 调试器选项 -> Embarcadero 调试器。


3
这个答案是由詹姆斯·L在原始帖子的评论中提供的,但他拒绝将其发布为答案。我将答案放在这里,以便未来的访问者更容易找到它。 - David Dubois
1
@david - 像你这样的人让 StackOverflow 变得更好! - Gabriel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接