DataMuseum.dk

Presents historical artifacts from the history of:

Rational R1000/400 Tapes

This is an automatic "excavation" of a thematic subset of
artifacts from Datamuseum.dk's BitArchive.

See our Wiki for more about Rational R1000/400 Tapes

Excavated with: AutoArchaeologist - Free & Open Source Software.


top - download
Index: ┃ D T

⟦4e943d4a1⟧ TextFile

    Length: 26034 (0x65b2)
    Types: TextFile
    Names: »DEB_HELP«

Derivation

└─⟦5f3412b64⟧ Bits:30000745 8mm tape, Rational 1000, ENVIRONMENT 12_6_5 TOOLS 
    └─ ⟦91c658230⟧ »DATA« 
        └─⟦f6fec0485⟧ 
            └─⟦this⟧ 

TextFile


  @node !Tools.Debug_Tools

  Package Debug_Tools provides a programmatic interface to the
  Debugger.  These subprograms can be used in a program to pass
  information back to the Debugger.  They can also be used to
  determine information about the task calling the subprograms,
  including the most recent exception raised, the current program
  counter location, the Debugger task name synonym, and so on.  The
  subprograms also provide a means for creating special display
  procedures for the Debugger to use to display the value variables
  of specific types (for example, when using the Debug.Put command),
  where users do not want the Debugger to use the structural type
  information for displaying these values.

  The preceding section describes package !Commands.Debug, which
  contains the interactive commands for Debugger operations.
  @node !Tools.Debug_Tools.Ada_Location

  function Ada_Location (Frame_Number  : Natural := 0;
                        Fully_Qualify : Boolean := True;
                        Machine_Info  : Boolean := False) return String;

  Returns a string representing the Ada name of the source location
  in the calling subprogram or a caller of the calling subprogram.

  The null string is returned if the frame specified by the Frame-
  _Number parameter does not exist.
  @node !Tools.Debug_Tools.Debug_Off

  procedure Debug_Off;

  Disables debugging in the calling task.

  This command allows a program to turn off debugging so that
  the Debugger does not interfere with program behavior.  When a
  program is being debugged, it can turn off debugging by calling the
  Debug_Off procedure; when the program desires to allow debugging
  again, it can call the Debug_On procedure.  When debugging is off,
  you are not able to control execution using the Debugger (including
  catching exceptions and so on).
  @node !Tools.Debug_Tools.Debug_On

  procedure Debug_On;

  Enables debugging for the calling task.

  Used only after the Debug_Off procedure has been called, the
  command allows a program to implement a region in which the
  Debugger will not interfere with program execution.  Such regions
  can be created by calling the Debug_Off procedure at the beginning
  of the region to tell the Debugger not to interfere until the next
  call to Debug_On, and then calling the Debug_On procedure at the
  end of the region to resume Debugger control.  During execution
  in this region, you are not able to control execution using the
  Debugger (including catching exceptions).

  Any tasks created from a region in which debugging is not enabled
  also do not have debugging enabled.  Once the Debug_On procedure
  has been called, tasks subsequently created will have debugging
  enabled.
  @node !Tools.Debug_Tools.Debugging

  function Debugging return Boolean;

  Returns true if the currently executing program is under the
  control of the Debugger; otherwise, the function returns false.
  @node !Tools.Debug_Tools.Get_Exception_Name

  function Get_Exception_Name (Fully_Qualify : Boolean := True;
                              Machine_Info  : Boolean := False)
                                                           return String;

  Returns the name of the most recently raised exception for the
  task that calls this function and, optionally, returns additional
  machine-related information about the exception.

  This function must be called directly or indirectly from an
  exception handler.  The null string is returned if no exception
  is currently active for the calling task.

  If Machine_Info is true, the address in which the exception was
  raised and the exception's machine representation are displayed.
  These numbers can be given to the Debug.Address_To_Location
  and Debug.Exception_To_Name procedures to get their source
  representations (assuming that the Ada units still exist and the
  exception was not raised or declared in a Command window).
  @node !Tools.Debug_Tools.Get_Raise_Location

  function Get_Raise_Location (Fully_Qualify : Boolean := True;
                              Machine_Info  : Boolean := False)
                                                           return String;

  Returns a representation of the location in the source from which
  the most recent exception for the task calling this function
  was raised and, optionally, returns additional machine-related
  information about the raise location.

  This function must be called directly or indirectly from an
  exception handler.  The null string is returned if no exception
  is currently active for the calling task or if problems are
  encountered getting the raise location information.

  If Machine_Info is true, the address in which the exception was
  raised and the exception's machine representation are displayed.
  These numbers can be given to the Debug.Address_To_Location
  and Debug.Exception_To_Name procedures to get their source
  representations (assuming that the Ada units still exist and the
  exception was not raised or declared in a Command window).
  @node !Tools.Debug_Tools.Get_Task_Name

  function Get_Task_Name return String;

  Returns any task name set by the Set_Task_Name procedure.

  This function allows a task to interrogate its name.  If the
  function is called by a task not in a job presently being debugged,
  the name passed to Set_Task_Name may or may not be returned.
  @node !Tools.Debug_Tools.Message

  procedure Message (Info : String);

  Causes a message to be displayed in the Debugger window.

  A call to the Message procedure from any task being debugged causes
  a message as specified by the Info parameter to be displayed in the
  Debugger window.

  If there is no Debugger for the session, the operation has no
  effect.

  This generic procedure provides facilities that enable you to
  write special display routines for the Debugger.  The Debugger
  uses the routines to display the value of variables and to perform
  other actions.  These display routines can be created for any type
  defined in the Rational Environment or in your applications.

  The display routines are created and then registered with the
  Debugger.  Once a special display is registered for a type, the
  Debugger uses it (instead of the structural type information from
  the type declaration) when the Debug.Put command is executed on
  variables of that type.  Registering a new special display for
  a type overrides any existing special displays for the type and
  the type's normal structural display.  Special displays can be
  unregistered to enable the use of a type's normal structural
  display.

  Special displays can be registered when the Debugger is started
  in the default Debugger_Initialization procedure.  If they are
  registered in this procedure, they will remain in effect until
  explicitly unregistered, until a new special display is registered
  for the type, until the user logs off from the session, or until
  the Debugger is killed.  Special displays can also be registered by
  the job being debugged.  In this case, the special display remains
  in effect during the life of the job, until the special display is
  unregistered, or until a new special display is registered for the
  type.

  Note that, by default, the Debugger has preregistered special
  displays for many of the important types defined in the

  specifications of the Rational Environment.  These displays can
  be redefined if necessary.  The types that have displays registered
  for them include:

     !Implementation.Activity_Implementation.Activity_Handle

     !Implementation.Activity_Implementation.Iterator

     !Implementation.Dependency_Data_Base.Iterator

     !Implementation.Dependency_Data_Base.Defid_Iterator

     !Implementation.Diana.Attr_List

     !Implementation.Diana.Attr_Name

     !Implementation.Diana.Comment

     !Implementation.Diana.Number_Rep

     !Implementation.Diana.Sequence

     !Implementation.Diana.Seq_Type

     !Implementation.Diana.Symbol_Rep

     !Implementation.Diana.Temp_Seq

     !Implementation.Diana.Tree

     !Implementation.Diana.Value

     !Implementation.Directory.Ada.Unit

     !Implementation.Directory.Class

     !Implementation.Directory.Naming.Iterator

     !Implementation.Directory.Object

     !Implementation.Directory.Object_Set.Iterator

     !Implementation.Directory.Object_Set.Set

     !Implementation.Directory.Traversal.Associated_Object_Iterator

     !Implementation.Directory.Traversal.Object_Iterator

     !Implementation.Directory.Traversal.Subobject_Iterator

     !Implementation.Directory.Traversal.Subunit_Iterator

     !Implementation.Directory.Traversal.Version_Iterator

     !Implementation.Directory.Version

     !Implementation.Error_Messages.Annotation

     !Implementation.Error_Messages.Errors

     !Implementation.Links_Implementation.Iterator

     !Implementation.Low_Level_Action.Id

     !Implementation.Switch_Implementation.Iterator

     !Implementation.Universal.Float

     !Implementation.Universal.Int

     !Implementation.Universal.Integer

     !Implementation.Universal.Real

     !Io.Device_Independent_Io.File_Type

     !Io.Io.File_Type

     !Io.Object_Set.Iterator

     !Io.Object_Set.Set

     !Io.Pipe.Handle

     !Io.Polymorphic_Io.File_Position

     !Io.Polymorphic_Io.Handle

     !Io.Polymorphic_Sequential_Io.File_Type

     !Io.Text_Io.File_Type

     !Io.Window_Io.File_Type

     !Lrm.Calendar.Time

     !Tools.Bounded_String.Variable_String

     !Tools.Directory_Tools.Object.Error_Code

     !Tools.Directory_Tools.Object.Handle

     !Tools.Directory_Tools.Object.Iterator

     !Tools.Directory_Tools.Object.Message_List

     !Tools.Directory_Tools.Object.Subclass

     !Tools.Link_Tools.Dependent_Iterator

     !Tools.Link_Tools.Link_Iterator

     !Tools.Profile.Response_Profile

     !Tools.Simple_Status.Condition

     !Tools.Simple_Status.Condition_Name

     !Tools.String_Table.Item

     !Tools.String_Table.Iterator

     !Tools.System_Utilities.Job_Iterator

     !Tools.System_Utilities.Session_Iterator

     !Tools.System_Utilities.Terminal_Iterator

     !Tools.Tape_Tools.Logical_Device

     !Tools.Unbounded_String.Variable_String

  Several important restrictions that apply to special displays are
  described under "Restrictions" in the reference entry for the
  Image generic formal function.

  The formal parameters to the generic are:
      generic
          type T is limited private;
          with function Image (Value           : T;
                              Level           : Natural;
                              Prefix          : String;
                              Expand_Pointers : Boolean) return String;
      procedure Register;

  These parameters define the type for which a special display is to
  be created and the function that returns the images of values of
  that type.  This function is used by the Debugger when performing
  puts on values of that type.  Instantiating the generic provides
  the registration procedure that can be called from your application
  (or by your Debugger_Initialization procedure) to register the
  special display.

  Example 1

  Even though there may be a structural display available for a type,
  a special display may be more convenient to use.  For example, data
  structures containing pointers are often difficult to visualize
  from the structural display.  The following example shows how a
  special display can be constructed for lists.  This special display
  outputs the elements in the list as a text string instead of the
  pointer chain connecting the list elements, as would typically be
  the case if a structural display were used.
      with List_Generic;
      package Integer_List is new List_Generic (Integer);
      -- Example uses list generic from !Tools.
      with Integer_List;
      package List_Display is
          -- This package implements the special display for values
          -- of type Integer_List.List.
          procedure Register;
          -- Causes the special display to be registered with the

          -- Debugger so that it will be used by the Debugger in
          -- subsequent Debug.Put commands instead of the normal
          -- structural display.
      end List_Display;
      with Debug_Tools;
      with String_Utilities;
      package body List_Display is
          function Element_Images (Value : Integer_List.List) return String is
          begin
             if Integer_List.Is_Empty (Value) then
                 return "";
             else
                 return String_Utilities.Number_To_String
                           (Integer_List.First (Value)) & " " &
                        Element_Images (Integer_List.Rest (Value));
             end if;
          end Element_Images;
          -- Recursive function that builds a string containing the
          -- the images of the items in a list ordered from left to
          -- right.
          function Image (Value : Integer_List.List;
                         Level : Natural;
                         Prefix : String;
                         Expand_Pointers : Boolean) return String is
          begin
             if Integer_List.Is_Empty (Value) then
                 return "the list is empty";
             else
                 return "( " & Element_Images (Value) & ")";
             end if;
          end Image;
          -- The Image function used in this special display displays
          -- lists with their elements ordered from left to right
          -- enclosed in parentheses.  E.g., "( 1 2 3 )".
          procedure Register_Special_Display is
             new Debug_Tools.Register (Integer_List.List, Image);
          procedure Register is
          begin
             Register_Special_Display;
          end Register;
      begin
          Register;  -- Registers the special display upon elaboration.
      end List_Display;
      with Text_Io;
      with Integer_List;
      with List_Display;
      procedure List_Test is
          -- This is a main program used to test the special display
          -- for Integer_List.List.
          L : Integer_List.List := Integer_List.Nil;
      begin
          L := Integer_List.Make (3, L);
          L := Integer_List.Make (2, L);
          L := Integer_List.Make (1, L);
          null;  -- A location on which to stop the Debugger.
      end List_Test;

  Assume that the List_Test procedure is run with the Debugger
  and stepped to the null statement.  If the Debug.Put command is
  executed at this point to display the value of L, the Debugger
  responds as follows in the Debugger window:
      Put ("%ROOT_TASK._1.L");
      {( 1 2 3 )}

  Example 2

  Sometimes it is helpful in testing an application program to be
  able to initiate the execution of subprograms as part of the
  job being debugged.  For example, when debugging an application
  using the Debugger, it might be helpful to be able to reset some
  of the state of the application, display status information, or
  dump/restore state, all by executing Debugger commands at certain
  times.  The special display facility can be used to do this.

  The strategy consists of defining types and objects of these types
  for each of the operations that you would like to trigger from
  the Debugger.  Special displays are then created and registered
  for each of these types.  These special displays can be designed
  to perform the actions desired.  Finally, to invoke the special
  display and to perform the action while debugging, simply execute
  the Debug.Put command on the object corresponding to the action you
  want to perform.  The Debugger will execute the associated special
  display routine that will perform the action.

  Here is a simple example of a package that implements such a
  strategy.  Note that the package would be withed into the library
  unit closure of the application.  In this example, the only effect
  of the operations is to write a message into a log file.  These
  actions typically would manipulate various pieces of the state of
  the application.
       package Debugger_Operations is
           -- This package implements various testing operations using
          -- the Debugger special display mechanism.  To perform the
          -- desired action, perform a Debug.Put command on the object
          -- of the appropriate type.
          type Reset_Type is new Boolean;
          type Display_Status_Type is new Boolean;
          type Dump_State_Type is new Boolean;
          type Restore_State_Type is new Boolean;
          -- Performing a Debug.Put on the following objects causes the
          -- associated action to be performed by the special display
          -- for their types.
          Reset          : Reset_Type := True;
          Display_Status : Display_Status_Type := True;
          Dump_State     : Dump_State_Type := True;
          Restore_State  : Restore_State_Type := True;
      end Debugger_Operations;
      with Text_Io;
      with Debug_Tools;
      package body Debugger_Operations is
          File : Text_Io.File_Type;
          Resetting : constant String := "... Resetting";
          Displaying_Status : constant String := "... Displaying status";
          Dumping_State : constant String := "... Dumping state";
          Restoring_State : constant String := "... Restoring state";
          function Reset_Implementation (Value : Reset_Type;
                                       Level : Natural;
                                       Prefix : String;
                                       Expand_Pointers : Boolean)
                                      return String is
          begin
             Text_Io.Put_Line (File, Resetting);
             return Resetting;
          end Reset_Implementation;
          function Display_Status_Implementation
                     (Value : Display_Status_Type;
                      Level : Natural;
                      Prefix : String;
                      Expand_Pointers : Boolean) return String is
          begin
             Text_Io.Put_Line (File, Displaying_Status);
             return Displaying_Status;

          end Display_Status_Implementation;
          function Dump_State_Implementation
                     (Value : Dump_State_Type;
                      Level : Natural;
                      Prefix : String;
                      Expand_Pointers : Boolean) return String is
          begin
             Text_Io.Put_Line (File, Dumping_State);
             Text_Io.Close (File);
             return Dumping_State;
          end Dump_State_Implementation;
          function Restore_State_Implementation
                     (Value : Restore_State_Type;
                      Level : Natural;
                      Prefix : String;
                      Expand_Pointers : Boolean) return String is
          begin
             Text_Io.Put_Line (File, Restoring_State);
             return Restoring_State;
          end Restore_State_Implementation;
          procedure Special_Display_Reset is
             new Debug_Tools.Register (Reset_Type, Reset_Implementation);
          procedure Special_Display_Display_Status is
             new Debug_Tools.Register (Display_Status_Type,
                                     Display_Status_Implementation);
          procedure Special_Display_Dump_State is
             new Debug_Tools.Register (Dump_State_Type,
                                     Dump_State_Implementation);
          procedure Special_Display_Restore_State is
             new Debug_Tools.Register (Restore_State_Type,
                                     Restore_State_Implementation);
      begin
          Special_Display_Reset;
          Special_Display_Display_Status;
          Special_Display_Dump_State;
          Special_Display_Restore_State;
          Text_Io.Create (File, Text_Io.Out_File, "$log_file");
      end Debugger_Operations;

  Example 3

  For debugging applications containing types with complex
  structures, it is often desirable to obtain different displays
  of the images of these types.  For example, you may want to obtain
  more or less detail, or you may want to look at different classes
  of information at different times during the debugging session.
  There are two approaches to using special displays to accomplish
  this.

  One approach is to use variables in the special display packages
  to indicate the level of detail or kind of information desired.
  The Image functions implementing the special display for a
  type can read these variables and, depending on their values,
  perform different actions.  The values of these variables can be
  manipulated by the Debug.Modify command or by the special displays,
  as described in Example 2 above.

  The other approach is to create multiple special displays and
  register and unregister them dynamically at various points in
  your application.  Note that this registration/unregistration can
  be accomplished explicitly in the application or by the special
  displays, as described in Example 2 above.
  @node !Tools.Debug_Tools.Image

  with function Image (Value           : T;
                      Level           : Natural;
                      Prefix          : String;
                      Expand_Pointers : Boolean) return String;

  Returns the string that is the image of the value of the Value
  parameter for the special display for T.
  @node !Tools.Debug_Tools.Register

  procedure Register;

  Registers a special display for a type with the Debugger.

  Registering a special display causes the Debugger to use your own
  display instead of the default the Debugger uses when values with
  the Debug.Put command.  Your display is the image function that is
  supplied as the value for the Image generic formal function in an
  instantiation of the Register procedure.  This function is used by
  the Debugger to compute the images of values of the type provided
  as the T generic formal type in the instantiation of the Register
  procedure.  See the introduction to the Register generic procedure
  for more information on special displays.

  If another special display is currently registered for the type, it
  is unregistered and the new function is substituted.

  Note that, by default, the Debugger has preregistered special
  displays for many of the important types defined in the
  specifications of the Rational Environment.  These displays can
  be redefined if necessary.  For a list of these types, see the
  introduction to the reference entry for the Register generic
  procedure.

  The Debugger command Debug.Show (Debug.Special_Types) can be used
  to get a list of the special displays that have been registered by
  the user for the job currently being debugged.  Note that this list
  will not include the Environment types automatically registered
  by the Debugger.  See the introduction to the Register generic
  procedure for a list of the preregistered Environment types.
  @node !Tools.Debug_Tools.T

  type T is limited private;

  Specifies the type for which the special display is being defined.
  @node !Tools.Debug_Tools.Set_Task_Name

  procedure Set_Task_Name (Name : String);

  Assigns a string nickname for the named task.

  The name can be used by the user in various Debugger commands as a
  synonym for the task.  If the command is called by a task in a job
  not presently being debugged, the call has no effect.  The nickname
  can also be set by the Debug.Set_Task_Name procedure.

  To use such a nickname in a command, the name must be preceded by a
  percent symbol (%).  The string passed to this procedure, however,
  should not have a leading percent symbol.

  It is good practice to call the Set_Task_Name procedure in
  important (if not all) tasks to identify them easily during
  debugging.  The call is especially important when multiple
  instances of the same task are created.  It is some extra work
  to give each a unique name, but the effort often greatly simplifies
  the task of understanding what is going on during debugging.

  If the name passed to the Set_Task_Name procedure has already been
  used by a different task, the name is removed from that old task
  and assigned to the present caller to the Set_Task_Name procedure.
  Thus, only one task has a given name at a given time.

  The name Root_Task is automatically assigned to the root task (the
  command task) in a job.  To avoid confusion, it is best not to
  reassign this name.

  This generic procedure causes a special display registered for a
  type to no longer be used by the Debugger for displaying objects
  of the type.  When a special display is unregistered, the Debugger
  will use the structural information in the type declaration to
  display objects of these types.  For more information on special
  displays, see the Register generic procedure.

  The formal parameters to the generic are:
      generic
          type T is limited private;
      procedure Un_Register;

  The parameter defines the type for which a special display is no
  longer to be used.
  @node !Tools.Debug_Tools.T

  type T is limited private;

  Specifies the type for which the special display is to be removed.
  @node !Tools.Debug_Tools.Un_Register

  procedure Un_Register;

  Causes the Debugger to stop using the Image procedure last
  registered for computing the images of values of the T generic
  formal type in calls to the Debug.Put command for values of T type.

  After the call to Un_Register, the default display will be based on
  the structural information defining T.

  If no special displays are registered for the type, this procedure
  has no effect.
  @node !Tools.Debug_Tools.User_Break

  procedure User_Break (Info : String);

  Causes the calling task to stop as though a breakpoint were
  reached.

  The string specified by the Info parameter is displayed in the
  Debugger window along with a message that the task has stopped for
  a user break.