代码之家  ›  专栏  ›  技术社区  ›  Wouter van Nifterick Andrey

在Delphi中:如何在调试时跳过代码部分?

  •  14
  • Wouter van Nifterick Andrey  · 技术社区  · 16 年前

    在Delphi中调试时,我经常不小心进入到我不感兴趣的代码中。

    让我们先说,我知道你可以用F8,你可以用F4运行到某一行。

    例子:

    function TMyClass.DoStuff():Integer;
    begin
      // do some stuff
      bla();
    end;
    
    procedure TMyClass.Foo()
    begin
      if DoStuff()=0 then // press F7 when entering this line
        beep;
    end;
    

    示例:我想通过按F7进入dostuff()方法,但我没有去那里,而是首先进入fastmm4.fastgetmem(),这是一个庞大的汇编代码块,显然我现在不感兴趣。

    有几种方法可以解决这个问题,我不喜欢其中任何一种:

    • 在“上添加断点” BLA “(如果您只想在特殊情况下进入dostuff,比如迭代23498938,那么几乎没有用);

    • 不要按F7,而是手动将光标移动到“ BLA “,然后按F4(适用于此简单示例。实际上,它没有);

    • 如果是fastmm:暂时禁用fastmm;

    有没有什么方法可以暗示IDE我是 从未 有兴趣进入某个代码块,还是我总是需要设置额外的断点,或者使用F4来尝试避免这种情况?

    我希望有一些像$nodebug begin/end之类的神奇编译器指令。

    在大多数情况下,能够排除整个单元对我来说已经足够细粒度了,但是能够避免某些方法甚至代码行会更好。

    更新:也许codegear应该介绍 跳跃点 (与断点相反):-)

    8 回复  |  直到 13 年前
        1
  •  23
  •   Mason Wheeler    16 年前

    有一个“神奇的Nodebug开关”。$d-将禁用调试代码的生成。把它放在你的fastmm单元的顶部,你不会最终追踪到它。如果你最终选择了一个你不想加入的功能,按F8键会很快让你退出。( 警告: 不要在与堆栈一起运行的汇编代码例程中使用shift-f8。会导致不可预测的行为。它的底部是F4。)

        2
  •  7
  •   Rob Kennedy    16 年前

    如果您要跳到fastmm代码中,则会发生内存操作。您所显示的代码没有任何内存操作,因此您的问题不完整。我试着猜猜你的意思。

    当一个子例程具有编译器管理类型的局部变量(如字符串、接口或动态数组)时,函数序言有非常重要的工作要做。序言也是调整输入参数的参考计数的地方。调试器表示 begin 函数行。如果当前执行点是该行,并且您“单步执行”它,那么您将被带到RTL代码来管理特殊类型。(我也不希望Fastmm参与进来,但是事情可能已经从我以前的样子改变了。)在这种情况下,一件容易的事情就是“跨过”这个 开始 用线代替线;用F8。

    如果你真的按F7 套房 你的突出显示行,那你就错了。这是进入 开始 线, 线路在哪里 DoStuff 被称为。因此,无论您是否使用fastmm代码,都与 道格斯 . 调试对的调用 道格斯 ,当前执行点应该已经 电话线。

    如果只想调试 道格斯 在迭代23498938中,可以设置 条件断点 在那个函数中。在装订线中单击以创建普通断点,然后右键单击以显示其属性。在这里,您可以定义一个条件,该条件将在每次执行达到该点时进行评估。只有当条件为真时,调试器才会停止。按F8键“跳过” 道格斯 调用,如果条件为真,调试器将在那里停止,就像您按了F7一样。

    您可以切换“使用调试DCU”选项以避免进入大多数RTL和VCL单元。我不知道fastmm是否包括在那个集合中。关键区别在于您链接到的DCU是否使用调试信息编译。设置改变了 图书馆路径 包括或排除调试DCU所在的子目录。我 认为 可以配置包含或排除的调试目录集,以便根据“调试DCU”设置添加或删除自定义目录集。

    回到断点。你可以成立 断点组 通过为断点指定名称。可以使用高级断点在传递指定断点组时启用或禁用该断点组。(如果需要,断点组只能有一个断点。)因此,例如,如果只想在位置X中断,如果在程序中还传递了其他位置Y,则可以在X处设置禁用的断点,在Y处设置非中断断点。在Y处设置“启用组”设置以启用组X。

    您还可以利用禁用的断点,而无需自动启用和禁用。断点出现在“断点”调试器窗口中。如果你要通过 道格斯 你决定要检查 bla 这一次,转到断点窗口并在以下位置启用断点 BLA . 无需导航到 BLA 的实现来设置断点。

    有关高级断点的详细信息,请参阅 Using Non-Breaking Breakpoints in Delphi 以及几年前Cary Jensen的文章。

        3
  •  5
  •   Aikislave    16 年前

    我可能错过了你的帖子,但是通过fastmm4,你可以编辑fastmm4options.inc include文件并从以下定义中删除“.”:


    来自FastMM4Options.Inc.***

    启用此选项可禁止生成 fastmm4.pas单元。这将阻止集成调试器进入 内存管理器代码。

    $.定义nodebuginfo


    当重新编译(可能需要构建)时,调试器将不再调试fastmm代码。

        4
  •  4
  •   Jim McKeeth    16 年前

    使用fasmmm的预编译非调试DCU

        5
  •  3
  •   mjn anonym    13 年前

    在项目DPR文件中,我使用

    uses
    {$IFNDEF DEBUG} FastMM4, {$ENDIF}
      ... // other units
    

    在调试模式中排除fastmm4。不需要更改fastmm4,所以当我更改为其他版本时,不必记住在fastmm中添加$D-。

        6
  •  2
  •   utku_karatas    16 年前

    对于afaik,调试器只知道在浏览路径中可以在选项中修改的文件。因此,如果排除模块的路径,您对调试不感兴趣,这将产生您想要做的事情的效果。

    一个警告:代码完成还依赖于浏览路径,因此在需要时可能会遇到代码完成不足的情况。

        7
  •  2
  •   Richard A    16 年前

    虽然这不是对您的问题的直接回答,但是您可以通过将断点放在BLA来修改第一个建议的解决方案,而BLA只有在通过foo处的断点(或您选择的其他条件,如迭代计数)时才启用。然后它只会在你想要的时候破裂。

    顺便说一句,我发现越来越多的情况是,我不会在断点处停止执行,而是将变量值或堆栈转储转储到消息日志。这使得分析比在飞行中检查变量等更为仔细。

        8
  •  0
  •   lkessler    13 年前

    不,我不相信有什么方法可以告诉调试器在某段代码中永不停止。没有魔法指示。

    当你进入一个你不想进入的程序时,你能做的最好的事情就是使用shift+f8,它将一直运行到返回。然后执行F7或F8退出该步骤。


    嗯。现在我看到梅森的回答了。学到了一些东西。谢谢,Mason。+ 1