【问题标题】:Debug Breakpoint doesn´t work only in DataModule unit - Delphi调试断点仅在 DataModule 单元中不起作用 - Delphi
【发布时间】:2009-07-17 14:55:32
【问题描述】:

调试断点在我系统的所有其他 38 个单元中都可以正常工作。但是,在我的具有 +- 10.000 行的 DataModule 中,delphi 在我按 F9/F8/F7 启动后禁用。在该单元源的任何部分,即使在 OnCreate、SQLConnection.Active:=true 等强制性步骤上也是如此。 详细信息:直到 +- 20 天前都可以正常工作。 我正在使用 D7 并且还拥有所有组件来源。 谢谢 费利佩

【问题讨论】:

  • 大家好!我发现了这个问题。这是 Delphi7 中的一种奇怪行为,它限制了接口类部分中的字段数量,介于:类型 TDM=class(TDataModule) 和私有部分之间。我删除了一些字段(DataSet Fields(+-40 个字段))并再次运行 degu。我再次添加此字段,并且调试不运行。我确定这是一个限制,因为我删除了哪些组件字段并不重要。我尝试了几个,添加,测试和删除。很遗憾,但确实如此……感谢您的帮助。

标签: delphi debugging breakpoints datamodule


【解决方案1】:

尝试进行完整构建 (Shift+F9)。如果这不起作用,那么如果您使用以下内容simulate a breakpoint in code 会发生什么?

asm int 3 end;

【讨论】:

  • 如果稍后您运行您的应用程序并得到“未处理的异常 80000003”,那是因为您忘记删除上述说明。 :-) 去过那里,做了那个,穿破了 T 恤。
【解决方案2】:

检查数据模块的源文件的多个副本。有时您认为自己正在运行的代码并不是编译器和调试器看到的代码。

接下来,确保您没有在代码中使用 {$D-} 或 {$DEBUGINFO OFF} 意外关闭调试。这可以关闭单个单元的调试信息。

另外,请确保您已在工具|选项|调试器选项中打开集成调试。我知道你说过你可以调试其他地方,但确保集成调试不会以某种方式意外关闭并没有什么坏处。

【讨论】:

  • 谢谢。但是,这个文件只有一个副本。已经找到并删除了所有 dcu 并重新编译。已经在本单元和项目源文件的源代码中直接写了{D+}。
  • 您是否在整个硬盘驱动器中搜索文件名?但是,您是否搜索了所有源以找到关闭调试的开关?我怀疑文件大小是问题所在,因为我有一个组件库,其中包含一个 9000 行的实用程序函数文件,我可以很好地调试它。
  • 是的。我使用 Windows 文件搜索并找到每个具有相同名称的副本并删除它们。我犯了一些“错误的源代码”并重新编译以验证哪个文件正在使用以及编译器报告的错误如预期。同一项目中的所有其他单元都可以正常运行调试断点
  • Felipe: 添加 ShowMessage('adsf');在您的 OnCreate 中并再次编译。当您的消息未显示时,您可能有多个副本(可能是旧的 bpl 文件?),或者您的类的名称不是唯一的,并且使用了另一个单元的另一个类。当您看到您的消息时,您的 debuginfo 就有一些东西。
  • 感谢福克斯。我做了20天:使用ShowMessage调试本单元的代码,显示变量值,但是太难了。
【解决方案3】:

我发现了这个问题。这是 Delphi7 中的一种奇怪行为,它限制了接口类部分中的字段数量,介于:类型 TDM=class(TDataModule) 和私有部分之间。我删除了一些字段(DataSet Fields(+-40 个字段))并再次运行 degu。我再次添加这些字段,并且调试不运行。我确定这是一个限制,因为我删除了哪些组件字段并不重要。我也尝试了来自不同表的几个字段,添加、测试和删除。这是一个耻辱,但这是真的...... 感谢您的帮助。

【讨论】:

    【解决方案4】:

    我有一个模糊的记忆,在旧 D7 中调试非常大的文件是错误的。 尝试在几个班级中打破你的大单元,并确定你是否可以在你的单元之外进行调试。 另一种选择可能是关闭大文件中的 debuginfo,但要调试的部分除外。值得一试。

    【讨论】:

    • 谢谢。我现在正在尝试这个。当我得到一些结果时,我会发布。
    【解决方案5】:

    Steve Trefethen, a while back, explaining some possible reasons 有一篇博文,虽然如果你说你可以调试其他单元,我怀疑它们会适用。

    我们在 Delphi 5 中的大型 DataModule 中遇到了同样的问题,我们无法对其进行调试,并且将其归结为文件太大而无法调试并且 Delphi 不喜欢它。当我们迁移到 Delphi 2007 时,我们可以再次调试它。不知道为什么,没有任何改变(代码方面)。

    【讨论】:

    • 谢谢。我现在读了这篇文章并做了一些测试。相同的行为。我会尝试将一些代码删除到其他单元并重试。
    【解决方案6】:

    Felipe,该单元是否不允许您在正在移入或移出内存的 dll 中进行调试?我在调试 dll 时发现,如果我在可执行文件中执行某些操作以执行另一个 dll 中的代码或卸载问题单元所在的 dll - Delphi 将禁用所有断点。通常重启 Delphi 并确保在内存中保留问题单元的 dll 的单个实例是解决此问题的唯一方法。

    我怀疑大小是问题,因为我有一个 17k 线单元,我会定期调试。

    【讨论】:

    • 谢谢道格。但是,我不使用任何 dll 或 bpl。我有所有组件的所有来源。此行为仅发生在所有程序代码的 DataModule 中。
    猜你喜欢
    • 2022-01-21
    • 2018-07-26
    • 1970-01-01
    • 2016-12-13
    • 2014-01-16
    • 1970-01-01
    • 2010-12-03
    • 1970-01-01
    • 2015-10-25
    相关资源
    最近更新 更多