如何加载包并保持调试器正常工作?

时间:2009-07-23 05:13:42

标签: delphi plugins debugging

我在JVCL中使用TJvPluginManager来为我的程序创建和加载基于BPL的插件。问题是,其中一个插件没有正确加载,我无法调试它。每次我尝试跟踪加载序列时,它都会到LoadLibrary API调用,然后调试器似乎忘记了它的用途。它完全失去了将程序代码与源代码行相关联,在调用堆栈中提供有意义的数据或显示局部变量的能力。它仍将在断点处停止,但它会中断CPU窗口,并删除所有内联源代码。

这种情况发生在Delphi 2007和2009上,这让我感到疯狂。有没有人知道如何在不破坏调试器的情况下加载插件?有没有人知道为什么它首先打破了它?

注意:我不是在寻找其他调试方法。我知道关于跟踪和记录的所有内容以及其他所有内容。我想要的是了解出了什么问题以及如何解决它。当然,我不是唯一一个曾经使用过TJvPluginManager的人吗?

6 个答案:

答案 0 :(得分:3)

您的问题的答案不是:您是否尝试通过设置主机应用程序并在程序包的启动代码中添加断点来调试程序包项目?

答案 1 :(得分:1)

我发现Ray Kanopka(Raize)CodeSite对于在集成调试器正在运行的情况下进行调试非常有用。使用CodeSite思考我想要监控的事情实际上有助于我专注于重要的事情 - 它会强制养成良好的习惯。

答案 2 :(得分:0)

Codesite的另一个替代方案是Overseer,它是nexus project的一部分,但不管是什么,所以不要求你使用他们的框架。 Codesite是目前最好的选择,但在紧要情况下监督也会起作用。

答案 3 :(得分:0)

我发现使用插件包可能会有问题,很多年前切换到完全基于COM的插件实现,从来没有遇到任何问题。基于COM的插件的另一个优点是,它们不需要Delphi来编写,当主应用程序切换到新版本的编译器时不需要重新编译(我用Delphi 5编译的插件仍然运行正常,针对主应用程序编译在Delphi 2009中!)他们更容易编写测试应用程序来协助调试。

我注意到的唯一副作用是共享代码最终存在于两个可执行文件中,并且插件需要注册到注册表中。

答案 4 :(得分:0)

嗯......这是一个愚蠢的问题,但我不得不问:初始化函数是否有其他插件可用的EXACT声明语法?(从你的问题中,我扣除了你让其他一些工作的工作)

答案 5 :(得分:0)

检查您的依赖项。确保每个单元仅编译为一个包。每当包需要从另一个包引用一个单元时,使用requires子句来执行此操作。观察有关隐式链接单元的编译器警告。