【问题标题】:Why do I need to restart Delphi 7 to get the debugger to work sometimes为什么有时我需要重新启动 Delphi 7 才能使调试器工作
【发布时间】:2009-01-21 22:19:09
【问题描述】:

每天至少 4 次我需要重新启动 Delphi 以使调试器再次在断点处停止。有时我可以通过在重建代码后附加到进程来欺骗它再次工作。但大多数时候我做不到,这让我花费了大量时间返回并重新打开我想要的所有文件。

几乎每次发生这种情况时,我都会在尝试关闭 Delphi 时遇到某种致命错误。有什么解决办法吗?我有“最新”的 Delphi 7,在 WinXP 上运行,内存充足。我办公室的大多数其他人也遇到了这个问题。

【问题讨论】:

  • 项目中有COM对象吗?
  • (什么是大于 10 个字母的单词?)

标签: delphi ide crash debugging


【解决方案1】:

我们对 Delphi 7 的体验与您的类似:IDE 中相当频繁的崩溃,抽象错误、无效指针引用和 VCL 库中的异常。

这似乎取决于您加载的项目的复杂程度:我们的主要项目是一个 200,000+ 行程序,具有多个 MDI 表单和第三方库。实际上,每当我们退出 Delphi 时,我们都必须处理灾难性的致命错误。我们非常擅长使用任务管理器来追捕 Delphi32 进程并将其杀死——实际上有时这是唯一的出路。

我们已经升级到 Delphi 2009,它的稳定性显着提高。我的感觉是 Delphi 7 有很多错误,你要么不得不忍受它们,要么升级。

