Previous: Tracebacks From Exception Occurrences (non-symbolic), Up: Non-Symbolic Traceback


30.14.1.3 Tracebacks From Anywhere in a Program

It is also possible to retrieve a stack traceback from anywhere in a program. For this you need to use the GNAT.Traceback API. This package includes a procedure called Call_Chain that computes a complete stack traceback, as well as useful display procedures described below. It is not necessary to use the -E gnatbind option in this case, because the stack traceback mechanism is invoked explicitly.

In the following example we compute a traceback at a specific location in the program, and we display it using GNAT.Debug_Utilities.Image to convert addresses to strings:

     with Ada.Text_IO;
     with GNAT.Traceback;
     with GNAT.Debug_Utilities;
     
     procedure STB is
     
        use Ada;
        use GNAT;
        use GNAT.Traceback;
     
        procedure P1 is
           TB  : Tracebacks_Array (1 .. 10);
           --  We are asking for a maximum of 10 stack frames.
           Len : Natural;
           --  Len will receive the actual number of stack frames returned.
        begin
           Call_Chain (TB, Len);
     
           Text_IO.Put ("In STB.P1 : ");
     
           for K in 1 .. Len loop
              Text_IO.Put (Debug_Utilities.Image (TB (K)));
              Text_IO.Put (' ');
           end loop;
     
           Text_IO.New_Line;
        end P1;
     
        procedure P2 is
        begin
           P1;
        end P2;
     
     begin
        P2;
     end STB;
     $ gnatmake -g stb
     $ stb
     
     In STB.P1 : 16#0040_F1E4# 16#0040_14F2# 16#0040_170B# 16#0040_171C#
     16#0040_1461# 16#0040_11C4# 16#0040_11F1# 16#77E8_92A4#

You can then get further information by invoking the addr2line tool as described earlier (note that the hexadecimal addresses need to be specified in C format, with a leading “0x”).