【问题标题】:Determining why an Ada assertion failed确定 Ada 断言失败的原因
【发布时间】:2017-11-06 05:54:37
【问题描述】:

如果断言失败,我会得到以下输出:

引发 SYSTEM.ASSERTIONS.ASSERT_FAILURE:Dynamic_Predicate 在 file.adb:36 失败

我可以得到更多细节吗?例如输入是什么,或者可能是堆栈跟踪,或者其他任何可以帮助我确定断言失败的原因?

【问题讨论】:

  • 在这种情况下我会尝试使用调试器。

标签: ada assertions ada2012


【解决方案1】:

您可以捕获 System.Assertions.Assert_Failure 以使用 GNAT.Traceback(如果您使用 GNAT)包或打印值来打印堆栈跟踪。

这里有点像

pragma Assertion_Policy(CHECK);

with Ada.Text_IO; use Ada.Text_IO;
with GNAT.Traceback;
with System.Assertions;
with GNAT.Traceback.Symbolic;
procedure Main is
   procedure Call_Stack is
      Trace  : GNAT.Traceback.Tracebacks_Array (1..1_000);
      Length : Natural;
   begin
      GNAT.Traceback.Call_Chain (Trace, Length);
      Put_Line (GNAT.Traceback.Symbolic.Symbolic_Traceback (Trace (1..Length)));
   end Call_Stack; 
   type Day is new String (1 .. 10);
   type Message is record
      Sent     : Day;
      Received : Day;
   end record with
     Dynamic_Predicate => Message.Sent <= Message.Received;
   M : Message;
begin
   M  := (Received => "1776-07-04", Sent => "1783-09-03");
exception
   when System.Assertions.Assert_Failure =>
      Call_Stack;
      Put_Line(String(M.Sent));
      Put_Line(String(M.Received));
end Main;

或者你可以调试你的程序,正如我在评论中提到的那样

【讨论】:

  • 不错!我想知道我是否能捕捉到这种异常——只有我这样做:
猜你喜欢
  • 2016-04-26
  • 2018-06-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-08-11
  • 2016-05-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多