【问题标题】:Why are breakpoints green and not working?为什么断点是绿色的并且不起作用?
【发布时间】:2016-01-11 03:03:05
【问题描述】:

我正在尝试对我的代码进行调试,但不知何故它停止了工作。这是一个 sn-p 和它显示的绿线:

  • 我尝试右键单击我的项目并clean 它。
  • 试过了 删除临时文件,例如 .stat.dcu
  • 来回切换到ReleaseDebug 模式,重新构建、重新编译它们。
  • Project -> Options -> Delphi compiling下的Debugging选项都设置为true。
  • 检查search paths中是否没有重复文件。
  • 其他项目运行正常。
  • 还尝试说脏话。

我做错了什么?

【问题讨论】:

  • 你在做一个调试版本吗?
  • 如果说脏话没有用,我不知道该说什么。
  • 也许您的主机应用程序集在运行 -> 参数 -> 调试器 -> 主机应用程序中不适合您的需要?还是Run -> Attach to process 必须在开始调试之前设置?
  • 尝试将.dproj 文件重命名为其他名称,例如添加扩展名.old,然后重新加载您的项目。它将自动生成一个新的。当然,您可能会丢失大量设置,但这似乎是最简单的解决方案。
  • 经常遇到这个问题。它从几个 Delphi 版本到最新版本就存在。我从来没有找到一种轻松复制它的方法。尽管如此,为了让它再次工作,我遵循以下步骤:1)做一个干净,2)停止 IDE,3)做一个完整的构建。

标签: delphi delphi-10-seattle


【解决方案1】:

这是一种正常的编译器行为。当程序(代码行)从未从程序内部的任何地方调用时,就会发生这种情况。编译器会跳过这些过程和函数(其中的所有代码行)。 看图。

您只需要检查该过程(行)是否真的至少从应用程序内的任何位置调用过一次。

附加

当代码行永远不能被调用并且 this(逻辑语句)可以在编译时评估(结果是预先知道的并且在运行时不会受到影响)时,也会发生这种情况。编译器优化跳过这些行的代码。这就是为什么它不接受他们的休息。

这是后一个过程的反汇编。第 37 行和第 38 行的 if false then ... 语句被省略:

【讨论】:

    【解决方案2】:

    除了 asd-tm 的答案之外,我在所有单元中都包含以下行:

    unit SomeRandomUnit;
    {$I ProjOptions.inc}
    

    在 ProjOptions.inc 文件中,我包含以下代码:

    // Compiler switches:
    //              Debug Info      Optimisation
    // DEBUG            On              Off
    // RELEASE          Off             On
    {$IFDEF DBG}
        {$D+}
        {$O-}
    {$ELSE}
        {$D-}
        {$O+}
    {$ENDIF}
    

    这样,当我调试时,优化关闭并打开调试信息,而无需担心意外切换项目 > 选项中的某些内容。从 PROJECT\objects 文件夹中手动删除 DCU 文件(与上述 .inc 文件结合)应该可以保证断点再次工作(至少在 DEBUG 版本中)。

    【讨论】:

      猜你喜欢
      • 2010-09-09
      • 1970-01-01
      • 1970-01-01
      • 2011-08-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-19
      相关资源
      最近更新 更多