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”).