【讨论】:

    【解决方案2】:

    在调试过程中,是正常退出程序,还是使用IDE强制调试停止/杀死应用程序?我发现使用 IDE 强制关闭应用程序会在一段时间后出现问题(通过重新启动 IDE 解决),而从应用程序内退出程序不会导致此类问题。

    警告:我的经验是使用 Delphi 6。

    【讨论】:

      【解决方案3】:

      我在 D7 中也有过这种情况——但实际上只有一个特定的项目(诚然非常大,许多形式和自制的自定义组件)。其他项目(一些同样大)也很好。

      我的感觉是,它在某种程度上与使用从其他框架/表单子类化的框架和/或表单有关,您可以在 IDE/调试器中打开后代表单,而不是祖先表单。

      因为和你一样,我觉得每天关闭并重新启动 IDE 六次是一种巨大的痛苦,所以我不厌其烦地为项目创建了一个 .DSK 文件,该文件具有所有父窗体里面的东西,所以当德尔福启动该项目时,它会“自动”打开所有其他表单。一旦确定 DSK 的内容正确,我将 .DSK 文件设为只读...!

      这意味着编辑器会“忘记”我当时打开了哪些文件,但至少它总是会自动打开所有似乎使 IDE “正常运行”的东西。如果我要在几天内处理特定的少数文件,我只需手动将它们添加到 .DSK 文件中。

      我似乎记得 Delphi 会抱怨文件是只读的,但这种方法消除了大约 80% 的日常痛苦。

      然后我做的另一件事是让任务管理器加载,最小化,作为我系统启动的一部分。至少那时这是一个简单的 ALT-TAB 案例,可以找到可能杀死 IDE 的东西。 :-)

      【讨论】:

      • 提示 1:Ctrl+Shift+Esc 是任务管理器的快捷方式,如果系统启动时未启动也可以使用。提示 2:进程资源管理器 (technet.microsoft.com/en-us/sysinternals/bb896653.aspx) 可以设置为替换任务管理器(相同的 kbd 快捷方式)并做更多的事情。强烈推荐!
      • 如何制作 .DSK 文件?我删除了我的 .DST 文件,但没有帮助。我看到这个看起来和你说的很相似。 advanceis.com/delphi-cppb/articles/… 但我不知道 .DSK 文件包含什么。
      • DSK 是“桌面”文件,它包含有关您在 IDE 中打开的文件的信息(以及其他信息)。如果您检查环境选项以“保存桌面”,那么 Delphi 将在您的项目旁边的文件夹中创建/更新一个 dsk 文件。我会做一个简单的例子,很快就会在这里发布!
      • 你链接的那篇文章很有趣,但最后他们所建议的实际上是一种更灵活、更优雅的保护 dsk 的方式。我实际上很喜欢他们的方法——Delphi 不太喜欢你将 DSK 文件设置为只读,这是我的廉价而愉快的解决方案。 :-)
      【解决方案4】:

      好的,根据我之前对这个问题的回答,这里有一个示例 DSK 文件。我不能将此作为对我的回复的评论,否则我会。 :-)

      它们真的没什么大不了的,它们非常简单明了,浏览一下应该可以帮助您了解这一点。我实际上建议您只需加载 Delphi,打开“自动保存桌面”选项(它在环境或编辑器中,我忘记了),根据需要安排 IDE(打开各种源文件等),然后保存/关闭项目。您将在项目目录中找到一个 MyProject.dsk (etc) 文件 - 只需将该文件设为只读(或按照您在 cmets 中链接到的文章中的建议进行操作,并在您可以随时携带的地方制作它的备份副本随时返回)。

      无论如何,这里有一个示例 DSK,可以让您了解自己在玩什么。它们只是 INI 类型的文本文件,如果您愿意,可以在记事本中破解它们。 :-)

      [模块] Module0=C:\Projects\GUIPlay\src\du_FrameUtils.pas Module1=C:\Projects\GUIPlay\src\du_BaseDialogs.pas Module2=C:\Projects\GUIPlay\src\dm_DataMain.pas Module3=C:\Projects\GUIPlay\src\du_Main.pas 计数=4 EditWindowCount=1 [C:\Projects\GUIPlay\src\du_FrameUtils.pas] ModuleType=SourceModule 表单状态=1 窗体顶部=0 [C:\Projects\GUIPlay\src\du_BaseDialogs.pas] ModuleType=SourceModule 表单状态=1 窗体顶部=0 [C:\Projects\GUIPlay\src\dm_DataMain.pas] ModuleType=SourceModule 表单状态=1 FormOnTop=1 [C:\Projects\GUIPlay\src\du_Main.pas] ModuleType=SourceModule 表单状态=1 FormOnTop=1 [C:\Program Files\Borland\Delphi7\Projects\ProjectGroup1.bpg] 表单状态=0 窗体顶部=0 [C:\Projects\GUIPlay\src\GUIPlay.dpr] 表单状态=0 窗体顶部=0 [C:\Projects\GUIPlay\src\GUIPlay.todo] 表单状态=0 窗体顶部=0 [编辑窗口0] 观看次数=4 当前视图=2 查看0=0 视图1=1 视图2=2 视图3=3 CodeExplorer=CodeExplorer@EditWindow0 MessageView=MessageView@EditWindow0 创建=1 可见=1 状态=0 左=212 顶部=157 宽度=1127 身高=757 最大左=-1 最大顶部=-1 客户端宽度=1119 客户高度=723 左面板大小=140 LeftPanelClients=CodeExplorer@EditWindow0 LeftPanelData=0000040000000000000000000000000000000000000000000000100000000000000000C000000436F64654578706C6F726572FFFFFFFF RightPanelSize=0 底部面板大小=0 BottomPanelClients=MessageView@EditWindow0 底部面板数据=00000400010000000B0000004D6573736167655669657700000000000000000000000000000000000100000000000000000B0000004D6576963616FFFFFFFF5766 [查看0] 模块=C:\Projects\GUIPlay\src\du_FrameUtils.pas 光标X=1 光标Y=1 顶线=1 左列=1 [查看1] 模块=C:\Projects\GUIPlay\src\du_BaseDialogs.pas 光标X=1 光标Y=1 顶线=1 左列=1 [视图2] 模块=C:\Projects\GUIPlay\src\dm_DataMain.pas 光标X=1 光标Y=1 顶线=1 左列=1 [视图3] 模块=C:\Projects\GUIPlay\src\du_Main.pas 光标X=1 光标Y=1 顶线=1 左列=1 [手表] 计数=0 [断点] 计数=0 [地址断点] 计数=0 [主窗口] 创建=1 可见=1 状态=2 左=0 顶部=0 宽度=1571 身高=143 最大左=-1 最大顶部=-1 最大宽度=1579 最大高度=143 客户端宽度=1571 客户高度=109 [专案经理] 创建=1 可见=1 状态=0 左=1188 顶部=135 宽度=345 高度=762 最大左=-1 最大顶部=-1 客户端宽度=337 客户高度=736 待定高度=305 LRDockWidth=438 可停靠=1 [对齐调色板] 创建=1 可见=0 状态=0 左=200 顶部=144 宽度=156 高度=84 最大左=-1 最大顶部=-1 客户端宽度=150 客户高度=60 [物业检查员] 创建=1 可见=1 状态=0 左=3 顶部=147 宽度=272 身高=783 最大左=-1 最大顶部=-1 客户端宽度=264 客户高度=757 待定高度=783 LRDockWidth=272 可停靠=1 拆分位置=85 排列方式=名称 SelectedItem=名称 扩展项目= 隐藏类别= [对象树] 创建=1 可见=0 状态=0 左=0 顶部=142 宽度=190 高度=314 最大左=-1 最大顶部=-1 客户端宽度=182 客户高度=288 待定高度=314 LRDockWidth=190 可停靠=1 [CodeExplorer@EditWindow0] 创建=1 可见=1 状态=0 左=0 顶部=12 宽度=140 身高=711 最大左=-1 最大顶部=-1 客户端宽度=140 客户高度=711 待定高度=305 LRDockWidth=140 可停靠=1 [MessageView@EditWindow0] 创建=1 可见=0 状态=0 左=12 顶部=0 宽度=1107 高度=66 最大左=-1 最大顶部=-1 客户端宽度=1107 客户高度=66 待定高度=66 LRDockWidth=443 可停靠=1 [码头主机] DockHostCount=0

      如您所见,它实际上是一个要重新打开的文件列表,以及窗口的位置/大小以及打开文件的顺序。

      祝你好运! :-)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-12-23
        • 1970-01-01
        • 2020-03-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多