------------------------------------------------------------------------------ -- -- -- GNAT RUNTIME COMPONENTS -- -- -- -- G N A T . M E M O R Y _ D U M P -- -- -- -- B o d y -- -- -- -- Copyright (C) 2003 Ada Core Technologies, Inc. -- -- -- -- GNAT is free software; you can redistribute it and/or modify it under -- -- terms of the GNU General Public License as published by the Free Soft- -- -- ware Foundation; either version 2, or (at your option) any later ver- -- -- sion. GNAT is distributed in the hope that it will be useful, but WITH- -- -- OUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -- -- or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -- -- for more details. You should have received a copy of the GNU General -- -- Public License distributed with GNAT; see file COPYING. If not, write -- -- to the Free Software Foundation, 59 Temple Place - Suite 330, Boston, -- -- MA 02111-1307, USA. -- -- -- -- As a special exception, if other files instantiate generics from this -- -- unit, or you link this unit with other files to produce an executable, -- -- this unit does not by itself cause the resulting executable to be -- -- covered by the GNU General Public License. This exception does not -- -- however invalidate any other reasons why the executable file might be -- -- covered by the GNU Public License. -- -- -- -- GNAT was originally developed by the GNAT team at New York University. -- -- Extensive contributions were provided by Ada Core Technologies Inc. -- -- -- ------------------------------------------------------------------------------ with System; use System; with System.Storage_Elements; use System.Storage_Elements; with GNAT.IO; use GNAT.IO; with GNAT.Debug_Utilities; use GNAT.Debug_Utilities; with Unchecked_Conversion; package body GNAT.Memory_Dump is ---------- -- Dump -- ---------- procedure Dump (Addr : System.Address; Count : Natural) is Ctr : Natural := Count; -- Count of bytes left to output Adr : Address := Addr; -- Current address N : Natural := 0; -- Number of bytes output on current line C : Character; -- Character at current storage address AIL : constant := Address_Image_Length - 4 + 2; -- Number of chars in initial address + colon + space Line_Len : constant Natural := AIL + 3 * 16 + 2 + 16; -- Line length for entire line Line_Buf : String (1 .. Line_Len); Hex : array (0 .. 15) of Character := "0123456789ABCDEF"; type Char_Ptr is access all Character; function To_Char_Ptr is new Unchecked_Conversion (Address, Char_Ptr); begin while Ctr /= 0 loop -- Start of line processing if N = 0 then declare S : constant String := Image (Adr); begin Line_Buf (1 .. AIL) := S (4 .. S'Length - 1) & ": "; Line_Buf (AIL + 1 .. Line_Buf'Last) := (others => ' '); Line_Buf (AIL + 3 * 16 + 1) := '"'; end; end if; -- Add one character to current line C := To_Char_Ptr (Adr).all; Adr := Adr + 1; Ctr := Ctr - 1; Line_Buf (AIL + 3 * N + 1) := Hex (Character'Pos (C) / 16); Line_Buf (AIL + 3 * N + 2) := Hex (Character'Pos (C) mod 16); if C < ' ' or else C = Character'Val (16#7F#) then C := '?'; end if; Line_Buf (AIL + 3 * 16 + 2 + N) := C; N := N + 1; -- End of line processing if N = 16 then Line_Buf (Line_Buf'Last) := '"'; GNAT.IO.Put_Line (Line_Buf); N := 0; end if; end loop; -- Deal with possible last partial line if N /= 0 then Line_Buf (AIL + 3 * 16 + 2 + N) := '"'; GNAT.IO.Put_Line (Line_Buf (1 .. AIL + 3 * 16 + 2 + N)); end if; return; end Dump; end GNAT.Memory_Dump;