【问题标题】:How to debug Delphi IDE?如何调试 Delphi IDE?
【发布时间】:2012-03-27 11:51:13
【问题描述】:

如何调试Delphi IDE的详细步骤是什么?

我从其他帖子中了解到,需要创建一个项目,并在项目的调试器设置中,将项目的“主机应用程序”设置为 Delphi (C:\Program Files\Borland\BDS\3.0\Bin\bds.exe)。然后,当项目在调试器中运行时(通过按 F9 键),应该会出现 Delphi IDE 的第二个实例。

我已经成功完成了上述步骤。但是,当我在调试器模式下运行项目时,我看不到任何 Delphi IDE 打开的第二个实例。

动机

有一个VCL 组件,我确实有它的源代码,可以很好地构建、编译和安装。但是,当它被放置在项目中的窗体上时,当您关闭窗体时,Delphi 会挂起。所以,我想找出为什么 Delphi 在退出时冻结了表单上的这个组件。 (它在设计时挂起,在关闭项目时)。

【问题讨论】:

  • 调试是什么意思:看到另一个进程(第二个IDE)在调试器(第一个IDE)下运行,还是你真的想找到并删除某个bug?询问是因为问题和标题使它看起来像是要调试 IDE 本身!您肯定可以看到它在您的调试器下运行,但查找和删除错误是另一回事:您需要源代码,而您没有 IDE 的源代码!
  • 抱歉没有更清楚。有一个 VCL 组件,我确实有它的源代码,可以很好地构建、编译和安装。但是,当它被放置在项目中的窗体上时,当您关闭窗体时,Delphi 会挂起。所以,我想找出为什么 Delphi 在退出时冻结了表单上的这个组件。
  • 我将您的澄清添加为对问题本身的编辑,因为这是每个人都会寻求澄清的地方。要求更多澄清:你是说你有一个 DPK 作为唯一的活动项目,你将它的主机应用程序设置为 Delphi IDE,点击运行,它不启动 IDE?它还有其他作用吗?示例:它会给您一条错误消息吗?
  • 看看 Raize 的 CodeSite 之类的东西。为组件操作的所有参数和输入输出添加 Codesite.Send 行。有一个 IDE 实用程序可帮助对所有功能执行此操作。这将帮助您了解正在发生的事情以及原因。并且不会干扰弹出消息框等操作。

标签: delphi debugging delphi-2005


【解决方案1】:

您的项目很可能是 EXE 类型的。 EXE 类型的项目不需要宿主应用程序,因此忽略该设置,不启动其他 IDE。至少,您应该使您的项目成为 DLL 类型:这将启动第二个 IDE,但这不会很有帮助。

您提到的技术通常用于调试您的设计时包项目。创建一个设计时打包项目,将其安装到 IDE 中,将项目的宿主应用程序设置为 IDE,设置一些断点,点击 F9 将启动 Delphi 的第二个副本。

您还可以通过手动启动第二个副本然后使用“运行”菜单中的“附加到进程”命令来“调试”Delphi IDE,但这不会很有用,因为您不能轻易找到你的代码来设置断点。

【讨论】:

  • 抱歉没有更清楚。有一个 VCL 组件,我确实有它的源代码,可以很好地构建、编译和安装。但是,当它被放置在项目中的窗体上时,当您关闭窗体时,Delphi 会挂起。所以,我想找出为什么 Delphi 在退出时冻结了表单上的这个组件。
  • 谢谢 Cosmin Prund。您的回答有关让 IDE 的第二个副本运行。我现在可以看看调试组件了。
【解决方案2】:

我会首先检查挂起是否发生在运行时和设计时。在运行时代码中动态实例化组件。如果挂起仍然发生,那么您可以使用单个调试器实例正常单步执行组件的源代码。您不需要调试到正在运行的 IDE 实例,除非该行为仅发生在 IDE 进程中。

【讨论】:

  • 挂起只发生在设计时而不是运行时。如果我用一个表单创建一个简单的项目,将问题组件放在它上面并运行项目,它运行良好,甚至可以正常终止。但是,当我尝试在 IDE 中关闭项目或在该项目打开的情况下退出 Delphi 时,Delphi 挂起。因此,我想找出导致 IDE 挂起的原因。
【解决方案3】:

首先找到并打开组件包,将运行时和设计时包构建选项从 Release 转到 Debug,如果它们还没有,然后重新构建。

然后保存一个包含两个包项目的项目组(一个设计时和一个运行时,在某些特殊情况下,人们只有一个包,即设计时+运行时合二为一)。

然后按照步骤将 BDS.exe 设置为主机应用程序。

我很想在您知道已损坏的组件中添加一些 OutputDebugString 消息:

构造函数:

constructor TMyComponent.Create(AOwner:TComponent);
begin
    inherited;
    // other stuff.
    OutputDebugString('Created TMyComponent');
end;

析构函数:

destructor TMyComponent.Destroy(AOwner:TComponent);
begin
    OutputDebugString('Destructor TMyComponent starts');
    inherited;
    // other stuff.
    OutputDebugString('Destructor TMyComponent finish');
end;

TMyComponent所在单元的终结部分:

 finalization
      OutputDebugString('Finalization section for Unit MyComponentUnit');
 end.

查看 delphi 调试器中的输出事件页面,您可以了解代码到达了多远,即使您没有获得可用于相当准确地定位缺陷的异常断点,您也可以使用像上面一样输出DebugString消息,或者你甚至可以在delphi中设置Non Breaking Breakpoints,然后关闭断点属性“Break on exception”,而是设置一个“日志消息”。这些消息(断点消息)的好处是不需要对您的组件造成任何损坏,以便为您的调试工具包添加一些简单的“打印语句调试”功能。

【讨论】:

  • OP 说这是关于“...一个 VCL 组件,我确实有源代码”。这似乎与缺少源的 DPK 无关,除非您知道此处未发布的内容。
  • 好点。我的回答从根本上与所需要的相反。固定。
【解决方案4】:

如果 Delphi 的第二个实例没有启动,那么您的 bds.exe 路径不正确。

【讨论】:

  • 路径是正确的,因为我通过右键单击 Delphi 2005 (bds.exe) 快捷方式图标并复制它的目标位置来获得位置。如果我通过整个路径进入资源管理器窗口,Delphi 2005 也会启动。所以路径是正确的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-06
  • 2015-01-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-30
相关资源
最近更新 更多