德尔福:如何在调试时跳过部分代码?
我经常意外地进入我在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;
有没有办法在暗示我从未兴趣到步入代码某一块,或者说我总是要设置额外的断点,或者使用F4要尽量避免这种情况的IDE?
我希望有一些神奇的编译器指令,像{$ NODEBUG BEGIN/END}或类似的东西。
在大多数情况下,能够排除整个单元对我来说足够细,但能够避免某些方法甚至是代码行会更好。
更新:也许CodeGear公司应该引入像跳过点(而不是突破点):-)
有一个“magic nodebug开关”。 {$ D-}将禁用调试代码的生成。将它放置在FastMM单元的顶部,并且不会最终追踪到它。如果你最终选择了一个你不想进入的功能,那么SHIFT-F8会很快让你出来。 (警告:不要使用SHIFT-F8从堆栈中玩耍的汇编代码例程中,不可预知的行为可能会导致.F4到它的底部)
据我所知,调试器只知道在浏览路径的文件,您可以修改的选项。所以,如果你排除模块的路径,你不会感兴趣的调试,这将产生你想做的事情的效果。
一个警告:代码完成也依赖于浏览路径,所以您可能会遇到代码完成在需要时会缩短的情况。
不,我不相信有一种方法可以告诉调试器永远不要在某段代码中停下来。没有魔术指令。
当你进入你不想进入的例程时,你可以做的最好的事情就是使用Shift + F8,它将运行到返回。然后做一个F7或F8退出程序。
嗯。现在我看到梅森的答案。学到了一些东西。谢谢,梅森。+1
使用FasmMM
虽然它不是直接回答你的问题,你可以通过把断点BLA修改首次提出的解决方案,只有当一个断点时有效的预编译非调试DCU在Foo通过(或您选择的其他条件,如迭代计数)。然后它只会在你想要时破碎。另外,我越来越发现我不是在断点处停止执行,而是将变量值或堆栈转储转储到消息日志中。这比对变量等的实时检查允许更仔细的分析。FWIW。
如果你跳入FastMM代码,则会发生内存操作。你显示的代码没有任何内存操作,所以你的问题是不完整的。我会试着猜测你的意思。
当子例程具有编译器管理的类型(如字符串,接口或动态数组)的局部变量时,函数序言就有不平凡的工作要做。序言也是调整输入参数的引用次数的地方。调试器代表该函数的begin
行中的序言。如果当前执行点是该行,并且“进入”该行,则将转到用于管理特殊类型的RTL代码。 (我不希望FastMM也会参与其中,但也许事情已经改变了我以前的习惯。)在这种情况下做一件容易的事情就是“跳过”begin
行而不是它;使用F8。
如果你真的按F7当输入你突出显示的行,那么你做错了。这是步入begin
行,而不是行DoStuff
被调用。因此,无论您是否接受FastMM代码,都与DoStuff
的实施无关。为了调试DoStuff
的调用,当前的执行点应该已经是为的那条线路了。
如果您只想在迭代23498938上调试DoStuff
,则可以在该函数中设置条件断点。点击阴沟来制作一个正常的断点,然后右键单击它以显示其属性。在那里你可以定义一个条件,每次执行达到该点时都会被评估。只有条件为真时,调试器才会停止。按F8键“跳过”DoStuff
调用,如果条件为真,调试器将在那里停止,就像您按F7键一样。
您可以切换“使用调试DCU”选项以避免进入大多数RTL和VCL单元。我不知道FastMM是否包含在该集合中。关键区别在于您链接的DCU是否使用调试信息编译。该设置将库路径更改为包含或排除调试DCU所在的子目录。 I 认为您可以配置一组包含或排除的调试目录,以便根据“调试DCU”设置添加或删除一组自定义的目录。
回到断点。您可以通过为断点指定名称来设置断点组。您可以使用高级断点来启用或禁用指定的断点组。 (如果你愿意的话,断点组可以只有一个断点)。例如,如果你只想在你的程序中通过某个其他位置Y的位置X处断开,你可以在X处设置一个禁用的断点并在Y处有一个非断点断点。将Y处的“启用组”设置为启用组X.
您还可以利用禁用的断点而不自动启用和禁用。您的断点出现在“断点”调试器窗口中。如果您正在步进DoStuff
,并且您决定此时想要检查bla
,请转至断点窗口并在bla
处启用断点。无需导航到bla
的实现来在那里设置断点。
有关高级断点的更多信息,请参阅Using Non-Breaking Breakpoints in Delphi以及Cary Jensen几年前撰写的文章。
我可能错过了您的帖子,但使用FastMM4您可以编辑FastMM4Options.Inc包含文件并删除'。'。从以下定义:
从FastMM4Options.inc ****
{启用该选项禁止的调试信息生成的 FastMM4.pas单元。这将防止集成调试器从踏进 内存管理代码。}
{$ .DEFINE NoDebugInfo}
当重新编译(可能需要建设)调试器将(应该)不再调试FastMM代码。
在项目DPR文件,我用
uses
{$IFNDEF DEBUG} FastMM4, {$ENDIF}
... // other units
在调试模式排除FastMM4。在FastMM4中不需要更改,因此我不必记得在更改为其他版本时在FastMM中添加{$ D-}。
非常好!它的工作方式与我想要的完全一样:调试器不再进入它,同时仍然获得代码完成并能够查看和修改“禁用调试”代码(如果需要的话)。 – 2009-01-16 05:10:38
至于FastMM4:只要你没有缺省定义的{$ define RequireDebugInfoForLeakReporting},泄漏报告仍然有效。 – 2009-01-16 05:11:52
您好,先生,就我而言,今天赢得了互联网。工作很好。非常感谢。 – Alan 2010-09-06 17:13:54