当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《在Delphi中:如何在调试时跳过代码段?》经验,为你挑选了3个好方法。

在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(Works为这个简单的例子.实际上,它没有);

在FastMM的情况下:暂时禁用fastmm;

有没有办法提示IDE我从来没有兴趣进入某个代码块,或者我是否总是要设置额外的断点或使用F4来避免这种情况?

我希望有一些神奇的编译器指令,如{$ NODEBUG BEGIN/END}或类似的东西.

在大多数情况下,能够排除整个单元对我来说足够精细,但能够避免某些方法或甚至代码行会更好.

更新:也许codegear应该引入像跳过点(而不是断点)的东西:-)



1> Mason Wheele..:

有一个"神奇的nodebug开关".{$ D-}将禁用调试代码的生成.将它放在FastMM单元的顶部,您不会最终跟踪它.如果你最终进入了一个你不想进入的功能,SHIFT-F8会很快让你出局.(警告:不要在堆栈代码例程中使用SHIFT-F8.可能导致不可预知的行为.F4到底部.)



2> Rob Kennedy..:

如果您正在跳转到FastMM代码,那么就会发生内存操作.您显示的代码没有任何内存操作,因此您的问题不完整.我会试着猜你的意思.

When a subroutine has local variables of compiler-managed types (such as strings, interfaces, or dynamic arrays), the function prologue has non-trivial work to do. The prologue is also where reference counts of input parameters are adjusted. The debugger represents the prologue in the begin line of the function. If the current execution point is that line, and you "step into" it, you'll be taken to the RTL code for managing the special types. (I wouldn't expect FastMM to be involved there, either, but maybe things have changed from what I'm used to.) One easy thing to do in that situation is to "step over" the begin line instead of into it; use F8.

如果您在输入突出显示的行时真的按F7 ,那么您做错了.那是踩到begin线,而不是DoStuff被调用的线.因此,您是否接受了FastMM代码与实现无关DoStuff.要调用调用DoStuff,当前执行点应该已经调用它的行.

如果您只想DoStuff在迭代23498938上进行调试,则可以在该函数中设置条件断点.单击装订线以生成正常断点,然后右键单击它以显示其属性.在那里,您可以定义每次执行到达该点时将评估的条件.只有在条件为真时,调试器才会停在那里.按F8"跳过" DoStuff调用,如果条件为真,调试器将停在那里,就像你按下F7一样.

您可以切换"使用调试DCU"选项,以避免进入大多数RTL和VCL单元.我不知道FastMM是否包含在该集合中.关键的区别在于您链接到的DCU是否使用调试信息进行编译.该设置会更改库路径以包含或排除调试DCU所在的子目录.我认为您可以配置包含或排除的调试目录集,以便根据"调试DCU"设置添加或删除自定义目录集.

回到断点.您可以通过为断点指定名称来设置断点组.您可以使用高级断点在传递断点时启用或禁用命名的断点组.(如果需要,断点组只能有一个断点.)因此,例如,如果您只想在程序中传递其他位置Y,则只想在位置X处中断,可以在X处设置禁用断点Y处的非断点断点.在Y处设置"启用组"设置以启用组X.

您还可以利用已禁用的断点而无需自动启用和禁用.您的断点出现在"断点"调试器窗口中.如果您正在单步执行DoStuff并且决定要检查bla此时间,请转到断点窗口并启用断点bla.无需导航到bla实现以在那里设置断点.

有关高级断点的更多信息,请参阅几年前在Delphi中使用非断点断点和Cary Jensen撰写的文章.



3> Aikislave..:

我可能错过了您的帖子,但使用FastMM4,您可以编辑FastMM4Options.Inc包含文件并删除'.' 从以下定义:


来自FastMM4Options.inc****

{启用此选项可禁止生成FastMM4.pas单元的调试信息.这将阻止集成调试器进入内存管理器代码.}

{$ .define NoDebugInfo}


重新编译(可能需要构建)时,调试器将(应该)不再调试FastMM代码.

推荐阅读
勤奋的瞌睡猪_715
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有