我可以在不丢失执行上下文的情况下中断断言吗?

时间:2017-10-12 10:51:31

标签: delphi debugging assertion

采取以下片段:

case x of
  1: begin
    Assert(ChildCount = 2);
    ChildNode[0].ToString(Builder);
    Builder.Append(F);
    ChildNode[1].ToString(Builder);
  end; {1:}

如果断言触发我丢失了所有上下文,local variables检查员将在任何地方显示inaccessible value

enter image description here

我可以通过添加额外的if-then并手动放置断点来解决这个问题:

case x of
  1: begin
    if not(ChildCount = 2) then
      Assert(ChildCount = 2);   <-- add breakpoint here.
    ChildNode[0].ToString(Builder);
    Builder.Append(F);
    ChildNode[1].ToString(Builder);
  end; {1:}

然而,这会增加我的代码,我需要手动插入断点。

有没有办法打破断言,这样我就不会丢失执行上下文,而且我仍然可以检查变量?

2 个答案:

答案 0 :(得分:3)

你可以在调试器中添加像使用子句一样的东西到句子中停止(比如你在每个断言时都设置了断点)但是之后继续执行。然后,您可以检查导致断言的所有条件。

unit HookAssert;

interface

{$If Defined(DEBUG) }
uses
  Winapi.Windows;

procedure Assert(Condition: Boolean; const Message: String = '');
{$EndIf}

implementation

{$If Defined(DEBUG) }
procedure Assert(Condition: Boolean; const Message: String = '');
begin
  if not Condition then
    DebugBreak;
end;
{$EndIf}

end.

答案 1 :(得分:0)

在Delphi 10 Seattle下,我无法重现您的问题(无论如何都没有基本用例)。我可以:

  • 调用堆栈面板:双击对应的行 断言被提出的例程
  • 本地变量面板:选择 从下拉列表中提出断言的例程 小组的顶部。

然后我可以检查我的例行程序的变量。