无法在Delphi中的Exit语句处设置断点?

无法在Delphi中的Exit语句处设置断点?,delphi,debugging,breakpoints,Delphi,Debugging,Breakpoints,我尝试在Exit语句处设置断点,如下所示: procedure TForm1.Button1Click(Sender: TObject); var I: Integer; begin I := 5; if I = 5 then Exit; end; procedure TForm1.Button1Click(Sender: TObject); var I: Integer; begin I := 5; if I = 5 then begin asm

我尝试在Exit语句处设置断点,如下所示:

procedure TForm1.Button1Click(Sender: TObject);
var
  I: Integer;
begin
  I := 5;

  if I = 5 then
    Exit;

end;
procedure TForm1.Button1Click(Sender: TObject);
var
  I: Integer;
begin
  I := 5;
  if I = 5 then begin
    asm nop end; // <== put breakpoint here
    Exit;
  end;
end;
但是,当程序启动时,断点将变成一个红十字,表示它不可用。为什么?我正在使用项目的“调试”版本,并使用“运行”按钮调试项目

您不能(可靠地)在退出(或继续或中断)时设置断点,因为这些不是正常意义上的语句

但是,您可以在IF行上设置一个断点,然后右键单击该断点的红点,选择断点属性并在条件字段中输入与IF语句相同的条件:

这将稍微降低执行速度(如果该条件断点位于循环中,则速度会更慢),但仅当满足条件时才会激活断点(断点实际上在每次命中时都会停止程序,但如果设置了条件,调试器将计算该表达式并继续执行,而不通知您,除非满足条件)


当然,这是一个简化的示例,但在这些情况下,您通常可以使用条件断点来克服无法在确切的EXIT语句上设置断点的限制。

或者使用HeartWare建议的条件断点(这对性能的影响可能很大,具体取决于代码的执行频率)您可以这样更改代码:

procedure TForm1.Button1Click(Sender: TObject);
var
  I: Integer;
begin
  I := 5;

  if I = 5 then
    Exit;

end;
procedure TForm1.Button1Click(Sender: TObject);
var
  I: Integer;
begin
  I := 5;
  if I = 5 then begin
    asm nop end; // <== put breakpoint here
    Exit;
  end;
end;
procedure TForm1.按钮1点击(发送方:TObject);
变量
I:整数;
开始
I:=5;
如果I=5,则开始

asm nop end;//我认为您不能在流控制“过程”上设置断点,例如
退出
中断
、和
继续
。它们不是真正的过程,更像是编译器专门处理的关键字。但是,您可以在此类“过程”上方的下一行适当位置设置断点。[我怀疑Embarcadero可以选择实现这一功能,但这可能并不完全是直截了当的,而且需求可能没有那么严重。]在本例中,您可以将断点放在
end;
line@KeithMiller:确实如此,但是--当然--您不知道自己是如何做到这一点的。由于if子句之后没有代码,代码优化器可能会在编译之前删除exit语句,因为它在该特定代码中没有任何用途。请尝试添加一些代码在退出时,我很确定您在退出时的断点应该可以工作。@SilverWarior“在退出调用的周围加上begin..end应该允许。”-不会的。只添加一些无用的额外代码,例如额外的if,会导致生成一些指令,您可以在这些指令上放置断点。我也使用这个命令:-)我的是“sleep(0)”;)我一直使用Inc(NoOpCount),NoOpCount是一个全局变量。我认为编译器不会优化对全局变量的更改……这样的nop语句会导致额外的性能损失,包括速度和文件大小吗?是的。计算机每次迭代将花费0.01µs的时间(时间估计可能是错误的),但只有在满足条件的情况下:-)。严肃地说:不-没有任何可测量的方式。。。