2017-11-06 5 views
0

Wenn eine Behauptung fehlschlägt, ich folgende Ausgabe:Bestimmung, warum eine Ada Assertionsfehler

angehoben SYSTEM.ASSERTIONS.ASSERT_FAILURE: Dynamic_Predicate bei file.adb fehlgeschlagen: 36

Kann ich noch mehr Details? Zum Beispiel, was die Eingabe war, oder vielleicht eine Stack-Trace oder irgendetwas anderes, das mir bei der Bestimmung helfen könnte, warum die Assertion fehlgeschlagen ist?

+1

ich versuchen würde, Debugger in einem solchen Fall zu verwenden. –

+0

Siehe [dieses Juwel] (https://www.adacore.com/gems/gem-142-exceptions) – flyx

Antwort

4

Sie können System.Assertions.Assert_Failure abfangen, Stack-Trace mit GNAT.Traceback (wenn Sie GNAT verwenden) Paket oder Druckwerte zu drucken.

So etwas wie hier

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; 

Oder Sie können Ihr Programm debuggen, wie ich in Kommentar erwähnt enter image description here