确定 Ada 断言失败的原因
Determining why an Ada assertion failed
如果断言失败,我会得到以下输出:
raised SYSTEM.ASSERTIONS.ASSERT_FAILURE : Dynamic_Predicate failed at file.adb:36
我可以了解更多详情吗?例如输入是什么,或者可能是堆栈跟踪,或者任何其他可以帮助我确定断言失败原因的东西?
您可以捕获 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;
或者你可以像我在评论中提到的那样调试你的程序
如果断言失败,我会得到以下输出:
raised SYSTEM.ASSERTIONS.ASSERT_FAILURE : Dynamic_Predicate failed at file.adb:36
我可以了解更多详情吗?例如输入是什么,或者可能是堆栈跟踪,或者任何其他可以帮助我确定断言失败原因的东西?
您可以捕获 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;
或者你可以像我在评论中提到的那样调试你的程序