|
|
DataMuseum.dkPresents historical artifacts from the history of: Rational R1000/400 Tapes |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about Rational R1000/400 Tapes Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - downloadIndex: D T
Length: 271366 (0x42406)
Types: TextFile
Names: »DEB_HELP«
└─⟦d10a02448⟧ Bits:30000409 8mm tape, Rational 1000, ENVIRONMENT, D_12_7_3
└─⟦fc9b38f02⟧ »DATA«
└─⟦f95d63c89⟧
└─⟦this⟧
@node !Commands.Debug
Package !Commands.Debug contains the specific types, subtypes, and
procedures provided by the Rational Environment debugger for interactive
use.
To use the facilities of the debugger from a program, see package
!Tools.Debug_Tools.
Note: These reference entries define the functionality of the package Debug
commands for the R1000 native debugger. However, this documentation can
also be used for reference with debuggers included in Rational's
cross-development facilities. Examples used in these reference entries
apply to the R1000 debugger, but they can also be used with CDF debuggers
in most cases.
RESOURCES IN PACKAGE DEBUG
The commands in package Debug fall into several functional groups. This
list includes all procedures in package Debug as well as selected types
and subtypes.
Selecting and terminating a debugger: Current_Debugger, Debug_Off, Kill
Displaying Ada program units: Display, Source
Displaying program state: Information, Information_Type, Stack
Displaying debugger state: Show
Handling variables: Modify, Put
Setting and removing breakpoints: Activate, Break, Remove
Handling exceptions: Catch, Exception_Name, Forget,
Propagate
Controlling tasks: Clear_Stepping, Execute, Hold, Kill,
Release, Run, Stop, Stop_Event
Naming tasks: Set_Task_Name, Task_Name
Displaying task status: Information, Information_Type,
Task_Category, Task_Display
Monitoring jobs: History_Display, Take_History,
Trace,
Trace_Event, Trace_To_File
Setting and resetting flags: Disable, Enable, Flag, Numeric,
Option,
Reset_Defaults, Set_Value
Setting contexts: Context, Context_Type
Displaying and translating machine values:
Address_To_Location, Convert,
Exception_To_Name,
Location_To_Address, Memory_Display
Displaying comments: Comment
COMMANDS FROM PACKAGE COMMON FOR THE DEBUGGER
Many commands from package !Commands.Common are supported for the debug-
ger. These commands are summarized in Table 9-1. Commands from package
Common typically are used through the key combinations to which they are
bound. For further information about these commands, see the Editing
Specific Types (EST) book, package Common.
Table 9-1 Commands from Package Common for the Debugger
---------------------------------------------------------------
| | |
|Key Bound To ... |Accomplishes ... |
---------------------------------------------------------------
| | |
|Common.Abandon |Deletes the debugger window if the debugger |
| |has been killed; otherwise, the command has |
| |no effect. This command has the same effect |
| |as the Release procedure. |
---------------------------------------------------------------
| | |
|Common.Create_ |Creates a command window below the current |
|Command |library window if one does not exist; |
| |otherwise, the procedure puts the cursor in |
| |the existing command window below the current|
| |library window. This command window initially|
| |has a use clause: |
| | |
| | use Editor, Common, Debug; |
| | |
| | |
| |This use clause provides direct visibility to|
| |the declarations in packages Editor, Common, |
| |and Debug without requiring qualification for|
| |names resolved in the command. |
---------------------------------------------------------------
| | |
|Common.Definition|Finds the Ada source of the designated |
| |element and brings up its image in a window |
| |on the screen, typically with the |
| |corresponding Ada source selected. |
---------------------------------------------------------------
| | |
|Common.Enclosing |Displays the library containing the command |
| |window from which the job being debugged was |
| |started. |
---------------------------------------------------------------
| | |
|Common.Object. |Selects a child element of the currently |
|Child |selected element. A child element is one of |
| |the elements at the next lower level, in a |
| |syntactic sense, from the currently selected |
| |element. If an object at that level has not |
| |been selected before, the smallest element |
| |enclosing the cursor is chosen. If an element|
| |at that level has been selected before, it is|
| |selected again. |
---------------------------------------------------------------
| | |
|Common.Object. |Selects the first child of the currently |
|First_Child |selected element. The first child is the firs|
| |one of the set of elements at the next lower |
| |level, in a syntactic sense, from the cur- |
| |rently selected element. |
---------------------------------------------------------------
| | |
|Common.Object. |Selects the last child of the currently |
|Last_Child |selected element. The last child is the last |
| |one of the set of elements at the next lower |
| |level, in a syntactic sense, from the cur- |
| |rently selected element. |
---------------------------------------------------------------
| | |
|Common.Object. |Selects the Repeat next element past the |
|Next |currently selected element. A next element is|
| |the element at the same level, in a syntactic|
| |sense, as the current element that appears |
| |immediately after the current element. If no |
| |such selection can be made, the next element |
| |at the enclosing level is selected. |
---------------------------------------------------------------
| | |
|Common.Object. |Selects the parent element of the currently |
|Parent |selected element. The parent element is the |
| |element that contains the current element at |
| |the next higher level, in a syntactic sense, |
| |from the current element. |
---------------------------------------------------------------
| | |
|Common.Object. |Selects the Repeat previous element before |
|Previous |the currently selected element. A previous |
| |element is the element at the same level, in |
| |a syntactic sense, as the current element |
| |that appears immediately before the current |
| |element. If no such selection can be made, |
| |the previous element at the enclosing level |
| |is selected. |
---------------------------------------------------------------
| | |
|Common.Release |Deletes the debugger window if the debugger |
| |has been killed; otherwise, the command has |
| |no effect. This command has the same effect |
| |as the Abandon procedure. |
---------------------------------------------------------------
| | |
|Common.Write_File|Writes the current contents of the debugger |
| |window into the named file. |
---------------------------------------------------------------
@node !Commands.Debug.Activate
procedure Activate (Breakpoint : Natural);
DESCRIPTION
Activates a previously deactivated breakpoint.
Breakpoints reactivated with this command interrupt task execution at the
points at which they were initially set.
Note: When a job is being debugged, the breakpoints set in it are bound to
the Ada source of that job and persist in an inactive state beyond that
job unless they are removed. In subsequent jobs, previously defined
breakpoints can be activated.
PARAMETERS
Breakpoint : Natural;
Specifies which breakpoint to activate. A parameter value of 0 activates
all inactive breakpoints.
ERRORS
A breakpoint cannot be activated if the context in which it was created is
modified. For example, if the task to which the breakpoint applies does
not exist or the Ada unit with which it is associated has been modified
since debugging of the job began, the breakpoint is no longer valid. The
debugger displays both successful and failed breakpoint activations.
REFERENCES
procedure Break
procedure Remove
@node !Commands.Debug.Address_To_Location
procedure Address_To_Location (Address : String := "");
DESCRIPTION
Displays the source location corresponding to the address of the specified
machine instruction.
This command is the functional inverse of the Location_To_Address command.
PARAMETERS
Address : String := "";
Specifies the address of a machine instruction.
For the R1000 target, the address format is "#segment,#offset". The
segment value specifies the segment number in hexadecimal notation. The
offset specifies the location of the instruction in the segment. The pound
sign (#) is optional.
EXAMPLES
The following command:
Address_To_Location ("19901, 10")
displays:
Name: .PRODUCER_CONSUMER.QUEUE.1d
PC = #19901, #10
REFERENCES
procedure Location_To_Address
@node !Commands.Debug.Break
procedure Break (Location : Path_Name := "<SELECTION>";
Stack_Frame : Integer := 0;
Count : Positive := 1;
In_Task : Task_Name := "";
Default_Lifetime : Boolean := True);
DESCRIPTION
Creates a breakpoint at a specific location in the specified task.
A breakpoint interrupts execution of a task at a specified location (for
example, a statement or declaration) in the program source. The task stops
before the execution of the specified statement or declaration and the
debugger displays the breakpoint number and location. The task does not
resume execution until directed; the Run and Execute commands resume
execution of stopped tasks.
A breakpoint must be active to interrupt execution. Breakpoints are active
when created; they can be deactivated and reactivated at any time.
Breakpoints remain until they are deleted.
The Show (Breakpoints) command displays all breakpoints and their status.
Key Combinations
In the standard Environment keymap, the Break command with default values
is bound to a key combination. This binding provides several alternatives
for entering the command and specifying the location at which the
breakpoint is set:
* If the desired location appears on the screen, you can select the
location and press the key combination bound to the command. The
Location parameter resolves to the selected location.
* If the desired location is the first location in a specific stack frame,
you can press the numeric argument key corresponding to that frame and
then press the key combination bound to the command. The numeric
argument key specifies a value for the Stack_Frame parameter.
* If you want to specify the location explicitly, you enter the command
through a command window, filling in the Location parameter with either
an absolute or a relative pathname. You do not need to fill in the
Stack_Frame parameter; however, if you do, it will supplement a
relative pathname with the specified stack-frame number. (See the
Location parameter, below.)
See Chapter 2, "Referencing Objects in the Debugger," and the Path_Name
subtype for more information on designating locations.
Temporary and Permanent Breakpoints
Breakpoints can be either temporary or permanent. A temporary breakpoint
is deactivated after it interrupts the task. If the
Delete_Temporary_Breaks option flag is enabled, a temporary breakpoint is
deleted after it halts execution. The Permanent_Breakpoints option flag
determines the default type of breakpoints when they are created, and by
default it is enabled. However, whether or not Break applies the
Permanent_Breakpoints option flag depends on the value of the
Default_Lifetime parameter. If the Default_Lifetime parameter is set
to True (that is, it is enabled), the breakpoint is created with the
type of the Permanent_Breakpoints option flag. If the Default_Lifetime
parameter is set to False (that is, it is disabled), the breakpoint is
created with the opposite type of the Permanent_Breakpoints option
flag. The following table shows the possible combinations of this
option flag and parameter:
Breakpoint Type Interaction
---------------------------------
| | | |
| |Value of | |
|Permanent- |Default- |Break-|
|_Breakpoints |_Lifetime |point |
|Option Flag |Parameter |Type |
---------------------------------
| | | |
|True |True |Perman|
| | |ent |
---------------------------------
| | | |
|True |False |Tempor|
| | |ary |
---------------------------------
| | | |
|False |True |Tempor|
| | |ary |
---------------------------------
| | | |
|False |False |Perman|
| | |ent |
---------------------------------
If the Freeze_Tasks option flag is enabled when a breakpoint interrupts a
task, the debugger attempts to stop all tasks. The other tasks may not
actually stop because their current execution state may not allow it (for
example, they may be in rendezvous with the stopped task or waiting for
an entry call).
PARAMETERS
Location : Path_Name := "<SELECTION>";
Specifies the location at which the breakpoint is set. The location may be
an Ada program unit (a package, task, or subprogram), a frame reference, a
statement, or a declaration. By default, the value of Location is the
selected statement or declaration, but selections apply only if the
value of the Stack_Frame parameter is 0.
The value of Location can be an absolute pathname, a relative pathname, or
a special name that resolves to a designated location. The values of the
Location parameter and the Stack_Frame parameter together designate the
actual location at which the Break procedure creates a breakpoint.
These values define which parameter has precedence in determining the
breakpoint location, as shown in the following table:
Interaction of Location and Stack_Frame Parameters
------------------------------------
| | | |
| |Parameter |Parameter |
|If Location |Used |Used |
|Is: |If |If |
| |Stack_Frame|Stack_Frame|
| |= 0: |/= 0: |
------------------------------------
| | | |
|An absolute |Location |Location |
|pathname | | |
------------------------------------
| | | 1 |
|A relative |Location |Both |
|pathname | | |
------------------------------------
| | | |
|A special |Location |Stack2 |
|name | |Frame |
------------------------------------
1 If Location is a relative pathname and Stack_Frame is nonzero, Break
uses both parameters to designate a breakpoint location. The pathname
is prepended with _n., where n is the value of Stack_Frame. For example,
if the value of Stack_Frame is 3 and the value of Location is
"Commands.Filch", the pathname used is "_3.Commands.Filch".
2 If Location is a special name and Stack_Frame is nonzero, Stack_Frame
overrides Location and Break creates a breakpoint at the first location
in the frame specified by Stack_Frame.
If the Location parameter is null or an invalid selection reference, the
breakpoint is set in the first location in the current frame. If value of
Location cannot otherwise be resolved to a valid location, the debugger
reports an error.
The location cannot be a delay or terminate statement in a select
alternative or an entry declaration. If the location is a specific
instance of a generic, the break occurs only in that instance. If the
location specifies a generic definition, the break occurs in any
instance of the generic.
Stack_Frame : Integer := 0;
Specifies the stack frame in which to set a breakpoint. By default, this
parameter is ignored. Thus, this parameter is used only if it is nonzero
and if the value of the Location parameter is a relative pathname or a
special name. See the Location parameter for details.
Count : Positive := 1;
Specifies the number of times the statement in which the breakpoint is set
must be encountered in the execution of the program before the debugger
interrupts execution of the task. If Count = n, execution will be halted
just before the nth time the statement is executed. The default specifies
that the breakpoint interrupts execution the first time the statement is
encountered.
In_Task : Task_Name := "";
Specifies the task in which the breakpoint is set. The reserved name "all"
designates all tasks. The default value is the null string ("").
Breakpoints apply only to a specific task or to all tasks. If the value is
nonnull, In_Task designates the specified task. If null, In_Task designates
no specific task and the Break procedure chooses a default task based on
the control context:
* If the control context is set, the breakpoint is set for the task in
the control context.
* If the control context is not set, the breakpoint applies to all tasks,
including new tasks initiated after the breakpoint is set.
A breakpoint does not affect other tasks executing in the same location.
Default_Lifetime : Boolean := True;
Specifies whether the breakpoint is permanent or temporary. By default, the
breakpoint is permanent.
RESTRICTIONS
For the R1000 target, a maximum of 30 breakpoints can be set for specific
tasks. A maximum of 20 breakpoints can be set for all tasks. The two sets
are independent of each other. However, 16 active breakpoints of either
kind are accelerated; more than 16 active breakpoints slows execution.
EXAMPLES
When a breakpoint is triggered by a task, the debugger interrupts
execution and displays a status message. For example:
Break 2: .RECURSIVE_CALLS.3s [Task : ROOT_TASK, #674D8].
Breakpoint 2 deactivated.
The message specifies the breakpoint number, the location in which the task
stopped, and the task name. It also indicates that breakpoint 2 was
temporary and has been deactivated.
REFERENCES
procedure Activate
procedure Execute
type Option
subtype Path_Name
procedure Remove
procedure Show
subtype Task_Name
@node !Commands.Debug.Catch
procedure Catch (Name : Exception_Name := "<SELECTION>";
In_Task : Task_Name := "";
At_Location : Path_Name := "");
DESCRIPTION
Requests that the debugger halt task execution when a particular exception
is raised.
Propagate requests and catch requests combine to determine the action that
the debugger takes when an exception is raised. The debugger maintains a
list of catch and propagate requests entered by calls to the Catch and
Propagate procedures. When an exception in the user program is raised,
the debugger looks at this list to determine whether to stop the
program and inform the user. If the most specific request is a catch
request, the debugger halts execution; otherwise, it does not.
Specificity of Requests
More than one catch or propagate request can be in force simultaneously,
and when an exception is raised the debugger applies the most specific
request that includes the raised exception. The number and specificity of
parameter values determines the specificity of a catch request. More
precise parameter values supersede less precise values. The list below
defines the specificity order for each parameter:
* At_Location: A value that specifies a statement within a subprogram is
more specific than one that specifies only a subprogram. A value that
specifies a subprogram is more specific than one that specifies all
locations.
* In_Task: A value that specifies a task is more specific than one that
specifies all tasks.
* Name: A value that names an exception is more specific than one that
specifies implicit or all exceptions. A request that specifies implicit
exceptions is more specific than one that specifies all exceptions.
Note: The At_Location parameter supersedes the In_Task parameter, which
supersedes the Name parameter. For example, the debugger considers Catch
("All", "", "!TEST.DECONSTRUCT_NABOKOV") more specific than Catch ("All",
"34005", "").
By default, the debugger catches all exceptions (that is, the debugger
issues the equivalent of a Catch ("All","","") when started). Catching all
exceptions can be overridden with a propagate request that specifies either
individual or all exceptions. See the Propagate procedure for more details.
Matching Requests
If the parameters of a propagate request exactly match those of a catch
request, the debugger removes the catch request and applies the propagate
request. Otherwise, the Propagate command does not remove catch
requests. To remove a propagate or catch request, use the Forget command.
The Show (Exceptions) command displays all active catch and propagate
requests, ordered by specificity. The debugger lists the exception name,
location, and task restrictions for each request.
Interaction with Flags
If the Freeze_Tasks option flag is enabled when an exception is caught,
the debugger attempts to stop all tasks. The other tasks may not
actually stop because they may be in rendezvous with the stopped task or
waiting for an entry call.
If the Save_Exceptions option flag is enabled, the debugger retains catch
and propagate requests when the user begins debugging a new job. By
default, this option flag is disabled. See the Option type for more
details regarding option flags.
Unnamed Exceptions
Note: In some cases, the debugger cannot identify an exception. Exceptions
raised in Environment code, in code dissociated from its source (that is,
code from a code view or loaded main program), or in a unit modified since
debugger initiation may not be named. These exceptions are identified with
a hexadecimal number. They may also be identified with strings of the form
"<Unit=1234, Ord=2>" or "<Space=3, Index=234987>". The Information
(Exceptions) command displays details regarding all exceptions raised in
the debugger, including unnamed exceptions.
PARAMETERS
Name : Exception_Name := "<SELECTION>";
Specifies the exception to be caught by the request. The default value is
the name of the selected exception.
If the value of Name is the null string ("") or the reserved name "All",
the parameter identifies all exceptions. Also, if the value is a special
name (for example, "<SELECTION>") that cannot be resolved, the parameter
identifies all exceptions.
The reserved name "Implicit" identifies all exceptions raised implicitly
(that is, raised by a language construct other than a raise statement).
Implicit exceptions include only predefined exceptions such as
Constraint_Error and Tasking_Error.
If the exception name is not fully qualified, it is interpreted relative to
the current evaluation context.
Note: The debugger may use hexadecimal numbers to identify exceptions that
do not have names. This parameter accepts hexadecimal designations of
unnamed exceptions.
In_Task : Task_Name := "";
Specifies the task in which the exception will be caught. The reserved name
"All" designates all tasks. The default value is the null string ("").
Catch requests apply only to a specific task or to all tasks. If the value
is nonnull, In_Task designates the specified task. If the value is null,
In_Task designates no specific task and the Catch procedure chooses a
default task based on the control context:
* If the control context is set, the request applies to the task in the
control context.
* If the control context is not set, the request applies to all tasks,
including new tasks initiated after the request was issued.
Values for the In_Task parameter may be task synonyms created by
Debug.Set_Task_Name or Debug_Tools.Set_Task_Name. Task synonyms must be
prefixed with a percent symbol (%). Tasks may also be identified with task
numbers. If the task name is not fully qualified, the name is interpreted
relative to the current evaluation context.
At_Location : Path_Name := "";
Specifies the location in which the exception will be caught. This
parameter restricts the request to exceptions raised within the specified
location. If the pathname is not fully qualified, it is interpreted
relative to the current evaluation context. The default value is null,
which identifies all locations.
If the At_Location parameter specifies an Ada unit, the request applies
only to exceptions raised inside that unit. The request does not apply to
Ada units nested inside the selected unit (for example, procedures nested
within a package body, nested blocks, and accept statements).
See Chapter 2, "Referencing Objects in the Debugger," and the Path_Name
subtype for more information on designating locations.
RESTRICTIONS
The debugger allows a maximum of 40 catch and propagate requests.
EXAMPLES
Example 1
When the debugger catches an exception, it displays a status message:
Exception Constraint_Error caught at
.TEST_CASE.4s [Task : #1349704].
This includes the exception name, the exception location, and the name of
the task in which it was raised.
Example 2
A more specific request always supersedes a less specific one. A request
designating a single task, exception, or location takes precedence over
one designating all tasks, all exceptions, or all locations, respectively.
This applies to the interaction of catch and propagate requests:
Propagate (Name => "Constraint_Error",
In_Task => "All",
At_Location => "");
Propagate (Name => "All",
In_Task => "All",
At_Location => "!USERS.PHIL.TEST");
Catch (Name => "All",
In_Task => "1349704",
At_Location => "");
Any exceptions raised in !USERS.PHIL.TEST (the most specific request) do
not halt execution. The third request is more specific than the first, so
the Constraint_Error exception halts execution only if it is raised in
task 1349704; any other exception raised in task 1349704 also halts
execution.
Example 3
The name of an individual exception is considered more specific than the
reserved name "Implicit". The requests:
Catch (Name => "Implicit",
In_Task => "",
At_Location => "");
Propagate (Name => "Numeric_Error",
In_Task => "",
At_Location => "");
catch all implicitly raised exceptions other than Numeric_Error
exceptions.
Example 4
A request specifying a statement or declaration within an Ada unit is more
specific than a location specifying the entire Ada unit. The requests:
Catch (Name => "Status_Error",
In_Task => "",
At_Location => "Sandy.1");
Propagate (Name => "Status_Error",
In_Task => "",
At_Location => "Sandy");
catch Status_Error exceptions raised in the first statement of subprogram
Sandy, but they ignore Status_Error exceptions raised in the remainder of
the subprogram.
REFERENCES
subtype Exception_Name
procedure Forget
type Option
subtype Path_Name
procedure Propagate
procedure Show (Exceptions)
subtype Task_Name
@node !Commands.Debug.Clear_Stepping
procedure Clear_Stepping (For_Task : Task_Name := "");
DESCRIPTION
Removes all stepping conditions for the specified task.
Removing stepping conditions increases the speed of debugger execution.
PARAMETERS
For_Task : Task_Name := "";
Specifies the task for which stepping is canceled. The default value is the
null string (""), which resolves to the task specified by the current
control context. If the control context is not set to a specific task, the
parameter designates all tasks. The string "All" also represents all
tasks.
EXAMPLES
The command:
Clear_Stepping ("620E");
cancels all stepping conditions pending for task 620E.
REFERENCES
procedure Run
@node !Commands.Debug.Comment
procedure Comment (Information : String := "");
DESCRIPTION
Displays the value of the Information parameter in the debugger window.
The command can be used to place comments in the debugger window for anno-
tation of a debugging session.
PARAMETERS
Information : String := "";
Specifies the string displayed in the debugger window.
@node !Commands.Debug.Context
procedure Context (Set : Context_Type := Debug.Control;
To_Be : Path_Name := "<SELECTION>";
Stack_Frame : Integer := 0);
DESCRIPTION
Sets the specified context to the specified pathname.
By default, this command sets the control context to the selected item.
The debugger maintains two contexts: the control context and the
evaluation context. The debugger evaluates unqualified pathnames, task
names, and exception names in one of the two contexts. Context evaluation
does not apply to fully qualified pathnames, task names, or exception
names.
The following command displays the current control and evaluation
contexts:
Show (Contexts)
If the To_Be parameter specifies a selection, the command searches the
selection for a context in the stack for that selection. The Stack_Frame
parameter identifies the number of the frame that is the first search frame,
from which the command begins to search for a context. If Stack_Frame is
zero, the command substitutes the value of the Stack_Start flag. The
default value of Stack_Start is the first frame in the stack.
From the first search frame, the command searches a specific number of
frames, specified with the Stack_Count flag. The default number of search
frames is 10.
Control-Context Usage
The following table lists the manner in which various commands use the
control context:
Control-Context Usage
-----------------------------------------------
| | |
|Command |Control Context Used As: |
-----------------------------------------------
| | |
|Break |Default task to which the break is |
| |restricted. The control context also |
| |specifies which task's stack is used |
| |if the pathname in the command refers |
| |to a stack. |
-----------------------------------------------
| | |
|Catch |Task for which exception controls are |
| |set. |
-----------------------------------------------
| | |
|Clear_ |Default task for which stepping |
|Stepping|operations are canceled. |
-----------------------------------------------
| | |
|Display |Task whose stack is used if the |
| |pathname in the Display command refers|
| |to a stack. |
-----------------------------------------------
| | |
|Execute |Default task that is started. |
-----------------------------------------------
| | |
|Forget |Exception and task for which exception|
| |operations are cleared. |
-----------------------------------------------
| | |
|History_|Default task for which history |
|Display |information is displayed. |
-----------------------------------------------
| | |
|Hold |Default task that is held. |
-----------------------------------------------
| | |
|Propa- |Task for which exception controls are |
|gate |set. |
-----------------------------------------------
| | |
|Put |Task whose stack is used if the |
| |pathname in the Put command refers to |
| |a stack. |
-----------------------------------------------
| | |
|Release |Default task that is released. |
-----------------------------------------------
| | |
|Run |Default task for stepping. |
-----------------------------------------------
| | |
|Stack |Default task whose stack is displayed.|
-----------------------------------------------
| | |
|Stop |Default task that is stopped. |
-----------------------------------------------
| | |
|Take_ |Default task for which history |
|History |information is gathered. |
-----------------------------------------------
| | |
|Trace |Default task for which a tracing |
| |operation is enabled or disabled. |
-----------------------------------------------
The value of the control context can be the null string (""):
* For commands requiring a task designation, a null value defaults to all
tasks.
* For commands requiring a stack designation, a null value defaults to
the stack of the last task stopped by the debugger. Specifically, the
name of the last stopped task is used for interpreting pathnames in any
command.
* For certain commands (for example, Run and Stack), it is also the
default value for parameters designating tasks.
Evaluation-Context Usage
The following table lists the manner in which various commands use the
evaluation context:
Evaluation-Context Usage
----------------------------------------------
| | |
|Command|Evaluation Context Used As: |
----------------------------------------------
| | |
|Break |A context in which to interpret |
| |unqualified object names. |
----------------------------------------------
| | |
|Catch |A context for unqualified location and|
| |exception names. |
----------------------------------------------
| | |
|Context|A context for unqualified names for |
| |the control or evaluation context. |
----------------------------------------------
| | |
|Display|A context in which to interpret |
| |unqualified object names. |
----------------------------------------------
| | |
|Forget |A context for unqualified location and|
| |exception names. |
----------------------------------------------
| | |
|Modify |A context in which to interpret |
| |unqualified object names. |
----------------------------------------------
| | |
|Propa- |A context for unqualified location and|
|gate |exception names. |
----------------------------------------------
| | |
|Put |A context in which to interpret |
| |unqualified object names. |
----------------------------------------------
| | |
|Take_ |A context for unqualified location |
|History|names. |
----------------------------------------------
| | |
|Trace |A context for unqualified location |
| |names. |
----------------------------------------------
If a pathname is not qualified--that is, if it does not begin with a period
(.), underscore ( _ ), exclamation mark (!), dollar sign ($), double
dollar sign ($$), caret (^), or percent symbol (%)--the debugger prefixes
it with the evaluation context, using appropriate connecting punctuation.
PARAMETERS
Set : Context_Type := Debug.Control;
Specifies which context is set. The value can be either Control or
Evaluation.
To_Be : Path_Name := "<SELECTION>";
Specifies the value for the context. The default value is the context in
the selected item. By default, the value of To_Be is the selected item,
but selections apply only if the value of the Stack_Frame parameter is 0.
The null string ("") and the reserved name "All" are legal values for
To_Be, both of which identify all tasks.
The control context must be an Ada pathname to a task, a task number, or a
task synonym. The Debug.Set_Task_Name and Debug_Tools.Set_Task_Name com-
mands create task synonyms.
If the value of To_Be is not a task number, task synonym, or fully
qualified pathname, the Context procedure interprets it in the current
control or evaluation contexts as any other pathname. Context interprets
the pathname before defining the new value for the context; it uses the
current context to determine the new context.
The context must be valid both at the time it is specified and at the time
it is used. For example, an evaluation context of _4.X must be valid when
specified (frame 4 must exist and have an object X in it) and when it is
used (the Put ("Y") command is valid only when _4.X.Y exists).
The value of To_Be can be an absolute pathname, a relative pathname, or a
special name that resolves to an appropriate item. The values of the
To_Be parameter and the Stack_Frame parameter together designate the new
context. These values define which parameter has precedence in determining
the pathname, as shown in the following table:
Interaction of To_Be and Stack_Frame Parameters
------------------------------------
| | | |
| |Parameter |Parameter |
|If To_Be Is:|Used |Used |
| |If |If |
| |Stack_Frame|Stack_Frame|
| |= 0: |/= 0: |
------------------------------------
| | | |
|An absolute |To_Be |To_Be |
|pathname | | |
------------------------------------
| | | 1 |
|A relative |To_Be |Both |
|pathname | | |
------------------------------------
| | 2 | 3 |
|A special |To_Be |Both |
|name | | |
------------------------------------
1 If To_Be is a relative pathname and Stack_Frame is nonzero, the Context
procedure uses both parameters to designate the new context. The
pathname is prepended with _n., where n is the value of Stack_Frame. For
example, if the value of Stack_Frame is 3 and the value of To_Be is
"Commands.Filch", the pathname used is "_3.Commands.Filch".
2 If To_Be is a special name and Stack_Frame has the default value of
zero, Context searches the stack from the frame specified by the value of
the Stack_Start flag, the default value of which is also zero. Unless
either Stack_Frame or Stack_Start is set to a nonzero value, Context
searches from the first frame in the stack.
3 If To_Be is a special name and Stack_Frame designates a specific frame
(that is, it is nonzero), Context searches for the first occurrence of
the specified location in that frame and subsequent frames. Context
searches the number of frames specified by the Stack_Count numeric flag,
the default value of which is 10.
See Chapter 2, "Referencing Objects in the Debugger," and the Path_Name
subtype for more information on designating locations.
Stack_Frame : Integer := 0;
Specifies the stack frame that contains the context or that is the context.
By default, this parameter is ignored. Thus, this parameter is used only
if it is nonzero and if the value of To_Be is a relative pathname or a
special name. See the To_Be parameter for details.
RESTRICTIONS
The context pathname must be legal both when defined and when used by an-
other command.
EXAMPLES
The following sequence of commands shows the interaction of the control
and evaluation contexts as they are set with the Context command:
Context (Control, "%Session_Manager");
Stop;
Context (Evaluation, "_3.Session_Map");
The first command sets the control context to the specified task, evaluating
"%Session_Manager" as a task synonym. The Stop command stops the task
specified by the control context given in the first command. The next step
is to set an evaluation context based on the previously defined control
context. Since the control context is dynamic (that is, it may be assigned
to a different task at any time), the task assigned to the control context
must be stopped in order to interpret a pathname containing a stack
reference, such as _3.Session_Map, as the evaluation context. The third
command sets the evaluation context to the package Session_Map declared in
the subprogram running in stack frame 3 of the control-context task,
Session_Manager.
@node !Commands.Debug.Context_Type
type Context_Type is (Control, Evaluation);
DESCRIPTION
Defines the context types used by various debugger commands (specifically
the Context command).
ENUMERATIONS
Control
Specifies a task for use as the default task in commands that specify a
task.
Evaluation
Specifies a path prefix for unqualified pathnames in commands that require a
pathname.
REFERENCES
procedure Context
@node !Commands.Debug.Convert
procedure Convert (Number : String := "";
To_Base : Natural := 0);
DESCRIPTION
Converts the numeric string specified in the Number parameter to the base
defined by the To_Base parameter.
If To_Base is not specified, the command converts decimal numeric strings
to hexadecimal and other numeric strings to decimal.
This command uses 64-bit arithmetic.
PARAMETERS
Number : String := "";
Specifies the string representation of the number to be converted. Unless a
base is specified, the number is treated as a decimal representation. A
leading number symbol (#) indicates a hexadecimal number. The number and
base can also be specified in Ada style (for example, 8#177400#). Legal
bases are 2 through 16.
To_Base : Natural := 0;
Specifies the base to which the number is converted. Legal values are 2
through 16. The default value of To_Base depends on the value of the
Number parameter. If Number is decimal, To_Base is hexadecimal; otherwise,
To_Base is decimal.
@node !Commands.Debug.Current_Debugger
procedure Current_Debugger (Target : String := "");
DESCRIPTION
Designates the current debugger.
If there is more than one active debugger, this command designates which
one is the current debugger. All debugging commands are directed to the
current debugger.
This command applies to various targets with active debuggers in the
current session along with the R1000 native debugger. For more
information regarding each debugger, see the "Cross-Debugging" chapter of
the Cross-Development Facility User's Manual for the specific target.
PARAMETERS
Target : String := "";
Specifies the name of the debugger designated as current. The default value
is null.
If the value is the null string ("") and the cursor is in a debugger
window, the Current_Debugger procedure designates it as the current
debugger. If this command is invoked with a null value for Target and
the cursor is not in a specific debugger window, this command displays the
debugger window of the current debugger and moves the cursor into it.
@node !Commands.Debug.Debug_Off
procedure Debug_Off (Kill_Jobs : Boolean := False);
DESCRIPTION
Terminates debugging of the current job.
The job being debugged either continues normal execution or aborts, based
on the value of the Kill_Job parameter.
This Debug_Off command differs from the Debug_Tools.Debug_Off command,
which terminates debugging only if the task calling Debug_Tools.Debug_Off
is part of the job being debugged, and then it disables debugging only for
that task.
PARAMETERS
Kill_Job : Boolean := False;
Specifies, when True, that the job being debugged is aborted. If False, the
default value, the job continues normal execution.
REFERENCES
procedure Debug_Tools.Debug_Off
@node !Commands.Debug.Disable
procedure Disable (Variable : Option;
On : Boolean := False) renames Enable;
DESCRIPTION
Disables the option flag specified with the Variable parameter.
By default, this command disables the specified option flag. Disabling an
option flag sets it to False.
See the Option type for more information on the option flags.
PARAMETERS
Variable : Option;
Specifies the option flag that is to be enabled or disabled.
On : Boolean := False;
Specifies whether to enable or disable the option flag. If unspecified, the
option flag is disabled.
REFERENCES
procedure Enable
type Option
@node !Commands.Debug.Display
procedure Display (Location : Path_Name := "<SELECTION>";
Stack_Frame : Integer := 0;
Count : Natural := 0);
DESCRIPTION
Displays the specified source code with statement numbers in the debugger
window.
The length of the display is determined by the Count parameter.
The Location parameter references some location in the program or data.
The form and content of the display depends on the type of object
referenced by Location. See the description of the Location parameter,
below, for more details.
If the Location parameter refers to currently executing code, the asterisk
(*) or the pound sign (#) may appear next to statements and declarations
in the display:
* The asterisk identifies the statement now executing, or about to
execute, in the current task.
* The pound sign identifies statements or declarations executing in
subprogram frames other than the topmost frame.
Displays of source code include declaration and statement numbers used by
other commands (for example, Break and Task).
Displays of types include all characteristics of the type, even if the
type is private. Only private types declared in Environment code cannot be
displayed.
Note: For this command, the current task is the task specified by the
control context or the last task to stop if the control context is not
set.
The Declaration_Display option flag controls whether declarations are
shown as part of the display. By default, it is enabled, forcing
declaration displays. See the Option type for more details.
PARAMETERS
Location : Path_Name := "<SELECTION>";
Specifies a location in the source to display. The value of Location can be
the name of an Ada program unit (package, task, or subprogram), frame
reference, or a specific statement or declaration. All displays begin with
an initial statement or declaration and continue for the number of
statements, declarations, or combinations thereof specified by the Count
parameter.
If the value of the Location parameter is:
* An Ada program unit or frame reference, the initial statement or
declaration displayed is the first one in the program unit or frame,
respectively. Displays include both statements and declarations unless
the Declaration_Display option flag is disabled.
* A specific statement, that statement is the initial statement displayed
by the command and the display contains only statements.
* A specific declaration, that declaration is the initial declaration
displayed by the command and the display contains only declarations.
The value of Location can be an absolute pathname, a relative pathname, or
a special name that resolves to a designated location. The values of the
Location parameter and the Stack_Frame parameter together designate the
actual location displayed. These values define which parameter has
precedence in determining location, as shown in the following table:
Interaction of Location and Stack_Frame Parameters
------------------------------------
| | | |
| |Parameter |Parameter |
|If Location |Used |Used |
|Is: |If |If |
| |Stack_Frame|Stack_Frame|
| |= 0: |/= 0: |
------------------------------------
| | | |
|An absolute |Location |Location |
|pathname | | |
------------------------------------
| | | 1 |
|A relative |Location |Both |
|pathname | | |
------------------------------------
| | | |
|A special |Location |Stack2 |
|name | |Frame |
------------------------------------
1 If Location is a relative pathname and Stack_Frame is nonzero, the
Display procedure uses both parameters to designate a location. The
pathname is prepended with _n., where n is the value of Stack_Frame. For
example, if the value of Stack_Frame is 3, and the value of Location is
"Commands.Filch", the pathname that is used is "_3.Commands.Filch".
2 If Location is a special name and Stack_Frame is nonzero, then
Stack_Frame overrides Location and Display shows the source surrounding
the current statement or declaration in the frame specified by
Stack_Frame.
See Chapter 2, "Referencing Objects in the Debugger," and the Path_Name
subtype for more information on designating locations.
Stack_Frame : Integer := 0;
Specifies the stack frame displayed by this command. By default, this
parameter is ignored. Thus, this parameter is used only if it is nonzero
and if the value of the Location parameter is a relative pathname or a
special name. See the Location parameter for details.
Count : Natural := 0;
Specifies the number of statements, declarations, or combinations thereof
displayed. If Count is greater than the remaining length of the display
object, the display includes only the remainder of the object.
If the value of Count is 0 (the default), the command substitutes the
value of the Display_Count numeric flag. The default value of
Display_Count is 10. See the Numeric type for more details regarding
Display_Count.
RESTRICTIONS
This command cannot display code compiled without debug tables. The
Environment creates debug tables by default.
This command cannot display Environment code.
REFERENCES
procedure Context
type Numeric, enumeration Display_Count
type Option, enumeration Declaration_Display
procedure Source
procedure Debug_Tools.Register
@node !Commands.Debug.Enable
procedure Enable (Variable : Option;
On : Boolean := True);
DESCRIPTION
Enables the option flag specified by the Variable parameter.
By default, this command enables the specified option flag. Enabling an
option flag sets it to True.
See the Option type for more information on the option flags.
PARAMETERS
Variable : Option;
Specifies the option flag that is to be enabled or disabled.
On : Boolean := True;
Specifies whether to enable or disable the option flag. If unspecified, the
option flag is enabled.
REFERENCES
procedure Disable
type Option
@node !Commands.Debug.Exception_Name
subtype Exception_Name is String;
DESCRIPTION
Defines a string name for exceptions.
Several commands require specific names for exceptions. This subtype defines
the format of strings that denote a specific exception. There are three
legal forms for exception names, all of which are objects predefined by the
debugger:
* An Ada identifier evaluated in the current control or evaluation context
* A pathname
* A special name
The debugger also defines two inclusive values for this subtype:
* The null string ("") denotes all exceptions.
* The string "Implicit" denotes all exceptions raised implicitly.
Implicitly raised exceptions occur while executing a statement or
elaborating a declaration, not as the result of a raise statement.
Exception names that are special names resolve to contextual reference
designations (selection, image, cursor, and so on) defined by the
Environment. These special names have the form "<NAME>". If a special name
does not resolve to an exception (for example, if the special name is
"<SELECTION>" and the cursor is not in the selection), the value of the
exception name becomes the null string (""). That is, it designates all
exceptions. Special names are described in more detail in Parameter-Value
Conventions in the Reference Summary (RS) book.
The debugger resolves all predefined exception names as absolute values;
they are used with no qualification.
The following exception names are predefined in package Lrm.Standard:
Constraint_Error
Numeric_Error
Program_Error
Storage_Error
Tasking_Error
The debugger may display predefined exception names with an exception state
appended in parentheses. This state is a more exclusive index for an
exception, indicating its exact nature. The exception state, if one is
provided, is not part of the actual exception name; do not include it when
identifying an exception.
The following table includes the predefined exception names, states, and
operations that raise the exceptions:
Exception Descriptions
------------------------------------------------
| | |
|Exception Name |Description |
|(State) | |
------------------------------------------------
| | |
|Constraint_Error |Accessing an array element |
|(Array Index) |using a subscript that is |
| |out of the range of the |
| |array index type. |
------------------------------------------------
| | |
|Constraint_Error |Defining a case expression |
|(Case Range) |out of the bounds of the |
| |case statement. |
------------------------------------------------
| | |
|Constraint_Error |Accessing a field of variant|
|(Discriminant) |record that is not present |
| |in the specific record being|
| |accessed. |
------------------------------------------------
| | |
|Constraint_Error |Using an out-of-range |
|(Entry Family) |entry-family index. |
------------------------------------------------
| | |
|Constraint_Error |Raising an integer to a |
|(Exponent) |negative exponent. |
------------------------------------------------
| | |
|Constraint_Error |Concatenating beyond the |
|(Length Error) |upper bound of the index |
| |subtype. Refer to the |
| |Reference Manual for the Ada|
| |Programming Language, |
| |Section 4.5.3. |
------------------------------------------------
| | |
|Constraint_Error |Dereferencing a null |
|(Null Access) |pointer. |
------------------------------------------------
| | |
|Constraint_Error |Converting a value to a type|
|(Type Range) |that does not include the |
| |value in its range. |
------------------------------------------------
| | |
|Numeric_Error |Evaluating an expression |
|(Overflow) |that cannot be represented |
| |(for example, an |
| |uninitialized out |
| |parameter). |
------------------------------------------------
| | |
|Numeric_Error (Zero|Attempting to divide by |
|Divide) |zero. |
------------------------------------------------
| | |
|Program_Error |Accessing a program unit not|
|(Elaboration Order)|yet elaborated. |
------------------------------------------------
| | |
|Program_Error |Exiting a function by |
|(Function Exit) |executing past the last |
| |statement in the function. |
| |The last statement executed |
| |in a function must be a |
| |return statement. |
------------------------------------------------
| | |
|Program_Error |Executing an editor prompt |
|(Prompt Executed) |(for example, a [statement] |
| |prompt). |
------------------------------------------------
| | |
|Program_Error |Executing a select statement|
|(Select) |with no open alternatives. |
------------------------------------------------
| | |
|Storage_Error |(Reserved for future use.) |
|(Allocation) | |
------------------------------------------------
| | |
|Storage_Error |Nesting subprogram calls too|
|(Control) |deeply in a task. |
------------------------------------------------
| | |
|Storage_Error |Allocating too many objects.|
|(Data) |The Environment allocates |
| |a maximum amount of space |
| |for all objects designated |
| |by each access type; |
| |allocations beyond the |
| |maximum raise this |
| |exception. |
------------------------------------------------
| | |
|Storage_Error |Referencing too many objects|
|(Import) |from a package, task, or |
| |subprogram subunit. |
------------------------------------------------
| | |
|Storage_Error |Declaring too many tasks or |
|(Name) |packages. |
------------------------------------------------
| | |
|Storage_Error |Declaring an object greater |
|(Oversize Object) |than the maximum size |
| |allowed. |
------------------------------------------------
| | |
|Storage_Error |Executing an oversize job. |
|(Program) | |
------------------------------------------------
| | |
|Storage_Error |Queuing too many outstanding|
|(Queue) |entry calls for a task. |
------------------------------------------------
| | |
|Storage_Error |(Reserved for future use.) |
|(Resource) | |
------------------------------------------------
| | |
|Storage_Error |Defining too many types. |
|(Type) | |
------------------------------------------------
| | |
|Tasking_Error |Rendezvousing with an |
|(Abnormal Task) |aborted task. |
------------------------------------------------
| | |
|Tasking_Error |Propagating an exception out|
|(Activation) |of a child task during its |
| |activation. |
------------------------------------------------
| | |
|Tasking_Error |Accessing a terminated task.|
|(Completed Task) | |
------------------------------------------------
REFERENCES
procedure Catch
procedure Forget
subtype Path_Name
procedure Propagate
@node !Commands.Debug.Exception_To_Name
procedure Exception_To_Name (Implementation_Image : String := "");
DESCRIPTION
Displays the source name of the exception that corresponds to the specified
target-dependent representation.
The debugger may not know the name of an exception when it is raised. This
command attempts to determine a name for the exception identified by the
Implementation_Image parameter.
PARAMETERS
Implementation_Image : String := "";
Specifies a target-dependent representation of an exception.
For the R1000 target, the representation format is "#segment,#offset". The
segment value specifies the segment name of the memory space containing the
exception, in hexadecimal notation. The offset specifies the location of
the exception in the segment. The offset can be either decimal or
hexadecimal, with values preceded by the character # or containing the
letters a-f interpreted as hexadecimal.
A predefined exception can be specified by its exception number, either by
itself or with an address of 0 (that is, "0, exception number").
The representation can be in the form in which any exception is displayed
in the Environment.
Note: The debugger may use hexadecimal numbers to identify exceptions that
do not have names. This parameter accepts hexadecimal designations of
unnamed exceptions.
EXAMPLES
Entering this command with parameter values that specify a predefined
exception:
Exception_To_Name ("0,78");
produces the following display:
Exception_To_Name ("0,78");
Name: Predefined exception STORAGE_ERROR
REFERENCES
procedure Catch
@node !Commands.Debug.Execute
procedure Execute (Name : Task_Name := "");
DESCRIPTION
Initiates execution of the named task.
This command initiates execution from the current location in the named
task. The current location is the last statement executed in the named
task, usually the point at which execution is halted because:
* A breakpoint is encountered
* A Stop command is executed
* A Hold command is executed
* An exception is caught by the debugger
* The termination condition of a Run command is encountered
If the named task is already executing, the command has no effect.
Tasks subject to hold conditions must be started individually by name, or
the hold condition must be released with the Release command. Issuing an
Execute command for all tasks (Execute ("All")) releases only tasks not
specifically held by the debugger.
If the Freeze_Tasks option flag is enabled and all tasks are stopped
implicitly as a result of an individual task being stopped, the Execute
command resumes execution of these implicitly stopped tasks.
PARAMETERS
Name : Task_Name := "";
Specifies the task to be executed. The default value is the task specified
by the current control context. If the control context is not explicitly
set, execution resumes for all tasks not specifically held by the
debugger.
The reserved word "All" specifies all tasks not held by the debugger.
See the Hold command for more information on the held state.
ERRORS
The debugger displays No tasks are stopped when no tasks are currently
stopped in the debugger or when the stopped tasks are subject to hold
conditions.
REFERENCES
procedure Break
procedure Hold
procedure Release
procedure Stop
@node !Commands.Debug.Flag
procedure Flag (Variable : String := "";
To_Value : String := "TRUE");
DESCRIPTION
Sets the value of debugger flags.
Flags in the debugger control certain functions and provide special
facilities. The Variable parameter specifies the name of the flag and the
To_Value parameter specifies its value. The debugger ignores case when
evaluating flag names.
Legal flag names for this command include string names for the enumeration
values defined by the Option and Numeric types, as well as the following
predefined string flags (some of these flags are intended for internal use
only and are not supported by Rational):
Predefined String Flags
--------------------------------------------------------------
| | | | |
|Flag Names |Description |Default |Status |
| | |Value | |
--------------------------------------------------------------
| | | | |
|Cache_Stack_ |Maintains a cache of current |True |Unsuppo|
|Frames |stack information for the | |rted |
| |current task. Disabling this | | |
| |flag impairs some debugger | | |
| |operations. | | |
--------------------------------------------------------------
| | | | |
|Flag_Errors |Includes the string *** in |False |Support|
| |error messages. | |ed |
--------------------------------------------------------------
| | | | |
|Hex_Values |Forces hexadecimal output from |False |Support|
| |the Put command for certain | |ed |
| |values. | | |
--------------------------------------------------------------
| | | | |
|Interpret_ |Forces the Memory_Display |False |Unsuppo|
|Import_Words |command to interpret words in | |rted |
| |the import space. | | |
--------------------------------------------------------------
| | | | |
|Interpreter_ |Displays the contents of the |False |Unsuppo|
|Dump |interpreter stack after each | |rted |
| |instruction executed by the | | |
| |interpreter. | | |
--------------------------------------------------------------
| | | | |
|Interpreter_ |Prints information about |False |Unsuppo|
|Trace |execution of interpreted code | |rted |
| |used to do object displays. | | |
--------------------------------------------------------------
| | | | |
|No_Pointers |Prevents display of actual |False |Support|
| |pointer values. The value ppppp| |ed |
| |displays for all pointers. | | |
--------------------------------------------------------------
| | | | |
|No_Task_ |Prevents display of actual task|False |Support|
|Numbers |numbers. The value xxxxx | |ed |
| |displays for all tasks. | | |
--------------------------------------------------------------
PARAMETERS
Variable : String := "";
Specifies the name of the flag to be set.
To_Value : String := "TRUE";
Specifies the value to which the flag is set. The default value is True.
ERRORS
The debugger does not check for errors in flag names or values. Illegal
values can cause unexpected behavior in operations that depend on flag
values.
REFERENCES
type Numeric
type Option
@node !Commands.Debug.Forget
procedure Forget (Name : Exception_Name := "<SELECTION>";
In_Task : Task_Name := "";
At_Location : Path_Name := "");
DESCRIPTION
Removes catch and propagate requests.
By default, this command removes catch and propagate requests for the
selected exception in all tasks and locations.
A Forget command removes catch and propagate requests matching the
parameter values of the command. The debugger does not apply Forget
commands in order of specificity as it does catch and propagate requests.
Exceptions must be explicitly named for this command. An undefined value
for the Name parameter (for example, the null string) results in an error
instead of designating all exceptions (the standard functionality in the
debugger).
Note: A Forget command that applies to all exceptions in all tasks and
locations does not clear every catch and propagate request active in the
job currently being debugged. Either a Catch ("All") or a Propagate
("All") command is always active in the debugger and cannot be removed
with the Forget command.
PARAMETERS
Name : Exception_Name := "<SELECTION>";
Specifies the exception for which catch and propagate requests are removed.
The reserved name "All" selects all types of exceptions.
Note: The null string ("") is not a valid value for Exception_Name.
The reserved name "Implicit" identifies all exceptions raised implicitly
(that is, raised by a language construct other than a raise statement).
Implicit exceptions include only predefined exceptions such as
Constraint_Error and Tasking_Error.
Note: The debugger may use hexadecimal numbers to identify exceptions that
do not have names. This parameter accepts hexadecimal designations of
unnamed exceptions.
In_Task : Task_Name := "";
Specifies the task to which the request is limited. The reserved name "All"
selects all tasks. The default value is null.
Forget requests apply only to a specific task or to all tasks. If the value
is nonnull, In_Task designates the specified task. If the value is null,
In_Task designates no specific task and the Forget procedure chooses a
default task based on the control context:
* If the control context is set, the request applies to the task in the
control context.
* If the control context is not set, the request applies to all tasks.
Values for the In_Task parameter can be task synonyms created by
Debug.Set_Task_Name or Debug_Tools.Set_Task_Name. Task synonyms must be
prefixed with a percent symbol (%). Tasks can also be identified with task
numbers. If the task name is not fully qualified, the name is interpreted
relative to the current evaluation context.
At_Location : Path_Name := "";
Specifies the location to which the request is limited. This parameter
restricts the command to exceptions raised within the specified location.
If the pathname is not fully qualified, it is interpreted relative to the
current evaluation context. The default value is null, which identifies
all locations.
If the At_Location parameter specifies an Ada unit, the command applies
only to exceptions raised inside that unit. The command does not apply to
Ada units nested inside the selected unit (for example, procedures nested
within a package body, nested blocks, and accept statements).
See Chapter 2, "Referencing Objects in the Debugger," and the Path_Name
subtype for more information on designating locations.
REFERENCES
procedure Catch
procedure Propagate
procedure Show (Exceptions)
@node !Commands.Debug.Hex_Number
subtype Hex_Number is String;
DESCRIPTION
Limits a string representation to numeric values in base 16.
Note: All values of this subtype are interpreted as hexadecimal numbers;
values of this type need not be prefixed with "16#".
@node !Commands.Debug.History_Display
procedure History_Display (Start : Integer := 0;
Count : Integer := 0;
For_Task : Task_Name := "");
DESCRIPTION
Displays history entries for the specified task.
The debugger keeps an execution history for tasks when history logging is
enabled with the Take_History command. This history includes entries
regarding statements, calls, rendezvous, and exceptions. The
History_Display procedure selects sets of entries associated with a
specific task. By default, the command displays the ten most recent entries
for the specified task.
Unlike traces, history entries are saved in a circular buffer. That is,
the most recent events selected by the Take_History command are recorded
by the debugger in a buffer. When the buffer becomes full, the oldest
events are overwritten by new events. History_Display identifies entries in
this buffer relative to the most recent entry (see the Start parameter,
below).
PARAMETERS
Start : Integer := 0;
Specifies the starting entry (that is, the first entry displayed) for the
history display. For the default value of 0, this parameter substitutes
the value of the History_Start numeric flag, the default value of which is
10.
A positive value specifies the first event to be displayed, numbered
starting from the most recent entry. A negative value specifies the first
entry to be displayed, numbered starting from the oldest entry. If Start=
-20, the first entry displayed is the twentieth oldest event recorded in
the buffer.
Count : Integer := 0;
Specifies the number of entries displayed. For the default value of 0, this
parameter substitutes the value of the History_Count numeric flag, the
default value of which is 10.
The sign of the Count parameter determines which entries and in what order
they are displayed:
* If the value of Count is positive, History_Display displays the entries
succeeding the starting entry. The entries are displayed in order from
the oldest to the newest entry.
* If the value of Count is negative, History_Display displays the entries
preceding the starting entry. The entries are displayed in order from
the newest to the oldest entry.
The number of entries displayed, however, is always the absolute value of
the Count parameter (that is, History_Display disregards the sign of the
value in determining the length of the display). That is, if Start = 20
and Count = -10, the twentieth through twenty-ninth events are displayed
in order from newest to oldest.
For_Task : Task_Name := "";
Specifies the task for which this command displays history entries. If the
value is null, this parameter defaults to the task specified by the control
context. If the control context does not identify a specific task, the
command applies to all tasks.
EXAMPLES
The following is an example of a history display:
History of statements executed by all tasks : (oldest .. newest)
Timestamp Depth Location and Task
34656136386 2 .BUFFER.LENGTH.1d [QUEUE, #2F0D4]
+ 284 1 .PRODUCER_CONSUMER.CONSUMER.5s [CONSUMER, #2F8D4]
+ 522 2 .BUFFER.LENGTH.2d [QUEUE, #2F0D4]
+ 1136 2 ....1s
+ 1435 2 ....2s
+ 1705 1 .PRODUCER_CONSUMER.QUEUE.7s
+ 1992 1 ....8s
34657416781 1 .PRODUCER_CONSUMER.PRODUCER.3s [PRODUCER, #2F4D4]
34657816737 1 .PRODUCER_CONSUMER.CONSUMER.3S [CONSUMER, #2F8D4]
34658504120 1 .PRODUCER_CONSUMER.QUEUE.9s [QUEUE, #2F0D4]
* The first line describes the selection and order of history entries. In
this case, the statements from all tasks are displayed, from the oldest
entry to the newest entry. The second line lists the column headings.
* The first column is a measure of time in units of 3.2 microseconds.
* The second column is the stack depth of the task associated with that
entry.
* The third column is the name of that task.
* The last column specifies the statement or declaration that the named
task is executing.
Succeeding lines are individual history entries. The display truncates
succeeding statement and declaration names if they are identical. Elipses
(....) indicate name truncations.
Note: The debugger requires 280-300 time units (896-960 microseconds) to
record each entry in the history.
The previous display includes entries for multiple tasks. Limiting the
search to entries for task QUEUE, the command displays:
History of statements executed by QUEUE, #2F0D4 : (oldest .. newest)
Timestamp Depth Location
34656135064 2 .PRODUCER_CONSUMER.QUEUE.(accept GET).2s
+ 274 1 .PRODUCER_CONSUMER.QUEUE.4s
+ 714 1 ....7s
+ 1322 2 .BUFFER.LENGTH.1d
+ 1844 2 ....2d
+ 2458 2 ....1s
+ 2757 2 ....2s
+ 3027 1 .PRODUCER_CONSUMER.QUEUE.7s
+ 3314 1 ....8s
34658504120 1 ....9s
The task is identified in the first line, not in each entry. The command
also searches earlier in the history to select the ten most recent events
for task QUEUE.
REFERENCES
type Numeric
procedure Take_History
procedure Trace
type Trace_Event
@node !Commands.Debug.Hold
procedure Hold (Name : Task_Name := "");
DESCRIPTION
Stops execution of the specified task.
This command halts the specified task until it is explicitly released. You
can release a task using:
* A Release command that specifies the held task or all tasks
* An Execute or Run command that explicitly names the held task
The Execute ("All") and Run ("All") commands do not release tasks held by
this command.
The debugger displays a status message for each held task.
A hold takes effect after the current statement executes in the specified
task, as in the Stop command. Rendezvous, delays, and complex statements
complete before a hold takes effect.
If the Freeze_Tasks option flag is enabled, the debugger attempts to stop
all other tasks when any one task is stopped. The other tasks may not
actually stop because they may be in rendezvous with the stopped task,
waiting for an entry call, or otherwise blocked.
If the specified task is already held, this command has no effect.
The Hold command allows exclusion or inclusion of tasks from the normal
set of tasks running in a program. Tasks operating incorrectly (for
example, creating errors) may be held and the program allowed to continue
without their interference. Alternatively, the Hold ("All") command
followed by Execute commands specifying certain tasks causes execution to
be limited to those specified tasks while all others remain held.
PARAMETERS
Name : Task_Name := "";
Specifies the task to be held. The default value is the task specified by
the current control context. If the control context is not explicitly set,
the default value is all tasks.
The string "All" specifies all tasks.
REFERENCES
procedure Execute
procedure Release
procedure Run
procedure Stop
@node !Commands.Debug.Information
procedure Information
(Info_Type : Information_Type := Debug.Exceptions;
For_Task : Task_Name := "");
DESCRIPTION
Lists information about the specified task.
By default, the Information procedure lists exception names and locations
for all tasks.
The type of information displayed by this command depends on the type
specified by the Info_Type parameter. See the "Parameters" section, below,
for the format of each information type.
Enabling the Addresses option flag augments the information displayed by
this command. See the description in the "Parameters" section, below.
PARAMETERS
Info_Type : Information_Type := Debug.Exceptions;
Specifies the type of information listed by the command. The default value
is Exceptions.
For these values for Info_Type, the Information procedure displays the
following:
* If Info_Type specifies Exceptions, the Information command displays the
exception name and location of each active exception in the specified
task. An exception is active if the task is still executing code in
the handler for that exception. If the Addresses option flag is
enabled, Information also displays the program counter value, actual
exception name, and control offset of the exception.
Note: The control offset of the exception is Environment information
that contains the actual exception information. This information
generally is useful only in diagnosing system problems.
* If Info_Type specifies Rendezvous, the Information command lists the
partner name for each rendezvous currently in progress. A rendezvous is
in progress if the task is currently executing an accept statement for
an entry. If the Addresses option flag is enabled, Information also
displays the control offset of the task linkage.
* If Info_Type specifies Space, the Information command lists the current
and maximum allocations for the control and data memory spaces. If the
Addresses option flag is enabled, Information also displays the size of
each address space.
For_Task : Task_Name := "";
Specifies the task for which information is displayed. The default value is
the task specified by the current control context. If the control context
is not set to a specific task, the parameter designates all tasks.
REFERENCES
type Information_Type
type Option
@node !Commands.Debug.Information_Type
type Information_Type is (Exceptions, Rendezvous, Space);
DESCRIPTION
Defines the type of information displayed by various debugger commands
(specifically the Information procedure).
ENUMERATIONS
Exceptions
Specifies information about exceptions active in the specified task.
Rendezvous
Specifies information about current rendezvous in the specified task.
Space
Specifies information regarding memory space consumed by the specified task.
@node !Commands.Debug.Kill
procedure Kill (Job : Boolean := True;
Debugger : Boolean := False);
DESCRIPTION
Kills the current job, the current debugger, or both.
By default, this command kills the current job but not the debugger
itself. It is not necessary to kill the debugger if the current job
terminates or is killed.
You should not kill the debugger unless it is functioning abnormally.
Because the Environment will reuse the debugger if possible, you will save
time by keeping the debugger active instead of killing and restarting the
debugger for each job you debug.
You can kill the debugger and allow the current job to continue, but this
is not recommended. The safest method is to turn off debugging with the
Debug_Off (Kill_Job => False) command, which allows the current job to
finish, and then kill the debugger with a kill command.
PARAMETERS
Job : Boolean := True;
Specifies whether to kill the job currently being debugged. If True, the
job is killed. If False, this command should have no effect on the job
being debugged. The default value is True.
Debugger : Boolean := False;
Specifies whether to kill the debugger for the current session. If True,
the debugger is killed. The default value is False.
@node !Commands.Debug.Location_To_Address
procedure Location_To_Address (Location : Path_Name := "<SELECTION>";
Stack_Frame : Integer := 0);
DESCRIPTION
Displays the memory address for the machine instruction corresponding to
the specified location.
For the R1000 target, the format of memory addresses is
"#segment,#offset". The segment value specifies the segment number in
hexadecimal notation. The offset specifies the location of the instruction
in the segment.
This command is the functional inverse of the Address_To_Location command.
PARAMETERS
Location : Path_Name := "<SELECTION>";
Specifies the location for which the command returns the corresponding
memory address. A location can be an Ada program unit (a package, task, or
subprogram), a frame reference, a statement, or a declaration. By default,
the value of Location is the selected statement or declaration, but
selections apply only if the value of Stack_Frame is 0.
The value of Location can be an absolute pathname, a relative pathname, or
a special name that resolves to a designated location.
The values of the Location parameter and the Stack_Frame parameter
together designate the actual location to which this command applies.
These values define which parameter has precedence in determining the
location, as shown in the following table:
Interaction of Location and Stack_Frame Parameters
------------------------------------
| | | |
| |Parameter |Parameter |
|If Location |Used |Used |
|Is: |If |If |
| |Stack_Frame|Stack_Frame|
| |= 0: |/= 0: |
------------------------------------
| | | |
|An absolute |Location |Location |
|pathname | | |
------------------------------------
| | | 1 |
|A relative |Location |Both |
|pathname | | |
------------------------------------
| | | |
|A special |Location |Stack2 |
|name | |Frame |
------------------------------------
1 If Location is a relative pathname and Stack_Frame is nonzero,
Location_To_Address uses both parameters to designate the location. The
pathname is prepended with _n., where n is the value of Stack_Frame. For
example, if the value of Stack_Frame is 3 and the value of Location is
"Commands.Filch", the pathname used is "_3.Commands.Filch".
2 If Location is a special name and Stack_Frame is nonzero, Stack_Frame
overrides Location, and Location_To_Address returns the address of the
first location in the frame specified by Stack_Frame.
If the Location parameter is null or an invalid selection reference, this
command returns the address of the first location in the current frame. If
the value of Location cannot otherwise be resolved to a valid location,
the debugger reports an error.
See Chapter 2, "Referencing Objects in the Debugger," and the Path_Name
subtype for more information on designating locations.
Stack_Frame : Integer := 0;
Specifies the frame for which the command returns the corresponding memory
address. By default, this parameter is ignored. Thus, this parameter is
used only if it is nonzero and if the value of Location is a relative
pathname or a special name. See the Location parameter for details.
EXAMPLES
The following command with the default parameter:
Location_To_Address;
displays:
Name: .PRODUCER_CONSUMER.QUEUE.1d
PC = #19901, #10
REFERENCES
procedure Address_To_Location
@node !Commands.Debug.Memory_Display
procedure Memory_Display (Address : String := "";
Count : Natural := 0;
Format : String := "DATA");
DESCRIPTION
Displays the contents of absolute memory.
For the R1000 target, the format of the Address parameter is
"#segment,#offset". The segment specifies (in hexadecimal) the segment
address of the memory space to be displayed. The offset specifies the
starting location in the segment. The unit of the offset depends on the
Format parameter.
The display format is determined by the value of the Format parameter:
* Control words (displayed when the value of Format is "Control") are
interpreted according to the interpretation tag contained within the
word.
* Code segment words (displayed when the value of Format is "Code") are
disassembled into their symbolic form.
* All other types of memory units are displayed in hexadecimal.
If the Interpret_Control_Words option flag is disabled, Memory_Display
will not interpret control words. By default, it is enabled. Import words
are interpreted if the "Interpret_Import_Words" string flag is enabled. By
default, it is disabled.
PARAMETERS
Address : String := "";
Specifies the address at which to display memory. For the R1000, the
address format is "#segment,#offset". The segment value specifies the
segment number in hexadecimal notation. The offset specifies the location
of the instruction in the segment.
Count : Natural := 0;
Specifies the number of items to display. The meaning of this parameter is
interpreted differently for each target. For the R1000, Count specifies
the number of units displayed, starting from the memory address specified
by the Address parameter.
Format : String := "DATA";
Specifies the format of the memory to be displayed. The meaning of this
parameter is interpreted differently for each target. The legal values
for the R1000 debugger are:
Control Control word offset (memory unit is control stack
words)
Typ Type word offset (memory unit is type stack words)
Queue Bit offset (the display always starts on a full word
boundary; the starting offset will be the nearest
full word that contains the bit specified by the offset
section of the Address parameter)
Data Bit offset into the segment (the display always starts
on a full word boundary; the starting offset will be
the nearest full word that contains the bit specified
by the offset section of the Address parameter)
Import Word offset (memory unit is import words)
Code Instruction offset (memory unit is instructions)
System Bit offset (the display always starts on a full word
boundary; the starting offset will be the nearest
full word that contains the bit specified by the offset
section of the Address parameter)
@node !Commands.Debug.Modify
procedure Modify (New_Value : String := "";
Variable : Path_Name := "<SELECTION>";
Stack_Frame : Integer := 0);
DESCRIPTION
Modifies the value of the specified variable.
By default, the Modify command modifies the value of the selected variable
in the current frame of the last stopped task. The specified variable must
be a scalar. Structures such as records or arrays can be modified only by
changing the values of individual components.
The Modify command accesses variables according to the type of Ada unit in
which they were declared. Variables declared in a procedure or function
are elaborated each time that procedure or function is called, and the
Modify command accesses the individual instance of such a variable by its
stack frame. Variables declared in library-unit packages are elaborated
once, and the Modify command accesses such variables without reference to
stack frames.
Note: Unless the Variable and Stack_Frame parameters specify a specific
elaboration of a variable, the Modify command uses the current control
context and stack searching to determine which instance of that variable
to designate for modification. See the descriptions of these parameters
for more details.
Selecting Variables
* If the desired variable appears on the screen, you can select the
variable and press the key combination bound to the command. The
Variable parameter resolves to the selected variable.
* If you want to specify the variable explicitly, you enter the command
through a command window, filling in the Variable parameter with either
an absolute or a relative pathname. You do not need to fill in the
Stack_Frame parameter; however, if you do, it will supplement a
relative pathname with the specified stack frame number. (See the
Variable parameter, below.)
See Chapter 2, "Referencing Objects in the Debugger," and the Path_Name
subtype for more information on variable naming.
PARAMETERS
New_Value : String := "";
Specifies the new value of the variable.
Numeric values are specified with simple numeric representations.
Expressions are not allowed.
Enumeration values are specified with unqualified names of enumeration con-
stants. Because the variable name determines its type, enumerated values
for New_Value do not need to be qualified. For example, the string "Nul"
is sufficient to specify the character literal Ascii.Nul.
Variable : Path_Name := "<SELECTION>";
Specifies the variable to be modified. By default, the value of Variable is
the first occurrence of the specified variable in the current selection, but
selections apply only if the value of Stack_Frame is 0.
The value of Variable can be an absolute pathname, a relative pathname, or
a special name that resolves to a designated variable. The values of the
Variable parameter and the Stack_Frame parameter together designate the
actual variable whose value Modify changes. These values define which
parameter has precedence in determining the location, as shown in the
following table:
Interaction of Variable and Stack_Frame Parameters
------------------------------------
| | | |
| |Parameter |Parameter |
|If Variable |Used |Used |
|Is: |If |If |
| |Stack_Frame|Stack_Frame|
| |= 0: |/= 0: |
------------------------------------
| | | |
|An absolute |Variable |Variable |
|pathname | | |
------------------------------------
| | | 1 |
|A relative |Variable |Both |
|pathname | | |
------------------------------------
| | 2 | 3 |
|A special |Variable |Both |
|name | | |
------------------------------------
1 If Variable is a relative pathname and Stack_Frame designates a specific
frame (that is, it is nonzero), Modify uses both parameters to
designate a variable. The pathname is prepended with _n., where n is
the value of Stack_Frame. For example, if the value of Stack_Frame is
3 and the value of Variable is "Commands.Filch", the pathname used is
"_3.Commands.Filch".
2 If Variable is a special name and Stack_Frame has the default value of
zero, Modify searches the stack from the frame specified by the value of
the Stack_Start numeric flag, the default value of which is also zero.
Unless either Stack_Frame or Stack_Start is set to a nonzero value,
Modify searches from the first frame in the stack.
3 If Variable is a special name and Stack_Frame designates a specific frame
(that is, it is nonzero), Modify searches for the first occurrence of the
specified variable in that frame and subsequent frames. Modify searches
the number of frames specified by the Stack_Count numeric flag, the
default value of which is 10.
If the value of the Variable parameter is the null string (""), the Modify
procedure uses the current evaluation context to designate a variable to
modify, as follows:
* If the current evaluation context resolves to a variable, Modify
modifies that variable.
* If the current evaluation context does not resolve to a variable,
Variable defaults to a frame, which is an illegal value, and the
debugger reports an error.
Stack_Frame : Integer := 0;
Specifies the stack frame containing the variable to be modified. By
default, this parameter is ignored. Thus, this parameter is used only if
it is nonzero and if the value of Variable is a relative pathname or a
special name. See the Variable parameter for details.
RESTRICTIONS
The pathname must specify an object that is a variable.
The specified variable must have a simple data type (discrete, float, or
character).
Access types can be modified only to the value "Null". The following
objects cannot be modified:
* Variables of task types
* In parameters, which are actually constants
* Discriminants of variant records
* For-loop iteration variables
* Constants
ERRORS
The Variable parameter cannot specify a constant.
The Variable parameter cannot specify a variable of a structured type.
Structures such as records or arrays can be modified only by changing the
values of individual components.
REFERENCES
subtype Path_Name
procedure Put
@node !Commands.Debug.Numeric
type Numeric is (Display_Count, Display_Level, Element_Count,
First_Element, History_Count, History_Entries,
History_Start, Memory_Count, Pointer_Level,
Stack_Count, Stack_Start);
DESCRIPTION
Defines the set of numeric value flags used as default values by various
debugger commands.
Within the debugger, numeric value flags are called numeric flags. The
value of each numeric flag can be modified with the Set_Value command.
Each of the following numeric flags has a standard value. The standard
value is the initial value of the numeric flag when the debugger is
started. The debugger assigns values to these numeric flags from the
corresponding session switches. The switches have names of the form
Debug_xxx, where xxx is the numeric flag name. The standard values listed
below are the default values of these switches. See the Session Switches
section of the Session and Job Management (SJM) book for more information
on session switches.
Note: Type Option defines a set of Boolean value flags also used as default
values by various debugger commands. See the Option type for more
information on these flags.
ENUMERATIONS
Display_Count
Specifies the default value of the Count parameter in the Display command.
The standard value is 10.
Display_Level
Specifies the number of levels to expand complex data structures in the Put
command. Put does not display the remaining levels (that is, they are
elided). The standard value is 3.
Element_Count
Specifies the maximum number of elements in any array displayed with the
Put command. The standard value is 25.
First_Element
Specifies the first element of an array displayed with the Put command. The
standard value is 0.
History_Count
Specifies the default value for the Count parameter for the History_Display
command. The standard value is 10.
History_Entries
Specifies the maximum number of history entries kept by the debugger. The
standard value is 1,000. This flag is not currently supported.
History_Start
Specifies the oldest history entry displayed by the History_Display
command. This enumeration is the default value for the Start parameter.
The standard value is 10.
Memory_Count
Specifies the default value for the Count parameter in the Memory_Display
command. The standard value is 3.
Pointer_Level
Specifies the level of pointer values to be expanded in the display
produced by the Put command. The standard value is 3.
Stack_Count
Specifies the default value of the Count parameter used in various commands
(for example, Modify and Stack). The standard value is 10.
Stack_Start
Specifies the default starting frame number in various commands (for
example, Modify and Stack). The standard value is 1.
REFERENCES
procedure Display
procedure Flag
procedure History_Display
procedure Memory_Display
type Option
procedure Put
procedure Set_Value
procedure Stack
@node !Commands.Debug.Option
type Option is (Addresses, Break_At_Creation, Declaration_Display,
Delete_Temporary_Breaks, Display_Creation,
Echo_Commands, Freeze_Tasks, Include_Packages,
Interpret_Control_Words, Kill_Old_Jobs,
Machine_Level, No_History_Timestamps,
Optimize_Generic_History, Permanent_Breakpoints,
Put_Locals, Qualify_Stack_Names,
Require_Debug_Off, Save_Exceptions, Show_Location,
Timestamps);
DESCRIPTION
Defines the set of Boolean value flags used as default values by various
debugger commands.
Within the debugger, Boolean value flags are called option flags. The
value of each option flag can be modified with the Enable and Disable
commands.
Each of the following option flags has a standard value. The standard
value is the initial value of the option flag when the debugger is
started. The debugger assigns values to these option flags from the
corresponding session switches. The switches have names of the form
Debug_xxx, where xxx is the option flag name. The standard values listed
below are the default values of these switches. See the Session Switches
section of the Session and Job Management (SJM) book for more infor-
mation on session switches.
Note: Type Numeric defines a set of numeric value flags also used as
default values by various debugger commands. See the Numeric type for more
information on these flags.
ENUMERATIONS
Addresses
When enabled (True), includes machine information in displays produced by
Stack, Task_Display, Information, and Trace commands, and the standard
display message for stopped tasks. By default, this option flag is
disabled (False).
Break_At_Creation
When enabled (True), causes the equivalent of a breakpoint to be placed at
the point where new tasks begin elaboration. By default, this option flag
is disabled (False).
Declaration_Display
When enabled (True), forces listing of all declarations in source-code
listings by the Display command. By default, this option flag is enabled
(True).
Delete_Temporary_Breaks
When enabled (True), forces deletion of temporary breakpoints after the
debugger encounters them. By default, this option flag is disabled
(False).
Display_Creation
When enabled (True), forces a trace display for each task as it is
created. By default, this option flag is disabled (False).
Echo_Commands
When enabled (True), forces all debugger commands to be echoed in the
debugger window. By default, this option flag is enabled (True).
Freeze_Tasks
When enabled (True), requests that the debugger attempt to stop all tasks
when any task is stopped by the debugger. By default, this option flag is
disabled (False).
Include_Packages
When enabled (True), causes inclusion of elaborated packages in displays
generated by the Task_Display command. By default, this option flag is
disabled (False).
Interpret_Control_Words
When enabled (True), forces interpretation of control stack words
displayed by the Memory_Display command. By default, this option flag is
disabled (False).
Kill_Old_Jobs
When enabled (True), forces termination of the last job being debugged
when a new program is started. By default, this option flag is enabled
(True).
Machine_Level
When enabled (True), allows certain machine-level operations. By default,
this option flag is disabled (False).
No_History_Timestamps
When enabled (True), prevents inclusion of timestamps in history entries
displayed by the History_Display command. By default, this option flag is
enabled (True).
Optimize_Generic_History
When enabled (True), precludes history tracing for generic instances. A
history is taken only for the generic itself, which increases execution
speed for that generic. By default, this option flag is enabled (True).
Permanent_Breakpoints
When enabled (True), specifies whether breakpoints are permanent or
temporary. By default, this option flag is enabled (True).
Put_Locals
When enabled (True), causes display of local variables as well as formals
when procedure Put is called with locations that are packages or
subprograms. By default, this option flag is disabled (False).
Qualify_Stack_Names
When enabled (True), causes the names displayed by the Stack command to be
fully qualified. When disabled (False), the names are the simple names of
the subprograms executing in each frame. By default, this option flag is
disabled (False).
Require_Debug_Off
When enabled (True), prevents the initiation of a new debugger job from
forcing the termination of the current job. If this option flag is
enabled, the current job can terminate only by normal completion of the
job or by explicitly executing the Debug_Off command. If this option flag
is disabled, the current job will be terminated by the debugger when a
new job is initiated. By default, this option flag is disabled (False).
Save_Exceptions
When enabled (True), causes retention of exception-handling information
from the Catch and Propagate commands until the next debugging run. By
default, this option flag is disabled (False).
Show_Location
When enabled (True), causes highlighted display of current source location
for any task that stops in the debugger. The debugger displays source code
for only the control context task, the root task, or (in the case of the
Run command) all tasks. By default, this option flag is enabled (True).
Timestamps
When enabled (True), forces display of a timestamp for each command and
stopped task. By default, this option flag is disabled (False).
REFERENCES
procedure Break
procedure Disable
procedure Display
procedure Enable
procedure Flag
procedure History_Display
procedure Memory_Display
type Numeric
procedure Put
procedure Run
procedure Stack
procedure Stop
procedure Task_Display
procedure Trace
@node !Commands.Debug.Path_Name
subtype Path_Name is String;
DESCRIPTION
Defines a string used to reference declarations, objects, statements, or
types within program units.
This subtype defines the Ada string type used by commands in this package
to denote specific locations within program units. These string names use
existing Ada naming rules wherever possible and extend those rules to
define names for anonymous blocks, package and task bodies,
accept-statement bodies, locations within generic program units, and
overloaded names.
The Path_Name subtype defines two formats for pathname strings: full
pathnames and relative pathnames. Full pathnames identify an absolute
location within Ada source, beginning with a task or library name.
Relative pathnames are resolved within the current evaluation or control
context, or both, depending on the use of the pathname.
Statements and declarations are numbered. A pathname to a specific
statement or declaration includes the number of that statement or
declaration. Numbering of each group of declarations or statements is
independent and begins with 1. When source code is displayed, these
numbers appear at the beginning of statement or declaration lines. In
pathnames, statement numbers are differentiated from declaration numbers
by a suffix s (the default) for statements and d for declarations.
Pathnames can be special names (for example, "<SELECTION>") that specify a
location or object. These special names have the form "<NAME>" and are de-
scribed in more detail in Parameter-Value Conventions in the Reference
Summary (RS) book.
If a special name does not resolve to a location or object (for example,
if the special name is "<SELECTION>" and the cursor is not in the
selection), the debugger defaults to the null string (""), which is
interpreted differently by various commands.
Pathnames consist of a prefix and a final name component. The prefix of a
pathname refers to the context that contains the object identified by the
pathname. The final name component can be any of a number of disparate Ada
objects (statements, tasks, generics, and so on). The following table
defines what the final name component of a pathname would be for each object
type:
Pathname Construction
--------------------------------------------
| | |
|Object Type |Final Name Component in |
| |Pathname |
--------------------------------------------
| | |
|Library package |Simple name of the package|
--------------------------------------------
| | |
|Library |Simple name of the |
|subprogram |subprogram |
--------------------------------------------
| | |
|Library-unit |Simple name of the package|
|generic package | |
--------------------------------------------
| | |
|Library-unit |Simple name of the |
|generic |subprogram |
|subprogram | |
--------------------------------------------
| | |
|Library-unit |Simple name of the |
|generic |instantiation |
|instantiation | |
--------------------------------------------
| | |
|Package |Simple name of the package|
--------------------------------------------
| | |
|Task type |Simple name of the task |
| |type |
--------------------------------------------
| | |
|Generic instance |Simple name of the |
| |instantiation |
--------------------------------------------
| | |
|Generic package |Simple name of the generic|
|declaration |package |
--------------------------------------------
| | |
|Generic |Simple name of the generic|
|subprogram |subprogram |
|declaration | |
--------------------------------------------
| | |
|Subprogram |Simple name of the |
| |subprogram |
--------------------------------------------
| | |
|Block |Label on the block, if |
| |present, or the statement |
| |number of the block |
| |statement if no label is |
| |present (the statement |
| |number can be used as a |
| |name even if a label is |
| |present) |
--------------------------------------------
| | |
|Accept-statement |Statement number of the |
|block |accept statement (the |
| |accept statement is |
| |numbered as a normal Ada |
| |statement if it appears |
| |alone or as an arm of a |
| |select) |
--------------------------------------------
| | |
|Field of a record|Simple name of the field |
| |(this component applies |
| |to discriminants, fixed |
| |fields, and variant fields|
--------------------------------------------
| | |
|Element of an |Subscript list enclosed in|
|array |parentheses (the sub- |
| |scripts themselves must be|
| |simple constants of the |
| |appropriate type) |
--------------------------------------------
| | |
|Object designated|Name "All" |
|by a pointer | |
--------------------------------------------
The formal syntax definition of pathnames appears in the following
Backus-Naur form (BNF) definition:
Pathname ::= [Task_Prefix] [Frame_Prefix]
["." Name_Component_Sequence]
| Library_Prefix
["." Name_Component_Sequence]
| Universe_Prefix
[Name_Component_Sequence]
| Parent_Prefix
[Name_Component_Sequence]
| Parent_Library_Prefix
[Name_Component_Sequence]
| Parent_World_Prefix
[Name_Component_Sequence]
| Name_Component_Sequence
| Special_Name
Task_Prefix ::= "%" Task_Synonym
Library_Prefix ::= "." Library_Unit_Name
Frame_Prefix ::= "_" Frame_Number
Universe_Prefix ::= "!"
Parent_Prefix ::= "^"
Parent_Library
_Prefix ::= "$"
Parent_World
_Prefix ::= "$$"
Name_Component ::= Component
_Sequence | Package_Name ["." Component]
| Task_Name ["." Component]
| Task_Name ["._" Frame_Number]
| Record_Name ["." Component]
| Array_Name ["(" Index_List ")"]
| Subprogram_Name ["." Component]
| Block_Name ["." Component]
| Generic_Unit ["." Component]
| Generic_Instance ["." Component]
Special_Name ::= "< SELECTION>" | "< REGION>" | "< IMAGE>"
| "< CURSOR>"
Index_List ::= Index ["," Index_List]*
Index ::= Numeric_Literal | Identifier
Package_Name ::= Name_Component_Sequence
Task_Name ::= Name_Component_Sequence
Record_Name ::= Name_Component_Sequence
Array_Name ::= Name_Component_Sequence
Subprogram_Name ::= Name_Component_Sequence
Block_Name ::= Name_Component_Sequence
Component ::= Identifier ["'" Location_Attribute]
| Statement_Number
| Declaration_Number
Statement_Number ::= Positive ["s"]
Declaration_Number ::= Positive "d"
Positive ::= Digit+ (non-zero value)
Location_Attribute ::= "spec" | "body" | "N(" Nickname ")"
Nickname ::= Identifier | Positive
Task_Synonym ::= Identifier
Frame_Number ::= Positive | "-" Positive
Library_Unit_Name ::= Identifier
In addition to the BNF syntax definition, the following rules apply to
statement and declaration numbering:
* Use clauses and representation specifications are not numbered.
* Parameters (including generic formal parameters) are not numbered.
* Blocks are numbered separately, as are bodies of accepts, package
specs, and package bodies.
* Statements in exception handlers are numbered continuously with
preceding normal statements.
* Accept arms of select statements are numbered along with statements at
the same level as the enclosing select statement.
* Frame_Numbers are numbered with respect to the top of the stack (frame
1 is the topmost frame) unless preceded by a minus sign, in which case
the frames are relative to the bottom of the stack (frame -1 is the
bottommost frame).
* All imported library-unit names look through links. The local name of
an imported library unit is not known; only the actual name of the
imported unit is known. Use the Show (Libraries) command to see the
library-unit names that are known.
See Chapter 2, "Referencing Objects in the Debugger," for more details
regarding pathnames.
EXAMPLES
Qualified and Unqualified Pathnames
The following are examples of qualified and unqualified pathnames:
* %Session_Manager._5.Main_Process.4
The name begins with a percent symbol (%) and is qualified. Control and
evaluation contexts are not referenced. A task in the program has
called the Debug_Tools.Set_Task_Name command to give itself the name
Session_Manager. This name refers to statement 4 of a subprogram named
Main_Process that is declared in the subprogram executing in frame 5
of the stack of the task.
* !Users.Rab.Tests.Regression_Test_12
The name begins with an exclamation mark (!) and is fully qualified.
Neither the control nor the evaluation context is referenced. The
leading exclamation mark implies that the next name (Users) is a
library or library-unit name contained in the root of the directory
system.
The name refers to an object (probably a subprogram) called
Regression_Test_12 declared within !Users.Rab.Tests.
* _2.Condition
The leading underscore ( _ ) specifies a reference to stack frame number
2. The task referred to is based on the current control context. If the
control context is set to all tasks, then the stack of the last task to
stop in the debugger is referenced. An object named Condition,
declared in the subprogram executing in that frame, is designated.
* User_List.Next.Name
No leading special character begins the name. The name is relative to
the current evaluation context. Suppose Next and Name are fields of a
record and User_List and Next are accesses to that record type. Then
this name would refer to field Name of the record pointed to by field
Next of the record pointed to by User_List.
If the evaluation context is not set, the top frame of the task
specified by the control context (or the last task to stop if the
control context is not set) is referenced.
Task Names
The following are examples of task names:
* %Session_Manager
In this example, the name refers to a task that has assigned itself the
name Session_Manager. Control and evaluation contexts are not used.
* %620E
In this example, a task number is used to name the task. The task
number 620E was obtained from the Task_Display command or some other
debugger message that included the task number.
* .Configurator.Worker
The Ada name of a declared (or allocated) task can also be used.
Configurator represents a library unit and Worker a single task declared
in that unit.
* _4.Task_Pool(12)
An array of tasks, Task_Pool, declared in a subprogram that is
executing in frame 4 contains task names. Thus, each element (element
12 in this example) is a task.
Stack Object Names
The following are examples of names of objects and locations relative to a
stack:
* _3.12
A numeric suffix on an object name refers to a statement or declaration.
In this example, statement 12 of the subprogram executing in frame 3 of
the task specified by the control context (the last task to stop if
the control context is not set) is named.
* _1.Foo.12d
This name references declaration 12 of subprogram Foo that is declared
in the subprogram executing at frame 1 of the task designated by the
control context. Note that unless the evaluation context is nonnull,
the _1 prefix is used by default.
* Motor_State.Temperatures.Oil
Assume in this example that the evaluation context is null. Motor_State
is an object declared in the top frame of the task designated by the
control context. The exact interpretations of Temperature and Oil
depend on what Motor_State actually is.
Array Element Names
The following examples illustrate names of array elements.
Consider the following package:
package Data_Block is
type Color is (Red, Blue, Green);
Info : array (3 .. 35) of integer;
More_Info : array (1 .. 10, Color, Character) of Natural;
Char_Info : array (Character, Character) of integer;
end Data_Block;
* .Data_Block.Info(12)
Info names a single-dimensional array. This name references element 12
of the array.
* .Data_Block.More_Info(1,Blue,'a')
In this example, More_Info is a three-dimensional array. The first index
type is numeric, the second is an enumeration, and the third is also an
enumeration (Character type).
* .Data_Block.Char_Info(Nul,Bel)
Similarly, the two index types of this array are Character type. The
indices used are nongraphic literals.
REFERENCES
procedure Break
procedure Context
procedure Display
procedure Modify
procedure Put
@node !Commands.Debug.Propagate
procedure Propagate
(Name : Exception_Name := "<SELECTION>";
In_Task : Task_Name := "";
At_Location : Path_Name := "");
DESCRIPTION
Requests that the debugger continue task execution when a particular
exception is raised.
Propagate requests and catch requests combine to determine the action that
the debugger takes when an exception is raised. The debugger maintains a
list of catch and propagate requests entered by calls to the Catch and
Propagate procedures. When an exception in the user program is raised,
the debugger looks at this list to determine whether to stop the program
and inform the user. If the most specific request is a propagate request,
the debugger does not halt execution; otherwise, it does.
Specificity of Requests
More than one catch or propagate request can be in force simultaneously,
and when an exception is raised the debugger applies the most specific
request that includes the raised exception. The number and specificity of
parameter values determines the specificity of a propagate request. More
precise parameter values supersede less precise values. The list below
defines the specificity order for each parameter:
* At_Location: A value that specifies a statement within a subprogram is
more specific than one that specifies only a subprogram. A value that
specifies a subprogram is more specific than one that specifies all
locations.
* In_Task: A value that specifies a task is more specific than one that
specifies all tasks.
* Name: A value that names an exception is more specific than one that
specifies implicit or all exceptions. A request that specifies implicit
exceptions is more specific than one that specifies all exceptions.
Note: The At_Location parameter supersedes the In_Task parameter, which
supersedes the Name parameter. For example, the debugger considers
Propagate ("All", "", "!TEST.DECONSTRUCT_NABOKOV") more specific than
Propagate ("All", "34005", "").
By default, the debugger catches all exceptions (that is, the debugger
issues the equivalent of a Catch ("All","","") during initiation). To
override this default, enter a propagate request for all exceptions
(Propagate ("All","","")). This will remove the completely inclusive catch
request.
Matching Requests
If the parameters of a propagate request exactly match those of a catch
request, the debugger removes the catch request and applies the propagate
request. Otherwise, the Propagate command does not remove catch
requests. To remove a propagate or catch request, use the Forget command.
The Show (Exceptions) command displays all propagate and catch requests in
force, ordered by specificity. The debugger lists the exception name,
location, and task restrictions for each request.
Interaction with Flags
If the Save_Exceptions option flag is enabled, the debugger retains catch
and propagate requests when the user begins debugging a new job. By
default, this option flag is disabled. See the Option type for more
details regarding option flags.
Note: In some cases, the debugger cannot identify an exception. Exceptions
raised in Environment code, in archived source, or in a unit modified since
debugger initiation may not be named. These exceptions are identified with
a hexadecimal number. They may also be identified with strings of the form
"<Unit=1234, Ord=2>" or "<Space=3, Index=234987>". The Information
(Exceptions) command displays details regarding all exceptions raised in
the debugger, including unnamed exceptions.
PARAMETERS
Name : Exception_Name := "<SELECTION>";
Specifies the exception propagated by the request. The default value is the
name of the selected exception.
If the value of Name is the null string ("") or the reserved name "All",
the parameter identifies all exceptions. Also, if the value is a special
name (for example, "<SELECTION>") that cannot be resolved, the parameter
identifies all exceptions.
The reserved name "Implicit" identifies all exceptions raised implicitly
(that is, raised by a language construct other than a raise statement).
Implicit exceptions include only predefined exceptions such as
Constraint_Error and Tasking_Error.
If the exception name is not fully qualified, it is interpreted relative to
the current evaluation context.
Note: The debugger may use hexadecimal numbers to identify exceptions that
do not have names. This parameter accepts hexadecimal designations of
unnamed exceptions.
In_Task : Task_Name := "";
Specifies the task monitored for the exception selected by Exception_Name.
The reserved name "All" designates all tasks. The default value is the
null string ("").
Propagate requests apply only to a specific task or to all tasks. If the
value is non-null, In_Task designates the specified task. If the value is
null, In_Task designates no specific task and the Propagate command chooses
a default task based on the control context:
* If the control context is set, the request applies to the task in the
control context.
* If the control context is not set, the request applies to all tasks,
including new tasks initiated after the request was issued.
Values for the In_Task parameter may be task synonyms created by
Debug.Set_Task_Name or Debug_Tools.Set_Task_Name. Task synonyms must be
prefixed with a percent symbol (%). Tasks may also be identified with task
numbers. If the task name is not fully qualified, the name is interpreted
relative to the current evaluation context.
At_Location : Path_Name := "";
Specifies the location monitored for the exception selected by
Exception_Name. This parameter restricts the request to exceptions raised
within the specified location. If the pathname is not fully qualified, it
is interpreted relative to the current evaluation context. The default
value is null, which identifies all locations.
If the At_Location parameter specifies an Ada unit, the request applies
only to exceptions raised inside that unit. The request does not apply to
Ada units nested inside the selected unit (for example, procedures nested
within a package body, nested blocks, and accept statements).
See Chapter 2, "Referencing Objects in the Debugger," and the Path_Name
subtype for more information on designating locations.
RESTRICTIONS
The debugger allows a maximum of 40 catch and propagate requests.
EXAMPLES
A more restrictive specification always supersedes a less restrictive one.
A specification of a single task, exception, or location takes precedence
over a specification of all tasks, all exceptions, or all locations,
respectively.
Example 1
This applies to the interaction of propagate and catch requests:
Propagate (Name => "Constraint_Error",
In_Task => "All",
At_Location => "");
Propagate (Name => "All",
In_Task => "All",
At_Location => "!USERS.PHIL.TEST");
Catch (Name => "All",
In_Task => "1349704",
At_Location => "");
Any exceptions raised in !USERS.PHIL.TEST (the most specific request) do
not halt execution. The third request is more specific than the first, so
the Constraint_Error exception halts execution only if it is raised in
task 1349704; any other exception raised in task 1349704 also halts
execution.
Example 2
The name of an individual exception is considered more restrictive than
the reserved name "Implicit". The requests:
Catch (Name => "Implicit",
In_Task => "",
At_Location => "");
Propagate (Name => "Numeric_Error",
In_Task => "",
At_Location => "");
catch all implicitly raised exceptions other than Numeric_Error
exceptions.
Example 3
A location specifying a statement or declaration within an Ada unit is
more specific than a location specifying the entire Ada unit. The requests:
Catch (Name => "Status_Error",
In_Task => "",
At_Location => "Sandy.1");
Propagate (Name => "Status_Error",
In_Task => "",
At_Location => "Sandy");
catch Status_Error exceptions raised in the first statement of subprogram
Sandy, but they ignore Status_Error exceptions raised in the remainder of
the subprogram.
REFERENCES
procedure Catch
subtype Exception_Name
procedure Forget
type Option
subtype Path_Name
procedure Show (Exceptions)
subtype Task_Name
@node !Commands.Debug.Put
procedure Put (Variable : Path_Name := "<SELECTION>";
Stack_Frame : Integer := 0);
DESCRIPTION
Displays the value of the specified object.
By default, the Put command displays the value of the selected object in
the current frame of the last stopped task.
The Put command accesses variables according to the type of Ada unit in
which they were declared. Variables declared in a procedure or function
are elaborated each time that procedure or function is called, and Put
accesses the individual instance of such a variable by its stack frame.
Variables declared in library-unit packages are elaborated once, and the
Put command accesses such variables without reference to stack frames.
Note: Unless the Variable and Stack_Frame parameters specify a specific
elaboration of a variable, the Put command uses the current control
context and stack searching to determine which instance of that variable
to designate for modification. See the descriptions of these parameters
for more details.
Standard Displays
Displays of structured objects (records and arrays) depend on the values
of several numeric flags. The Put command displays a selection of array
elements from the specified structured object, starting with a specific
array element:
* The First_Element numeric flag determines the initial element.
* The Element_Count numeric flag determines the number of array elements
displayed.
* The value of the numeric flag Display_Level determines the number of
nesting levels displayed for a structured object.
* The value of the Pointer_Level numeric flag determines the level of
pointers in the structured object that are expanded for display.
The Set_Value command sets the values of numeric flags. See Set_Value and
type Numeric for more information regarding numeric flags.
Displays of strings consist of the contents of the string enclosed in
quotes. By default, the Put command displays only the first 73 characters
in a string. If the value of the Element_Count numeric flag is greater
than 73, Put defaults to the value of Element_Count for the number of
characters displayed. You can also use the First_Element and Element_Count
numeric flags to display different parts of a long string. Control
characters appear in inverse video, except for the linefeed character,
which breaks the line.
If the Variable parameter specifies an assignment statement, the Put
procedure displays the value of the left side of the statement. If
Variable specifies a return statement, Put displays the return value.
If the Put_Locals option flag is enabled, the Put procedure displays both
formal and local objects in subprograms.
Special Displays
The debugger provides default display mechanisms for all types, except for
some private Environment types. A special display function for a type can
be registered with the debugger using the generic procedure Register in
package Debug_Tools, allowing you to customize the formatting of all
objects of that type. When displaying an object of a type for which a
special type display function has been registered, the debugger uses
that special display function to display that object. Special display
functions can be initialized in the Debugger_Initialization procedure. See
the generic procedure Register in package Debug_Tools for more informa-
tion on using special displays.
The Put command displays images from special displays in braces ({ }) to
distinguish them from standard displays (that is, the displays predefined
by the debugger for various objects).
Selecting Variables
* If the desired object appears on the screen, you can select the object
and press the key combination bound to Put. The Variable parameter
resolves to the selected object.
* If you want to specify the object explicitly, enter the command through
a command window, filling in the Variable parameter with either an
absolute or a relative pathname. You do not need to fill in the
Stack_Frame parameter; however, if you do, it will supplement a
relative pathname with the specified stack-frame number. (See the
Variable parameter, below.)
See Chapter 2, "Referencing Objects in the Debugger," and the Path_Name
subtype for more information on object naming.
PARAMETERS
Variable : Path_Name := "<SELECTION>";
Specifies the object to be displayed. By default, the value of Variable is
the first occurrence of the specified object in the current selection, but
selections apply only if the value of Stack_Frame is 0.
The value of Variable can be an absolute pathname, a relative pathname, or
a special name that resolves to a designated object. The values of the
Variable parameter and the Stack_Frame parameter together designate the
actual object whose value the Put command displays. These values define
which parameter has precedence in determining the location, as shown in
the following table:
Interaction of Variable and Stack_Frame Parameters
------------------------------------
| | | |
| |Parameter |Parameter |
|If Variable |Used |Used |
|Is: |If |If |
| |Stack_Frame|Stack_Frame|
| |= 0: |/= 0: |
------------------------------------
| | | |
|An absolute |Variable |Variable |
|pathname | | |
------------------------------------
| | 1 | 2 |
|A relative |Variable |Both |
|pathname | | |
------------------------------------
| | | 3 |
|A special |Variable |Both |
|name | | |
------------------------------------
1 If Variable is a special name and Stack_Frame has the default value of
zero, Put searches from the frame specified by the value of the
Stack_Start numeric flag, the default value of which is also zero.
Unless either Stack_Frame or Stack_Start is set to a nonzero value, Put
searches from the first frame in the stack.
2 If Variable is a relative pathname and Stack_Frame is nonzero, Put uses
both parameters to designate an object. The pathname is prepended with
_n., where n is the value of Stack_Frame. For example, if the value of
Stack_Frame is 3 and the value of Variable is "Commands.Filch", the
pathname used is "_3.Commands.Filch".
3 If Variable is a special name and Stack_Frame designates a specific frame
(that is, it is nonzero), Put searches for the first occurrence of the
specified object in that frame and subsequent frames. Put searches the
number of frames specified by the Stack_Count numeric flag, the default
value of which is 10.
If the value of the Variable parameter is the null string (""), the
parameter designates the current evaluation context, the current control
context, or the first frame of the last stopped task, in order of
precedence.
Stack_Frame : Integer := 0;
Specifies the stack frame containing the object to be displayed. By
default, this parameter is ignored. Thus, this parameter is used only if
it is nonzero and if the value of Variable is a relative pathname or a
special name. See the Variable parameter for details.
RESTRICTIONS
The pathname must specify an object that has a value.
A specific package, task, or subprogram frame must be referenced by the
Variable parameter. The Put procedure cannot differentiate between
multiple activations of a subprogram, unless a selection is being used.
This condition also applies to generic packages and task types; a
specific instance must be referenced.
The Put procedure can display only single-dimensional arrays. Individual
elements of higher-dimensional arrays can be displayed, but not the entire
array.
ERRORS
The parameter specifies an object that has no value-for example, a field of
a variant record that is not present because of the value of the
discriminant.
A variable may be uninitialized; the Put command displays a random value
for uninitialized variables. For the R1000, the debugger displays
Uninitialized Value when Put attempts to display an uninitialized scalar.
A variable can include a subscript that is out of range for an array being
indexed.
A variable can dereference a pointer that is null.
The pathname of a variable must be legal. See type Path_Name for more
information. Put cannot modify the values of:
* Variables of task types
* In parameters
* For-loop variables
* Constants
EXAMPLES
A sample debugger session that includes use of the Put and Display
commands is shown below:
Beginning to debug: DEBUG_DOC.TEST_PROGRAMS.EXAMPLE_FOR_MANUAL'BODY'V(1) %
!USERS.BLB.DEBUG_DOC.TEST_PROGRAMS.EXAMPLE_FOR_MANUAL
Stop at: .command_procedure, Root task: [Task : ROOT_TASK, #1134E1].
Execute ("all");
User break: .EXAMPLE_FOR_MANUAL.1s [Task : ROOT_TASK, #1134E1].
Display ("%ROOT_TASK._1", 0);
procedure .EXAMPLE_FOR_MANUAL is
1 type TERMINAL is (VT100, DASHER, CIT500, ADM3);
2 type ID is new INTEGER;
3 type TERM_ARRAY is array (1 .. 3) of TERMINAL;
4 type R1 is record
F1 : INTEGER;
F2 : CHARACTER;
F3 : TERM_ARRAY;
end record;
5 type AR1 is access R1;
6 B1 : TERMINAL := DASHER;
7 B2 : ID := ID'FIRST;
8 B3 : R1 := R1'(F1 => 0, F2 => 'b', F3 => (VT100, DASHER, VT100));
9 B4 : AR1 := new R1'(F1 => -20, F2 => ASCII.ESC, F3 => (DASHER, ADM3,
CIT500));
begin
* 1 DEBUG_TOOLS.USER_BREAK ("");
end;
Now the values of the variables are displayed. Note that the default
context is the top frame of the last task to stop--in this case, the
procedure frame containing the variables of interest.
Before the first Put command is executed, the variable name B1 is selected.
The debugger echoes the following when [Put] is pressed:
Put ("%ROOT_TASK._1.B1");
DASHER
Note that although the Value parameter to the Put command specified that a
selection be used, the name of the selected object is echoed in the
command.
The following Put commands had string parameters of the form "b1" for
their Value parameters. Note that selection could have been used as well:
* Put ("b1");
Put ("%ROOT_TASK._1.b1");
DASHER
* Put ("b2");
Put ("%ROOT_TASK._1.b2");
-2147483647
* Put ("b3");
Put ("%ROOT_TASK._1.b3");
[ F1 => 0
F2 => 'b'
F3 =>
[ 1 .. 3 ]
[ 1 => VT100
2 => DASHER
3 => VT100 ]
]
* Put ("b4");
Put ("%ROOT_TASK._1.b4");
#1134E1 #80 -->
[ F1 => -20
F2 => ASCII.ESC
F3 =>
[ 1 .. 3 ]
[ 1 => DASHER
2 => ADM3
3 => CIT500 ]
]
* Put ("b4.f3(2)");
Put ("%ROOT_TASK._1.b4.f3(2)");
ADM3
* Put ("b4.f3(5)");
Put ("%ROOT_TASK._1.b4.f3(5)");
Display error:
Array index out of bounds
Display ("%ROOT_TASK._1.b4", 0);
access R1
Display ("%ROOT_TASK._1.b2", 0);
range -2147483647 .. 2147483647
REFERENCES
procedure Context
procedure Modify
type Numeric
type Option
subtype Path_Name
procedure Set_Value
procedure Debug_Tools.Register
procedure Debug_Tools.Un_Register
@node !Commands.Debug.Release
procedure Release (Name : Task_Name := "");
DESCRIPTION
Releases a task from the "held" state and moves it to the "stopped" state.
When held tasks are released to the stopped state, you can cause them to
resume execution with the Execute and Run commands.
PARAMETERS
Name : Task_Name := "";
Specifies the task to be released. The default value is the task specified
by the current control context. If the control context is not explicitly
set, the default value is all tasks.
The reserved word "All" specifies all tasks.
REFERENCES
procedure Execute
procedure Hold
procedure Stop
@node !Commands.Debug.Remove
procedure Remove (Breakpoint : Natural;
Delete : Boolean := False);
DESCRIPTION
Deactivates the specified breakpoint.
This command deactivates breakpoints set with the Break command. The
removed breakpoint will not interrupt execution unless it is reactivated
with the Activate command. The Remove command can delete a breakpoint
after it is deactivated. Deleted breakpoints no longer exist and cannot be
reactivated.
PARAMETERS
Breakpoint : Natural;
Specifies which breakpoint to deactivate. The value is the number assigned
to the breakpoint when it was created.
A value of 0 represents all breakpoints. Thus, Remove(0, True) deletes all
breakpoints.
Delete : Boolean := False;
Specifies whether to delete the breakpoint. The default value is False.
ERRORS
The breakpoint does not exist.
REFERENCES
procedure Activate
procedure Break
procedure Show (Breakpoints)
@node !Commands.Debug.Reset_Defaults
procedure Reset_Defaults;
DESCRIPTION
Resets all numeric, option, and string flags to their standard values and
unregisters all special displays.
See procedure Debug_Tools.Register for more information on special
displays.
From a login procedure, this command automatically starts the debugger,
but it does not display the debugger window.
@node !Commands.Debug.Run
procedure Run (Stop_At : Stop_Event := Debug.Statement;
Count : Positive := 1;
In_Task : Task_Name := "");
DESCRIPTION
Executes the specified task until the stop event has occurred the number of
times specified by the Count parameter.
By default, the last task to stop in the debugger is run.
The Run command executes the specified task until the stop condition
specified by the Stop_At parameter occurs the number of times specified by
Count. When this condition is met, Run displays the location of the next
statement and stops the task. The Stop_At parameter allows step-by-step
execution of a program. The stepping conditions of a Run command persist
if a task stops for a different reason (for example, a breakpoint or
exception). When execution resumes, the stepping condition is still in
force.
The Clear_Stepping command clears stepping conditions set for the Run com-
mand. See the Clear_Stepping procedure for more information.
The Run command resumes execution of all implicitly stopped tasks. If the
Freeze_Tasks option flag is enabled, all tasks stop implicitly when a
single task stops.
Note: Stepping reduces execution speed. To improve performance, you can
set a breakpoint before the area of interest in your program, use the
Execute command to run without stopping to the breakpoint, and then resume
execution with stepping for that area.
PARAMETERS
Stop_At : Stop_Event := Debug.Statement;
Specifies the event that will halt execution. The default is any statement.
Count : Positive := 1;
Specifies the repetition limit (that is, the number of times it is
executed) of the stop event specified by the Stop_At parameter. The default
value is 1, which specifies the first execution of the stop event.
In_Task : Task_Name := "";
Specifies the task to be run. The default is the task specified by the
control context. If the control context does not resolve to a task,
In_Task specifies the last stopped task. The reserved name "All" specifies
all tasks.
RESTRICTIONS
The debugger allows only one stepping operation per task. Starting a new
stepping operation cancels the existing operation.
ERRORS
For the R1000 target, the number of debugging operations that can be
applied to a specific task is limited. If too many breakpoints are set in a
given task, it may not be possible to execute the Run command for that
task.
EXAMPLES
When the debugger stops and displays:
Break 1: .STEPPING_TEST.2s [#620E]
the user enters the command:
Run (Statement, 3, "%602E");
and the debugger then displays:
Step: .STEPPING_TEST.5s [#620E]
REFERENCES
procedure Clear_Stepping
procedure Show (Steps)
@node !Commands.Debug.Set_Task_Name
procedure Set_Task_Name (For_Task : Task_Name := "";
To_Name : String := "");
DESCRIPTION
Assigns a string synonym to the specified task.
A synonym can be assigned to only one task; the debugger does not allow
synonyms to be overloaded. Reassigning a task synonym to a new task
removes that synonym from the task to which it was previously assigned.
The name Root_Task is automatically assigned to the root task (the command
task) in a job. Do not reassign the root-task synonym.
The Debug_Tools.Set_Task_Name command also assigns synonyms to tasks.
Most debugger commands recognize task synonyms. To be used in a command, a
synonym must be preceded by a percent symbol (%). The string passed to
this command, 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.
The Debug_Tools.Set_Task_Name procedure also assigns synonyms to tasks.
Note, however, that the parameters differ from those for this command.
Note: Task synonyms were formerly documented as task nicknames.
PARAMETERS
For_Task : Task_Name := "";
Specifies the task to which a synonym is assigned. If the value is the null
string ("") and the control context resolves to a task, For_Task specifies
that task. If the value is the null string ("") and the control context
does not resolve to a task, For_Task specifies the last stopped task.
To_Name : String := "";
Specifies the name to be assigned to the task. The string must be a legal
Ada identifier. Strings containing illegal characters cause an error.
REFERENCES
type Path_Name
procedure Task_Display
procedure Debug_Tools.Set_Task_Name
@node !Commands.Debug.Set_Value
procedure Set_Value (Variable : Numeric;
To_Value : Integer):
DESCRIPTION
Sets a numeric value flag to the specified value.
See the Numeric type for more information on the numeric value flags.
PARAMETERS
Variable : Numeric;
Specifies the numeric variable to change.
To_Value : Integer;
Specifies the variable value.
REFERENCES
procedure Disable
procedure Enable
type Numeric
type Option
@node !Commands.Debug.Show
procedure Show (Values_For : State_Type := Debug.Breakpoints);
DESCRIPTION
Displays information about various debugger facilities.
By default, this command displays a list of all breakpoints.
A value of All_State for the Values_For parameter specifies all supported
information types (for example, Breakpoints, Contexts, Exceptions, and
so on). Other values refer only to individual types. The examples below
demonstrate the display format of each information type.
PARAMETERS
Values_For : State_Type := Debug.Breakpoints;
Specifies the information type displayed. The default value is Breakpoints.
See the State_Type type for details regarding other values.
EXAMPLES
The following examples show the different facilities and the content of
displays for those facilities.
Example 1
The command:
Show (Breakpoints);
produces the display:
Active Permanent Break 4 at !USERS.JACK.TEMP.3d [any task]
Inactive Permanent Break 5 at !USERS.JACK.T.1s [any task]
Active Temporary Break 6 at !USERS.JACK.JILL.1s [task : #2D110]
The display of breakpoint information lists the state (active or
inactive), type (permanent or temporary), number, location, and associated
task for all existing breakpoints.
Example 2
The command:
Show (Contexts);
displays the current control and evaluation contexts. The commands:
Context (Control, "%2D110");
Context (Evaluation, "!USERS.PHIL.PIE_CHART");
Show (Contexts);
produce the display:
Evaluation context: !users.phil.pie_chart
Control context: #2D110
The commands:
Context (Control, "All");
Context (Evaluation, "");
Show (Contexts);
produce the display:
Evaluation context:
Control context: all
Example 3
The command:
Show (Flags);
displays the name of each known flag and its current value:
DISPLAY_COUNT 10
DISPLAY_LEVEL 3
ELEMENT_COUNT 25
FIRST_ELEMENT 0
HISTORY_COUNT 10
HISTORY_ENTRIES 1000
HISTORY_START 10
MEMORY_COUNT 3
POINTER_LEVEL 3
STACK_COUNT 10
STACK_START 1
ADDRESSES FALSE
BREAK_AT_CREATION FALSE
DECLARATION_DISPLAY TRUE
DELETE_TEMPORARY_BREAKS FALSE
DISPLAY_CREATION FALSE
ECHO_COMMANDS TRUE
FREEZE_TASKS FALSE
INCLUDE_PACKAGES FALSE
INTERPRET_CONTROL_WORDS TRUE
KILL_OLD_JOBS TRUE
MACHINE_LEVEL FALSE
NO_HISTORY_TIMESTAMPS TRUE
OPTIMIZE_GENERIC_HISTORY TRUE
PERMANENT_BREAKPOINTS TRUE
PUT_LOCALS FALSE
QUALIFY_STACK_NAMES FALSE
REQUIRE_DEBUG_OFF FALSE
SAVE_EXCEPTIONS FALSE
SHOW_LOCATION TRUE
TIMESTAMPS FALSE
CACHE_STACK_FRAMES TRUE
Example 4
The command:
Show (Exceptions);
displays all active exception requests. At least one request is always
active; it indicates what to do for exceptions not covered by other
requests. The command lists exception requests from the most specific to
the least specific, since the debugger applies requests in order of
specificity. The following example shows how the display changes to reflect
new exception requests:
Show (Exceptions);
Debugger stops on: unlisted exceptions
Catch ("constraint_error", "all", "");
The exception constraint_error will be caught when raised in any
location in all tasks.
Propagate ("tasking_error", "all", "");
The exception tasking_error will be propagated when raised in any
location in all tasks.
Catch ("implicit", "all", "");
Implicit exceptions will be caught when raised in any location in
all tasks.
Show (Exceptions);
Debugger stops on: Constraint_Error
Debugger doesn't stop on: Tasking_Error
Debugger stops on: implicit
Debugger stops on: unlisted exceptions
Forget ("constraint_error", "all", "");
The exception constraint_error has been forgotten for all locations
in all tasks.
Propagate ("", "all", "");
Unlisted exceptions in unlisted locations and tasks will be propagated.
Catch ("!io.io_exceptions.layout_error", "1cf8e1", "");
The exception !io.io_exceptions.layout_error will be caught when
raised in any location in task #1CF8E1.
Show (Exceptions);
Debugger stops on: !Io.Io_Exceptions.Layout_Error when raised in
task
#1CF8E1
Debugger doesn't stop on: Tasking_Error
Debugger stops on: implicit
Debugger doesn't stop on: unlisted exceptions
Example 5
The command:
Show (Libraries);
lists the names of the currently registered libraries and their library
units.
If the Addresses option flag is enabled, the Show (Libraries) command
displays more specific information about the current libraries:
Show (Libraries);
Libraries in use by this program:
Library: TEST_LIBRARY
Main Unit: M1
Library Units:
package TEXT_IO
procedure TEST
procedure MAIN
Example 6
The command:
Show (Traces);
lists the information regarding the currently enabled tracing conditions.
For example:
Trace (TRUE, STATEMENT, "all", "");
Statement tracing has been enabled for all locations in all tasks.
Trace (TRUE, CALL, "%1cf8e1", "");
Call tracing has been enabled for all locations in
task A, #1CF8E1.
Show (Traces);
Tasks which are tracing calls:
#1CF8E1: at all locations
Tasks which are tracing statements:
all: at all locations
No tasks are tracing exceptions.
Example 7
This example displays a list of current history being recorded:
Take_History (TRUE, CALL, "all", "");
Call history-taking has been enabled for all locations in all tasks.
Take_History (TRUE, STATEMENT, "all", "");
Statement history-taking has been enabled for all locations in all
tasks.
Take_History (TRUE, EXCEPTION_RAISED, "all", "");
Exception history-taking has been enabled for all locations in all
tasks.
Show (Histories);
History of Calls is being recorded for:
all tasks at all locations
History of Statements is being recorded for:
all tasks at all locations
History of Exceptions is being recorded for:
all tasks at all locations
Example 8
This example displays a list of currently active stop and hold requests,
including specific entries for tasks exempt from global stop and hold
requests:
Hold ("all");
Each task will stop by its next statement.
Release ("%1cf8e1");
Fine.
Stop ("%1cf8e1");
Task #1CF8E1 will stop by its next statement.
Show (STOPS_AND_HOLDS);
Stops and Holds:
All tasks: Hold
#1CF8E1 Stop; exempt from hold all
Example 9
The following example lists the names of tasks currently executing with
stepping operations:
Show (Steps);
Task #1CF8E1 stepping statements.
REFERENCES
procedure Break
procedure Catch
procedure Context
procedure Enable
procedure Flag
procedure Forget
procedure Hold
procedure Propagate
procedure Run
procedure Set_Value
type State_Type
procedure Stop
procedure Trace
procedure Debug_Tools.Register
@node !Commands.Debug.Source
procedure Source (Location : Path_Name := ""
Stack_Frame : Integer := 0);
DESCRIPTION
Displays the program source for the specified location in an Environment
window.
By default, this command displays the location in the program source
specified by the current selection, if one exists, or the next statement in
the last stopped task.
The form of the source displayed depends on the type of object referenced
by the Location parameter. The following list includes the specific objects
and the corresponding sources:
Source Types
---------------------------------------
| | |
|Object |Source Displayed |
---------------------------------------
| | |
|Frame |Displays the subprogram |
|numbers |executing in that stack frame.|
---------------------------------------
| | |
|Task |Displays the task declaration.|
|names | |
---------------------------------------
| | |
|Declara-|Displays the unit containing |
|tions |the declaration, with the |
| |declaration highlighted. |
---------------------------------------
| | |
|State- |Displays the unit containing |
|ments |the statement, with the |
| |statement highlighted. |
---------------------------------------
| | |
|Library |Displays the library unit. |
|unit | |
---------------------------------------
For other objects, this command displays the object or its type.
PARAMETERS
Location : Path_Name := "";
Specifies the location to be displayed. A location can be an Ada program
unit (a package, task, or subprogram), a frame reference, a statement, or
a declaration. By default, the value of Location is the selected statement
or declaration, but selections apply only if the value of Stack_Frame
is 0.
The value of Location can be an absolute pathname, a relative pathname, or
a special name that resolves to a designated location. The values of the
Location parameter and the Stack_Frame parameter together designate the
actual location for which the Source procedure displays the program
source. These values define which parameter has precedence in determining
the location, as shown in the following table:
Interaction of Location and Stack_Frame Parameters
------------------------------------
| | | |
| |Parameter |Parameter |
|If Location |Used |Used |
|Is: |If |If |
| |Stack_Frame|Stack_Frame|
| |= 0: |/= 0: |
------------------------------------
| | | |
|An absolute |Location |Location |
|pathname | | |
------------------------------------
| | | 1 |
|A relative |Location |Both |
|pathname | | |
------------------------------------
| | | |
|A special |Location |Stack2 |
|name | |Frame |
------------------------------------
1 If Location is a relative pathname and Stack_Frame is nonzero, Source
uses both parameters to designate a location. The pathname is
prepended with _n., where n is the value of Stack_Frame. For example,
if the value of Stack_Frame is 3 and the value of Location is
"Commands.Filch", the pathname used is "_3.Commands.Filch".
2 If Location is a special name and Stack_Frame is nonzero, then
Stack_Frame overrides Location and Source displays the source for the
frame specified by Stack_Frame.
If the value of the Location parameter is the null string ("") or if the
value is a special name that cannot be resolved, the parameter designates
the location at which the last task stopped.
See Chapter 2, "Referencing Objects in the Debugger," and the Path_Name
subtype for more information on designating locations.
Stack_Frame : Integer := 0;
Specifies the frame to be displayed. By default, this parameter is ignored.
Thus, this parameter is used only if it is nonzero and if the value of
Location is a relative pathname or a special name. See the Location
parameter for details.
The value of Stack_Frame can be specified with a numeric argument key if
this command is entered with a key combination.
REFERENCES
procedure Display
@node !Commands.Debug.Stack
procedure Stack (For_Task : Task_Name := "";
Start : Integer := 0;
Count : Natural := 0);
DESCRIPTION
Displays the specified frames of the stack for the named task.
By default, the Stack procedure displays the first ten stack frames of the
last task to stop in the debugger.
If the specified task is running, the Stack commands temporarily stops the
task before displaying its stack. The task immediately resumes after Stack
completes the display. Since execution stacks are dynamic (that is, they
can change at any time), the information displayed by Stack may not
necessarily be accurate after the display completes. Stopping a task
freezes its frame stack so that the execution status of that task is
static. See the Stop command for more details about stopping tasks.
If the Addresses option flag is enabled, the Stack command includes the
program counter (segment and offset), stack-frame pointer value, outer
frame pointer (the pointer to the declarative context for the subprogram),
and the lexical level of the subprogram in the display for each frame. See
the Option type for more details regarding this option flag.
The Qualify_Stack_Names option flag forces full qualification of all Ada
names displayed by the Stack command. See the Option type for more details
regarding this option flag.
PARAMETERS
For_Task : Task_Name := "";
Specifies the name of the task whose stack is displayed. The default value
is the stack of the task specified by the current control context. If the
current control context does not resolve to a task name, For_Task specifies
the last stopped task.
Start : Integer := 0;
Specifies the starting frame for the display. The default value of 0 sets
Start to the value of the Stack_Start numeric flag, the default value of
which is 1.
The Stack command identifies frames sequentially from the first frame in the
stack for the current subprogram (the most recently called subprogram)
starting with 1. Negative values identify frames in reverse order from the
last frame. For example, a Start value of 1 specifies the first frame in the
stack and a value of -1 specifies the last frame.
Count : Natural := 0;
Specifies the number of frames displayed. The default value of 0 sets Count
to the value of the Stack_Count numeric flag, the default value of which
is 10.
ERRORS
The task name may be invalid.
The specified stack frames may not exist in the current task's stack.
EXAMPLES
Assume that the following program is being debugged and has stopped in the
breakpoint generated by the call to Debug_Tools.Break in procedure A:
with Debug_Tools;
procedure Nested_Calls is
procedure A is
begin
Debug_Tools.Break ("stopped in a");
end A;
procedure B is
begin
A;
end B;
procedure C is
begin
B;
end C;
procedure D is
begin
C;
end D;
begin
D;
end Nested_Calls;
Entering the Stack command with the default values displays the following
stack information in the debugger window:
Stack ("%ROOT_TASK", 0, 0);
Stack of task ROOT_TASK, #340E0:
_1: A.1s
_2: B.1s
_3: C.1s
_4: D.1s
_5: NESTED_CALLS.1s
_6: command_procedure.1s
_7: command_procedure [library elaboration block]
The first line contains the name of the task for this stack. In this case,
the task is the root task of the main program, with a string name of
Root_Task and the task number #340E0.
The subsequent lines display the frames of the stack for the task. Each
frame is prefixed with its number (for example, _1:) and contains the
location in the source program corresponding to that frame. The top frame,
frame 1, is the most recent frame. Earlier frames have higher numbers. In
this case, the bottom frame, number 7, is the code that elaborated the
command that called the Nested_Calls program.
If the Qualify_Stack_Names option flag is enabled (with the Enable
command), the stack frames will be displayed with the full pathnames for
their source locations. For example:
Enable (QUALIFY_STACK_NAMES, TRUE);
The QUALIFY_STACK_NAMES flag has been set to TRUE.
Stack ("%ROOT_TASK", 0, 0);
Stack of task ROOT_TASK, #340E0:
_1: .NESTED_CALLS.A.1s
_2: .NESTED_CALLS.B.1s
_3: .NESTED_CALLS.C.1s
_4: .NESTED_CALLS.D.1s
_5: .NESTED_CALLS.1s
_6: .command_procedure.1s
_7: .command_procedure [library elaboration block]
REFERENCES
type Numeric
type Option
@node !Commands.Debug.State_Type
type State_Type is (All_State, Breakpoints, Contexts, Exceptions,
Flags, Histories, Libraries, Special_Types,
Steps, Stops_And_Holds, Traces, Active_Items,
Exception_Cache, Inner_State, Statistics);
DESCRIPTION
Defines enumeration values for state information categories used by various
debugger commands (for example, the Show command).
ENUMERATIONS
All_State
Specifies inclusively the range of enumeration values from Breakpoints
through Stops_And_Holds.
Breakpoints
Specifies all active and inactive breakpoints.
Contexts
Specifies all control and evaluation contexts.
Exceptions
Specifies all exception requests (those issued by the Catch and Propagate
commands).
Flags
Specifies all flag values in the debugger, including Option and Numeric
flags and the flags set with the Flag command.
Histories
Specifies the history requests currently active.
Libraries
Specifies all active libraries.
Special_Types
Specifies the current set of registered special displays. See the
Debug_Tools.Register command for more information on special displays.
Steps
Specifies all currently stepping tasks.
Stops_And_Holds
Specifies all current stop and hold requests.
Traces
Specifies all tasks currently being traced.
Active_Items
For the use of Rational technical representatives only.
Exception_Cache
For the use of Rational technical representatives only.
Inner_State
For the use of Rational technical representatives only.
Statistics
For the use of Rational technical representatives only.
REFERENCES
procedure Show
procedure Debug_Tools.Register
@node !Commands.Debug.Stop
procedure Stop (Name : Task_Name := "");
DESCRIPTION
Stops execution of the specified task.
The specified task stops at the beginning of the next statement. This
command allows rendezvous and complex statements to complete before the
stop takes effect. Stop displays a status message for each task when it
stops.
If the Freeze_Tasks option flag is enabled, the debugger attempts to stop
all other tasks when any one task is stopped. The other tasks may not
actually stop because they may be in rendezvous with the stopped task,
waiting for an entry call, or otherwise blocked.
When a Stop command stops all tasks (for example, Stop ("All")), it also
applies to tasks initiated after the original Stop command was issued. For
example, individual tasks may resume execution because of specific
Execute commands, but new tasks created by those tasks would be stopped by
the overall Stop command.
PARAMETERS
Name : Task_Name := "";
Specifies the task to be stopped. The default value is the null string,
which defaults to the task specified by the current control context. If the
control context is not set, the default is all tasks.
The reserved name "All" specifies all tasks.
RESTRICTIONS
The specified task must exist.
EXAMPLES
The following example describes the sequence of events that occurs after a
Stop command is given when debugging a multitasking program:
Each task will stop by its next statement.
Stop: .PRODUCER_CONSUMER.CONSUMER.4S [Task : CONSUMER, #2F8D4].
Stop: .PRODUCER_CONSUMER.PRODUCER.4S [Task : PRODUCER, #2F4D4].
Stop: .PRODUCER_CONSUMER.QUEUE.7S [Task : QUEUE, #2F0D4].
The first line appears immediately after the Stop command is given. Then
each task stops one by one. There may be some delay, because each task
must complete its current statement or declaration before being stopped
by the debugger. If there are delay statements, rendezvous, or complex
statements, the task may require some time before being stopped.
REFERENCES
procedure Execute
procedure Hold
procedure Release
procedure Run
procedure Task_Display
@node !Commands.Debug.Stop_Event
type Stop_Event is (About_To_Return, Begin_Rendezvous,
End_Rendezvous, Local_Statement,
Machine_Instruction, Procedure_Entry,
Returned, Statement);
DESCRIPTION
Defines the events used to specify the stopping condition for a task
(specifically for the Run command).
Note: Some of the enumerations are not currently implemented; if used, an
error message is generated and the command is not executed.
ENUMERATIONS
About_To_Return
Specifies that the task is about to return from a subprogram. This
enumeration value specifies either a return statement or the end of a
subprogram. This enumeration not currently implemented.
Begin_Rendezvous
Specifies that the task is starting to rendezvous with another task. This
enumeration value applies only to the accepting task. Entry calls do not
cause tasks that are stepping to break until a rendezvous begins. This
enumeration not currently implemented.
End_Rendezvous
Specifies that the task is about to complete a rendezvous with another
task. This enumeration value applies only to the accepting task and occurs
after the last rendezvous statement executes. This enumeration not
currently implemented.
Local_Statement
Specifies that the task completed execution of the current statement.
Local_Statement treats subprograms called from the current statement as
part of that statement.
Machine_Instruction
Specifies that the task has completed execution of the current machine
instruction.
Procedure_Entry
Specifies that the task has entered a subprogram. The task stops before
elaboration of the first declaration or before execution of the first
statement if the subprogram does not include declarations. This
enumeration not currently implemented for certain cross-debuggers.
Returned
Specifies that the task has just returned from the current subprogram. Many
levels of returns may occur if a number of subprograms execute their last
statements simultaneously.
Statement
Specifies that the task has reached the beginning of the next statement. If
the current statement calls a subprogram, the task stops at the first
declaration or statement of the called subprogram.
@node !Commands.Debug.Take_History
procedure Take_History
(On : Boolean := True;
Event : Trace_Event := Debug.All_Events;
For_Task : Task_Name := "";
At_Location : Path_Name := "<SELECTION>";
Stack_Frame : Integer := 0);
DESCRIPTION
Enables or disables history recording for a specified task.
By default, this command initiates history recording for all events
occurring in all tasks in the selected location.
By using the parameters of Take_History to limit event entries, a history
request can be exclusive to individual tasks, locations, or types of
events. Although more than one history request can be active at any time,
all history entries are saved in one history buffer.
The history buffer is a circular buffer. That is, events selected by the
Take_History command are recorded by the debugger in the history buffer;
when the buffer becomes full, the oldest events are overwritten by new
events. See the "Restrictions" section, below, for the maximum number of
history entries.
The History_Display command displays selections of event entries from the
debugger history. See the History_Display procedure for more details.
The Trace command displays events of the current job in the debugger
window as they occur. See the Trace procedure for more details.
Note: The recording of history events reduces execution speed but is
significantly faster than tracing the same events.
PARAMETERS
On : Boolean := True;
Specifies whether to enable or disable history recording. The default value
is True (enabled).
Event : Trace_Event := Debug.All_Events;
Specifies the type of information to be recorded. By default, all events,
except the execution of machine instructions, are recorded. See the
Trace_Event type for more details.
For_Task : Task_Name := "";
Specifies the task for history recording. The default is the task specified
by the control context or, if the control context does not resolve to a
specific task, all tasks.
At_Location : Path_Name := "<SELECTION>";
Specifies a location to which history recording is restricted. At_Location
must specify a subprogram, statement, or all locations. By default, the
value of At_Location is the selected statement or declaration, but
selections apply only if the value of Stack_Frame is 0.
The value of At_Location can be an absolute pathname, a relative pathname,
or a special name that resolves to a designated location. The values of
the At_Location parameter and the Stack_Frame parameter together designate
the actual location to which history recording is limited. These values
define which parameter has precedence in determining the location, as
shown in the following table:
Interaction of At_Location and Stack_Frame Parameters
------------------------------------
| | | |
| |Parameter |Parameter |
|If |Used |Used |
|At_Location |If |If |
|Is: |Stack_Frame|Stack_Frame|
| |= 0: |/= 0: |
------------------------------------
| | | |
|An absolute |At_Location|At_Location|
|pathname | | |
------------------------------------
| | | 1 |
|A relative |At_Location|Both |
|pathname | | |
------------------------------------
| | | |
|A special |At_Location|Stack2 |
|name | |Frame |
------------------------------------
1 If At_Location is a relative pathname and Stack_Frame is nonzero,
Take_History uses both parameters to designate a location. The pathname
is prepended with _n., where n is the value of Stack_Frame. For
example, if the value of Stack_Frame is 3 and the value of
At_Location is "Commands.Filch", the pathname used is "_3.Commands.Filch".
2 If At_Location is a special name and Stack_Frame is nonzero, then
Stack_Frame overrides Location and Take_History limits recording to the
subprogram specified by Stack_Frame.
If the value of the At_Location parameter is the null string (""), the
parameter designates all locations. Also, if the value is a special name
that cannot be resolved, the parameter designates all locations.
See Chapter 2, "Referencing Objects in the Debugger," and the Path_Name
subtype for more information on designating locations.
Stack_Frame : Integer := 0;
Specifies the frame for which history is collected. By default, this
parameter is ignored. Thus, this parameter is used only if it is nonzero
and if the value of At_Location is a relative pathname or a special name.
See the At_Location parameter for details.
RESTRICTIONS
The debugger allows a maximum of 20 histories to be recorded
simultaneously.
The debugger keeps only the most recent 1,000 entries recorded for a
history.
EXAMPLES
With a selection that resolves to the location
".GENERAL.NATIVE.LOOP_BASE.9S", the command:
Take_History (True, Debug.All_Events, "", "<SELECTION>", 0);
produces the following output:
Take_History (TRUE, ALL_EVENTS, "all", ".GENERAL.NATIVE.LOOP_BASE.9S");
Call history-taking has been enabled for .GENERAL.NATIVE.LOOP_BASE.9S in
all tasks.
Exception history-taking has been enabled for
.GENERAL.NATIVE.LOOP_BASE.9S in all tasks.
Statement history-taking has been enabled for
.GENERAL.NATIVE.LOOP_BASE.9S in all tasks.
indicating that history taking has been enabled for the specified source
location in all tasks for all events except machine-instruction execution.
REFERENCES
procedure History_Display
procedure Trace
type Trace_Event
@node !Commands.Debug.Task_Category
type Task_Category is (All_Tasks, Blocked, Held, Not_Running,
Running, Stopped);
DESCRIPTION
Defines the set of tasks that can be displayed by various debugger commands
(for example, the Task_Display command).
This type defines subsets of all tasks in the current debugger job. The
Task_Display command displays information regarding these subsets.
ENUMERATIONS
All_Tasks
Specifies all tasks created within the job being debugged.
Blocked
Specifies all tasks currently blocked by external conditions (for example,
a rendezvous or delay), but not including tasks held or stopped by the
debugger.
Held
Specifies all tasks that are currently held by the debugger (tasks are held
by the Hold command).
Not_Running
Specifies all tasks not currently executing, including blocked, held, and
stopped tasks, and tasks executing delay statements.
Running
Specifies all tasks currently executing. This does not include tasks
executing delay statements, waiting for rendezvous, or stopped in the
debugger by breakpoints, exceptions, or similar events.
Stopped
Specifies all tasks currently stopped in the debugger. This includes tasks
held by the Hold command.
@node !Commands.Debug.Task_Display
procedure Task_Display
(For_Task : Task_Name := "";
Task_Set : Task_Category := Debug.All_Tasks);
DESCRIPTION
Displays information about the named task or set of tasks.
The Task_Display procedure lists the number, Ada name, priority, and
current state for the specified task. The command lists task synonyms (if
any have been assigned) and the current location of a task if it is
stopped. The state information listed for the task indicates whether the
task is running, is being stopped, or is stopped. If the task is running,
Task_Display shows its execution state. If it is stopped, Task_Display
indicates the reason it is stopped.
Note: The For_Task parameter overrides the Task_Set parameter, unless
For_Task specifies all tasks. See the "Parameters" section, below.
The Task_Display command does not list terminated tasks.
The following table lists the execution state message, state name, and
description for running tasks. (Task_Display does not actually show state
names for tasks.) These state names are valid only for the R1000 target.
Task-State Display Information
---------------------------------------------------------------
| | | |
|State Message |State Name |Description |
---------------------------------------------------------------
| | | |
|[No state message |Unblocked |The task is ready to |
|displayed] | |execute or is currently |
| | |executing. |
| | |Higher-priority tasks may|
| | |prevent the task from |
| | |running, but there is no |
| | |condition associated with|
| | |the task to keep it from |
| | |running. |
---------------------------------------------------------------
| | | |
|aborting task |Aborting_Module |The module is aborting a |
| | |task it has declared. |
---------------------------------------------------------------
| | | |
|activating child |Activating_ |The module is waiting for|
|packages |Module |child packages to become |
| | |elaborated. |
---------------------------------------------------------------
| | | |
|activating child |Activating_Tasks|The module is activating |
|tasks | |its child tasks. |
---------------------------------------------------------------
| | | |
|attempting entry |Attempting_Entry|The task is waiting for |
|call | |an accept on an entry |
| | |call to another task. |
---------------------------------------------------------------
| | | |
|being aborted |Blocking_In_ |The task is making |
| |Abort |another task abnormal |
| | |(see the Reference Manual|
| | |for the Ada Programming |
| | |Language, Section 9.10). |
---------------------------------------------------------------
| | | |
|delaying in wait |Delaying_In_ |The task is blocked in an|
|service |Wait_Service |Environment service with |
| | |a maximum wait time. |
---------------------------------------------------------------
| | | |
|in wait service |In_Wait_Service |The task is blocked in an|
| | |Environment service. |
---------------------------------------------------------------
| | | |
|package completed |In_Fs_Rendezvous|The task is waiting for |
| | |its parent to terminate |
| | |it after normal |
| | |completion of the task. |
---------------------------------------------------------------
| | | |
|terminated |Terminated |The task is terminated. |
---------------------------------------------------------------
| | | |
|waiting at accept |Blocking_On_ |The task is blocked at an|
|for entry call |Accept |accept statement, waiting|
| | |for an entry call. |
---------------------------------------------------------------
| | | |
|waiting at entry for|Blocking_On_ |The task is waiting for |
|accept |Entry |an entry call to be |
| | |accepted. |
---------------------------------------------------------------
| | | |
|waiting at select |Blocking_On_ |The task is blocked at a |
|for entry call |Select |select statement, waiting|
| | |for an entry call. |
---------------------------------------------------------------
| | | |
|waiting at |Delaying_On_ |The task is blocked in a |
|select-delay for |Select |select with a delay |
|entry call | |alternative, waiting for |
| | |an entry call. |
---------------------------------------------------------------
| | | |
|waiting at select- |Awaiting_ |The task is executing at |
|terminate for entry |Children_In_ |a select, with a ter- |
|call with dependents|Select |minate alternative, and |
| | |has dependent tasks that |
| | |cannot be terminated. |
---------------------------------------------------------------
| | | |
|waiting at select- |Terminable_In_ |The task is blocked in a |
|terminate for entry |Select |select, with a terminate |
|call | |alternative, waiting for |
| | |an entry call and can |
| | |terminate. |
---------------------------------------------------------------
| | | |
|waiting at timed |Delaying_On_ |The task is blocked at a |
|entry for accept |Entry |timed entry call waiting |
| | |for the called task to |
| | |accept the call. |
---------------------------------------------------------------
| | | |
|waiting for child |Declaring_Module|The module is declaring a|
|elaboration | |task or package. |
---------------------------------------------------------------
| | | |
|waiting for children|Awaiting_ |The task is waiting for |
| |Children |its child tasks to |
| | |terminate. |
---------------------------------------------------------------
| | | |
|waiting for delay |Delaying |The task is blocked at a |
| | |delay statement. |
---------------------------------------------------------------
| | | |
|waiting for parent |Awaiting_ |The module is waiting for|
|elaboration |Activation |a package or task it has |
| | |declared to become |
| | |activated. |
---------------------------------------------------------------
| | | |
|waiting for task |Awaiting_Task_ |The module is waiting for|
|activation |Activation |confirmation from child |
| | |tasks it has declared to |
| | |become activated. |
---------------------------------------------------------------
Note: State names are used by internal system utilities not included in
package Debug. See Operator.Internal_System_Diagnosis in the System
Management Utilities (SMU) book for more details.
PARAMETERS
For_Task : Task_Name := "";
Specifies the task for which this command displays information. The default
is the control-context task or, if the control context does not resolve to
a task name, all tasks.
The reserved name "All" specifies all tasks, unless the Task_Set parameter
specifies a task subset. Task_Set overrides For_Task if the latter specifies
all tasks.
Task_Set : Task_Category := Debug.All_Tasks;
Specifies a subset of tasks for which this command displays information.
The default value specifies all tasks. This parameter is ignored if the
For_Task parameter identifies a specific task.
ERRORS
The named task does not exist.
EXAMPLES
The following example illustrates the information listed by the
Task_Display procedure:
Job: 212, Root task: #2DCD4
ROOT_TASK, #2DCD4 (Root task): Running, waiting for children. [Pri = 1]
QUEUE, #2F0D4 (.PRODUCER_CONSUMER.QUEUE): Stop at .PRODUCER_CONSUMER.
QUEUE.7S. [Pri = 1]
PRODUCER, #2F4D4 (.PRODUCER_CONSUMER.PRODUCER): Stop at
.PRODUCER_CONSUMER.PRODUCER.4S. [Pri = 1]
CONSUMER, #2F8D4 (.PRODUCER_CONSUMER.CONSUMER): Stop at
.PRODUCER_CONSUMER.PRODUCER.4S. [Pri = 1]
The first line indicates the job number of the program being debugged and
the root task number of the job. The root task is the initial task created
for the current job being debugged.
Each entry includes the task name (if one is assigned to the task), the
task number, and the Ada name of the task in parentheses. Here, task
#2F0D4 is declared as task Queue within program unit Producer_Consumer.
Task #2DCD4 is the root task and has no Ada task declaration.
Task Queue is stopped at statement 7. Task #2DCD4 is currently not
stopped, but it is not ready to run because it is waiting for one or
more child tasks to be terminated.
@node !Commands.Debug.Task_Name
subtype Task_Name is String;
DESCRIPTION
Defines the name format for task names.
Debugger commands require a specific task name when identifying tasks. Task
names can take either of two forms: a hexadecimal number assigned by the
Environment or a user-defined string. Every task is assigned a
hexadecimal number when it is created.
Tasks can be assigned a string synonym in addition to their number. The
Set_Task_Name command can be used to assign unique task synonyms to
tasks. See the Set_Task_Name procedure for more details.
The Task_Display command lists all tasks with their number and Ada name.
Note: Task synonyms were formerly documented as task nicknames.
RESTRICTIONS
Task synonyms must be prefixed with the percent symbol (%). This character
identifies the name as a task synonym.
REFERENCES
procedure Break
procedure Execute
procedure Hold
procedure Run
procedure Set_Task_Name
procedure Stack
procedure Stop
procedure Task_Display
procedure Trace
procedure Debug_Tools.Set_Task_Name
@node !Commands.Debug.Trace
procedure Trace (On : Boolean := True;
Event : Trace_Event := Debug.All_Events;
In_Task : Task_Name := "";
At_Location : Path_Name := "<SELECTION>";
Stack_Frame : Integer := 0);
DESCRIPTION
Enables or disables tracing for a specified task.
By default, this command initiates tracing of all events occurring in all
tasks in the selected location.
The Trace procedure creates a trace request with the restrictions defined
in the parameters of the command. For each event that matches the
parameters of a trace request, the debugger displays a message in the
debugger window. These events include statements, declarations, calls,
rendezvous, and exceptions. Trace output can also be directed to a file
using the Trace_To_File command. The order in which events occur and the
debugger displays messages regarding them differs depending on the type of
event. The following list details the specific order for each event:
* Statement trace messages are displayed before the statement is
executed.
* Call trace messages are displayed before the first declaration or
statement of the subprogram is executed.
* Rendezvous trace messages are displayed before the first statement of
the rendezvous is executed.
* Exception trace messages are displayed immediately after the exception
is raised but before any stack frames are popped and before the handler
code is executed.
The debugger allows multiple simultaneous trace requests. This permits
tracing of more than one subprogram.
The Trace command does not maintain a buffer of history entries as the
Take_History command does. In a history, selected sets of messages can
be displayed, such as messages only from a specific task or for some range
of messages. See the Take_History and History_Display commands for more
information on histories.
Note: Tracing reduces execution speed.
PARAMETERS
On : Boolean := True;
Specifies whether to enable or disable the trace. By default, the trace is
enabled.
Event : Trace_Event := Debug.All_Events;
Specifies the class of execution events to be traced. The default is all
events.
In_Task : Task_Name := "";
Specifies the task to be traced. The default value is the null string ("").
Trace requests apply only to a specific task or to all tasks. If the value
is nonnull, In_Task designates the specified task. If the value is null,
In_Task designates no specific task and Trace chooses a default task based
on the control context:
* If the control context is set, the trace request is limited to the task
in the control context.
* If the control context is not set, the trace request applies to all
tasks.
At_Location : Path_Name := "<SELECTION>";
Specifies a location to which tracing is restricted. At_Location must
specify a subprogram, statement, or all locations. By default, the value
of At_Location is the selected statement or declaration, but selections
apply only if the value of Stack_Frame is 0.
The value of At_Location can be an absolute pathname, a relative pathname,
or a special name that resolves to a designated location. The values of
the At_Location parameter and the Stack_Frame parameter together designate
the actual location to which tracing is limited. These values define which
parameter has precedence in determining the location, as shown in the
following table:
Interaction of At_Location and Stack_Frame Parameters
------------------------------------
| | | |
| |Parameter |Parameter |
|If |Used |Used |
|At_Location |If |If |
|Is: |Stack_Frame|Stack_Frame|
| |= 0: |/= 0: |
------------------------------------
| | | |
|An absolute |At_Location|At_Location|
|pathname | | |
------------------------------------
| | | 1 |
|A relative |At_Location|Both |
|pathname | | |
------------------------------------
| | | |
|A special |At_Location|Stack2 |
|name | |Frame |
------------------------------------
1 If At_Location is a relative pathname and Stack_Frame is nonzero, Trace
uses both parameters to designate a location. The pathname is
prepended with _n., where n is the value of Stack_Frame. For example, if
the value of Stack_Frame is 3 and the value of At_Location is
"Commands.Filch", the pathname used is "_3.Commands.Filch".
2 If At_Location is a special name and Stack_Frame is nonzero, then
Stack_Frame overrides Location and Trace limits tracing to the
subprogram specified by Stack_Frame.
If the value of the At_Location parameter is the null string (""), the
parameter designates all locations. Also, if the value is a special name
that cannot be resolved, the parameter designates all locations.
See Chapter 2, "Referencing Objects in the Debugger," and the Path_Name
subtype for more information on designating locations.
Stack_Frame : Integer := 0;
Specifies the frame for which tracing is initiated. By default, this
parameter is ignored. Thus, this parameter is used only if it is
nonzero and if the value of At_Location is a relative pathname or a
special name. See the At_Location parameter for details.
The value of Stack_Frame can be specified with a numeric argument key if
this command is entered with a key combination.
RESTRICTIONS
The debugger allows a maximum of 20 simultaneous traces.
Tracing can be disabled only for a location in which it was enabled. The
disabling of tracing at a specific location cannot be used to achieve the
effect of tracing everywhere but in a specific location.
EXAMPLES
If the commands:
Trace (True, Statement, "%432E");
Trace (True, Call, "%542E");
Trace (True, Exception_Raised);
are issued, the sample trace messages would be:
Statement trace at !USERS.DRK.TEST_JOB.4s [Task : #432E].
Statement trace at !USERS.DRK.TEST_JOB.5s [Task : #432E].
Call trace at !USERS.DRK.READY [Task : #542E].
Call trace at !USERS.DRK.READY.SET [Task : #542E].
Call trace at !USERS.DRK.READY.GO [Task : #542E].
Call trace at !USERS.DRK.READY.GO.START [Task : #542E].
Call trace at !USERS.DRK.WAIT [Task : #542E].
Call trace at !USERS.DRK.POSTMORTEM [Task : #542E].
Exception trace at !USERS.DRK.INTERCEPT.7s [Task : #542E].
Exception was !USERS.DRK.OUT_OF_RANGE.
Each trace message identifies the type of trace, the current location of
the executing task, and the task name. Exception messages also name the
exception raised.
REFERENCES
procedure History_Display
procedure Take_History
type Trace_Event
procedure Trace_To_File
@node !Commands.Debug.Trace_Event
type Trace_Event is (All_Events, Call, Exception_Raised,
Machine_Instruction, Propagate_Exception,
Rendezvous, Statement);
DESCRIPTION
Defines the set of events that can be traced by debugger commands
(specifically the Trace and Take_History commands).
ENUMERATIONS
All_Events
Specifies calls, statements, and exceptions.
Call
Specifies subprogram calls.
Exception_Raised
Specifies points where exceptions are raised.
Machine_Instruction
Specifies execution of machine instructions.
Propagate_Exception
Not yet implemented.
Rendezvous
Not yet implemented.
Statement
Specifies all statements.
@node !Commands.Debug.Trace_To_File
procedure Trace_To_File (File_Name : String := ">> FILE NAME <<");
DESCRIPTION
Directs trace output to the file specified by the File_Name parameter.
Note: There is no default filename for this command.
The Trace_To_File procedure closes the current output file for tracing.
This command only designates an output file for trace requests; it does not
affect the application or interaction of trace requests.
If the File_Name parameter is null, this command redirects subsequent
output to the debugger window. If tracing output is currently directed
into a designated output file, the Trace_To_File ("") command redirects
tracing output to the debugger window and closes that output file.
PARAMETERS
File_Name : String := ">> FILE NAME <<";
Specifies the file to which commands send tracing output. The default
parameter placeholder must be replaced with a legal filename or the null
string (""). The null string resolves to the debugger window.
@node !Commands.Debug.Xecute
procedure Xecute (Name : Task_Name := "");
DESCRIPTION
This command is the functional equivalent of the Execute command. They can
be used interchangeably. See the Execute procedure.
REFERENCES
procedure Execute
@node !Commands.Debug_Maintenance
Package !Commands.Debug_Maintenance contains two procedures provided by
the Rational Environment debugger for interactive use.
For the specific types and subtypes and additional procedures available for
interactive use, see package !Commands.Debug.
To use the facilities of the debugger from a program, see package
!Tools.Debug_Tools.
Note: These reference entries define the functionality of the package
Debug_Maintenance commands for the R1000 native debugger. However, this
documentation also can be used for reference with debuggers included in
Rational's cross-development facilities. Examples used in these reference
entries apply to the R1000 debugger, but they also can be used with CDF
debuggers in most cases.
@node !Commands.Debug_Maintenance.Show_Version
procedure Show_Version;
DESCRIPTION
Displays the version of the current debugger.
EXAMPLES
The following is an example of a version display:
====================================
== Load Time Version Information ==
====================================
MACHINE => ARIADNE - Debugger Development (468255)
USER => PEG.S_1
DATE => June 3, 1992 at 10:10:25 AM
VERSION => 11.1.6.3
ACTIVITY => !DEB.CLI.R1000_ACTIVITY
Subsystem Spec_View Load_View Context
============= =============== ================ =======
DEBUG_SUPPORT NATIVE11_0_SPEC NATIVE_WORKING !DEB
HOST NATIVE10_1_SPEC NATIVE_WORKING !DEB
TARGET NATIVE11_0_SPEC NATIVE_WORKING !DEB
TEST_SUPPORT NATIVE10_SPEC NATIVE10_RELEASE !DEB
VERSION REV2_SPEC REV2_0 !CC
This display includes:
* Machine: Name of Rational machine on which the debugger was built
* User: Name of the user session under which the debugger was built
* Date: Date and time of the build
* Version: Version number for the current debugger
* Activity: A record of the actual activity used to build the debugger
* Subsystem, Spec_View, Load_View, and Context: Identification of the
specific subsystems used in this build
@node !Commands.Debug_Maintenance.Wait_For_Job
procedure Wait_For_Job;
DESCRIPTION
Causes the calling subprogram to wait while the debugger has the running
flag on.
This command is used in debugging scripts to control the flow in the
script. The command allows a script to wait for the current program to
stop before proceeding to the next step in the script.
If written as procedures, debugging scripts can be made part of a
permanent testing or regression-testing suite.
EXAMPLES
Assume that the following script is run from a command window while
debugging the Demo program. The script sets a breakpoint in the Factorial
subprogram, immediately after the local variable F has been set. Each
time the debugger stops at the breakpoint, the script displays the value
of F.
The Wait_for_Job command after each Debug.Execute command ensures that the
new value of F has been set before the script displays it.
with Debug;
with Debug_Maintenance;
procedure Example_Test_Script is
begin
Debug.Break
(".Demo.Factorial.3s"); -- Set break in Factorial
Debug.Execute; -- Run program in debugger
Debug_Maintenance.Wait_For_Job; -- Wait until debugger stops
Debug.Put ("F"); -- Display local variable
Debug.Execute; -- Allow program to continue
Debug_Maintenance.Wait_For_Job; -- Wait until debugger stops
Debug.Put ("F"); -- Display variable again
Debug.Execute; -- And so on ...
Debug_Maintenance.Wait_For_Job;
Debug.Put ("F");
end Example_Test_Script;
@node !Tools.Debug_Tools
Package !Tools.Debug_Tools provides procedures and functions through which
programs can use the facilities of the Rational Environment debugger.
For interactive debugger commands, see package !Commands.Debug and package
!Commands.Debug_Maintenance.
The procedures and functions of package Debug_Tools make interactive
debugging easier by:
* Performing tedious setup steps automatically, such as setting task
names
* Defining regions of code that do not need debugging or must run without
interference from the debugger
* Performing repetitive debugging steps automatically, such as displaying
a message or stack trace each time a particular place in the program is
reached
* Providing extra information, such as exception identification, beyond
that provided by the interactive debugger
* Providing special type displays of nonstandard data
* Supporting the creation of user-defined debugging commands
Note: The procedures and functions of Debug_Tools are executed when
called, whether or not the calling program is currently being debugged. If
time is critical in the application, use Debug_Tools sparingly or only in
nontime-critical locations.
RESOURCES IN PACKAGE DEBUG_TOOLS
The commands in package Debug_Tools fall into several functional groups.
This list includes all procedures, functions, and types in package
Debug_Tools.
Displaying program source locations: Ada_Location
Controlling debugging: Debug_Off, Debug_On, Debugging
Getting exception information: Get_Exception_Name,
Get_Raise_Location
Naming tasks: Get_Task_Name, Set_Task_Name
Annotating a debugging session: Message
Displaying data in special formats: Register, Register.Image, Register.T,
Un_Register, Un_Register.T
USING PACKAGE DEBUG_TOOLS WITH CROSS-DEBUGGERS
A version of package Debug_Tools is available with each Rational debugger.
However, the versions of package Debug_Tools included with Rational's
Cross-Development Facility (CDF) debuggers are substantially different
from the R1000 version documented here. This section summarizes the
similarities and differences.
The procedures and functions of Debug_Tools are always available to a
program, not only while it is running on the Rational Environment but also
after it has been downloaded to a final target where Environment resources
are not available. On the R1000, Debug_Tools is part of the Environment.
For CDF targets, any portion of Debug_Tools that a program uses is made
part of the program and downloaded with it.
All subprogram specifications, except for generic procedure Un_Register,
are the same on both R1000 and CDF versions of package Debug_Tools. This
allows code developed and tested in an R1000 view to be compiled in a
target-specific view with no code changes.
CDF versions of package Debug_Tools differ from the R1000 version in three
important ways:
* Space usage: Unlike the R1000 version of package Debug_Tools, which is
an integral part of the Rational Environment, CDF versions of
Debug_Tools are actually compiled and linked into the program being
debugged. As a result, any portion of Debug_Tools that a program uses
takes up space on the target machine. If space is critical on a CDF
target, consider not using Debug_Tools.
* Portability: In CDF versions of package Debug_Tools, generic procedure
Un_Register has one extra parameter. As a result, code that uses
procedure Un_Register must be modified when moved from an R1000 view to
a target-specific view. If portability is important, consider not using
this procedure.
* Effect: In CDF versions of package Debug_Tools, some subprograms may be
null stubs or may have nonstandard effects. For example, the
Ada_Location function cannot provide information on Ada source
locations on a target that does not have Ada source available; a CDF
version might return the local machine address instead.
The reference entries in this document define the functionality of the
tools in package Debug_Tools for the R1000 native debugger. This document
is also a general reference for CDF versions of the package. Examples used
in these reference entries apply to the R1000 debugger and, in most cases,
to the CDF debuggers.
See the debugger section of your CDF manual for details of specific CDF
implementations.
@node !Tools.Debug_Tools.Ada_Location
function Ada_Location (Frame_Number : Natural := 0;
Fully_Qualify : Boolean := True;
Machine_Info : Boolean := False)
return String;
DESCRIPTION
Returns the source location of a direct or indirect call to this function.
This function returns the source location of a call to this function or
the source location of any subprogram call that leads indirectly to a call
to this function. The level of the call in the calling stack is determined
by the value of the Frame_Number parameter.
The null string is returned if the frame specified by the Frame_Number
parameter does not exist.
This function can be used to provide call-stack traceback under control of
the application program. For traceback during interactive debugging, see
the Debug.Stack procedure.
PARAMETERS
Frame_Number : Natural := 0;
Specifies, when Frame_Number = 0, that the source location of the call to
Ada_Location be returned. Frame_Number = 1 specifies that the source
location of the call to the caller of Ada_Location be returned, and so on.
Fully_Qualify : Boolean := True;
Specifies whether to return the source location as a fully qualified
pathname. The default value is True.
When False, only the simple name of the subprogram that contains the
source location is returned.
Machine_Info : Boolean := False;
Specifies whether to include machine information in the string returned by
Ada_Location. The default value is False.
The machine information returned will be different for different targets.
return String;
Returns the Ada name of the specified source location. The name is returned
as a string. Setting the Fully_Qualify and Machine_Info parameters to True
increases the length of the string.
The string may contain blanks, but it will not contain control characters.
ERRORS
If no debugger is active for the session (either because no jobs have been
debugged since the user logged in or because the debugger has been
killed), Ada_Location returns the string Unknown - Debugger not started.
If Ada_Location references a frame for which no name is currently
available, it returns the string Unknown location.
EXAMPLES
Example 1
The statement:
Io.Put_Line (Debug_Tools.Ada_Location);
displays in an Environment output window the fully qualified source
location of the call to Ada_Location. For example, if this line were
executed in a library-level procedure Debug_Tools_Examples, the output
would be:
.DEBUG_TOOLS_EXAMPLES.2s
The same statement executed in subprogram Sub1 would display:
.DEBUG_TOOLS_EXAMPLES.SUB1.2s
Example 2
Sometimes it is useful to know not just the current source location but
also the execution path that led to this location. In interactive
debugging, the Debug.Stack command provides a traceback of the flow of
execution. Calling Ada_Location with the Frame_Number parameter greater
than zero provides a similar traceback under control of the running
program. For example, if these statements:
Io.Put_Line (Debug_Tools.Ada_Location);
Io.Put_Line (Debug_Tools.Ada_Location (Frame_Number => 1));
Io.Put_Line (Debug_Tools.Ada_Location (Frame_Number => 2));
are executed in procedure Sub2 of library procedure Debug_Tools_Examples,
the following is displayed in an Environment output window:
.DEBUG_TOOLS_EXAMPLES.SUB2.2s
.DEBUG_TOOLS_EXAMPLES.4s
.command_procedure.1s
The first line shows the source location of the call to Ada_Location. The
second line shows the location in Debug_Tools_Examples of this particular
call to Sub2. The third line shows that Debug_Tools_Examples was called
from a command procedure, in this case by executing it from a command
window.
Example 3
Display of execution flow is particularly helpful with library subprograms
and subprograms in library packages, either of which can be called from
many unrelated places in a system. If an error is detected in such a
subprogram, identifying the source of the call can be very difficult.
Ada_Location makes this easy. For example, assume a library package
More_Examples, which includes a visible subprogram Ada_Location_Example
(declared in the package specification) and a hidden subprogram Hidden
(declared only in the package body). If the same statements as in Example
2, above, are executed in the hidden procedure, and the visible procedure
is called from the example program, the following is displayed in the
Environment output window:
.MORE_EXAMPLES.HIDDEN.1s
.MORE_EXAMPLES.ADA_LOCATION_EXAMPLE.1s
.DEBUG_TOOLS_EXAMPLES.SUB3.2s
The first line shows the source location of the call to Ada_Location, which
in this case is in the hidden subprogram Hidden in package More_Examples.
The second line shows the location of the call to the hidden subprogram,
in this case in the visible subprogram Ada_Location_Example, in the same
package. The third line shows the location of the call to
Ada_Location_Example from outside the package, specifically in subprogram
Sub3 of program Debug_Tools_Examples.
Example 4
To display machine information, set the Machine_Info parameter to True:
Io.Put_Line (Debug_Tools.Ada_Location (Machine_Info => True));
The machine information shown will be different for different targets. On
the R1000, the following is displayed in an Environment output window:
.DEBUG_TOOLS_EXAMPLES.7s Pc = #7DD02, #39, Frame = #14F8BC, #18,
Lex = 2, Outer = #14FCBC, #0
In addition to the Ada source location, this version of the command
displays:
* Pc: Segment and offset
* Frame: Address of the current frame
* Lex: Static nesting depth of the procedure within which the object is
declared;
0 = import space, 1 = packages and tasks, 2+ = subprograms and blocks
* Outer: Address of the frame that corresponds to lex = 1
REFERENCES
procedure Debug.Stack
@node !Tools.Debug_Tools.Debug_Off
procedure Debug_Off;
DESCRIPTION
Disables debugging for the task calling this procedure.
Debug_Off disables all the structured execution features of the debugger,
including stepping, breaking, exception trapping, and so on. With
debugging disabled, the task executes normally, free from any interference
by the debugger.
The two procedures Debug_Off and Debug_On allow a program to define a
region in which the debugger will not interfere with program execution. To
define such a region, call procedure Debug_Off at the beginning of the
region to disable debugger interference, and then call procedure Debug_On
at the end of the region to resume debugger control. During execution in
this region, the task will run normally between Debug_Off and Debug_On,
without interference from the debugger or the debugger operator.
The debugger allows successive calls to Debug_Off and Debug_On so that
subprograms that do not require debugging can execute without
restrictions.
The initial debugging status of a task depends on the status of its parent
task at the time it was created. Debugging is initially disabled for all
child tasks created while debugging was disabled for the parent. Debugging
is initially enabled for all child tasks created while debugging was
enabled for the parent.
RESTRICTIONS
If this procedure is called from a job not currently being debugged, the
call is ignored and has no effect.
REFERENCES
procedure Debug_On
function Debugging
@node !Tools.Debug_Tools.Debug_On
procedure Debug_On;
DESCRIPTION
Enables debugging for the task calling this procedure.
Debug_On reenables debugging after it has been disabled with the Debug_Off
procedure. A task calling this procedure will subsequently execute with
all debugger-structured execution features enabled, including stepping,
breaking, exception trapping, and so on.
The two procedures Debug_Off and Debug_On allow a program to define a
region in which the debugger will not interfere with program execution. To
define such a region, call procedure Debug_Off at the beginning of the
region to disable debugger interference, and then call procedure Debug_On
at the end of the region to resume debugger control. During execution in
this region, the task will run normally between Debug_Off and Debug_On,
without interference from the debugger or the debugger operator.
The debugger allows successive calls to Debug_Off and Debug_On so that
subprograms that do not require debugging can execute without
restrictions.
The initial debugging status of a task depends on the status of its parent
task at the time it was created. Debugging is initially disabled for all
child tasks created while debugging was disabled for the parent. Debugging
is initially enabled for all child tasks created while debugging was
enabled for the parent.
Note: This procedure cannot initiate debugging from within a program that
was started without debugging enabled.
RESTRICTIONS
If this procedure is called from a job not currently being debugged, the
call is ignored and has no effect.
REFERENCES
procedure Debug_Off
function Debugging
@node !Tools.Debug_Tools.Debugging
function Debugging return Boolean;
DESCRIPTION
Returns a Boolean value indicating whether the currently executing program
is under control of the debugger, whether or not debugging is currently
enabled.
PARAMETERS
return Boolean;
Returns a Boolean value of True when the currently executing program is
under control of the debugger, whether or not debugging is currently
enabled; otherwise, the function returns False.
REFERENCES
procedure Debug_Off
procedure Debug_On
Editing Specific Types (EST), procedure Commands.Debug
@node !Tools.Debug_Tools.Get_Exception_Name
function Get_Exception_Name (Fully_Qualify : Boolean := True;
Machine_Info : Boolean := False)
return String;
DESCRIPTION
Returns the name of the exception most recently raised in the calling
task.
This function must be called directly or indirectly from an exception
handler. It returns the null string ("") if no exceptions are currently
active in the calling task.
If Machine_Info is enabled (True), the Get_Exception_Name function returns
both the machine representation of the most recently raised exception and
the machine address at which that exception was raised (the "raise
address"). You can then use this returned information in interactive
debugger commands. Invoking the Debug.Exception_To_Name command with the
exception's machine representation displays the name of the exception,
if the Ada units still exist and the exception was not raised or declared
in a command window. Invoking the Debug.Address_To_Location command with
the raise address displays the source location of the exception, with the
same restrictions.
PARAMETERS
Fully_Qualify : Boolean := True;
Specifies whether to return the exception name with a fully qualified
pathname. The default value is True.
When False, only the simple name of the exception is returned.
This parameter applies only to user-defined exceptions. With predefined
exceptions, only the simple name of the exception is returned,
regardless of the value of this parameter.
Machine_Info : Boolean := False;
Specifies whether machine information is returned. The default value is
False.
If the value of this parameter is True, the returned string includes the
address of the frame in which the exception was raised and the machine
representation of the exception. See Chapter 6, "Manipulating Exceptions,"
for an explanation of exception representations.
return String;
Returns information about the exception. The string may be relatively long
(that is, greater than 80 characters), especially if Fully_Qualify and
Machine_Info are both True.
ERRORS
If Get_Exception_Name is called while the task is not in an exception
handler, the following is displayed in an Environment output window:
Unknown exception raised at unknown address.
EXAMPLES
If a task is in an exception handler because of a Program_Error exception
and issues the call:
Io.Put_Line (Debug_Tools.Get_Exception_Name);
the following is displayed in an Environment output window:
Program_Error
If the Machine_Info parameter is set True in the call, as in:
Io.Put_Line (Debug_Tools.Get_Exception_Name (True, True));
the following is displayed in the Environment output window:
Program_Error<Space= 0, Index= 226> raised at #61902, #1B
You can then use the returned information in the following interactive
debugger commands:
Debug.Exception_To_Name ("0, 226");
Debug.Address_To_Location ("#61902, #1B");
which cause the following to be displayed in the debugger window:
Exception_To_Name ("0, 226");
Name: Predefined exception PROGRAM_ERROR
Address_To_Location ("#61902, #1B");
Name: .DEBUG_TOOLS_EXAMPLES.14s
PC = #61902, #1B
REFERENCES
procedure Debug.Address_To_Location
subtype Debug.Exception_Name
procedure Debug.Exception_To_Name
@node !Tools.Debug_Tools.Get_Raise_Location
function Get_Raise_Location (Fully_Qualify : Boolean := True;
Machine_Info : Boolean := False)
return String;
DESCRIPTION
Returns the address at which the most recent exception was raised in the
calling task.
This function must be called directly or indirectly from an exception
handler. It returns the null string ("") if no exceptions are currently
active in the calling task.
If Machine_Info is enabled (True), the Get_Raise_Location function returns
both the machine representation of the most recently raised exception and
the machine address at which that exception was raised (the "raise
address"). You can then use this returned information in interactive
debugger commands. Invoking the Debug.Exception_To_Name command with the
exception's machine representation displays the name of the exception,
if the Ada units still exist and the exception was not raised or declared
in a command window. Invoking the Debug.Address_To_Location command with
the raise address displays the source location of the exception, with the
same restrictions.
See Debug.Raise_Location for a list of valid exception names.
PARAMETERS
Fully_Qualify : Boolean := True;
Specifies whether the exception name is returned fully qualified. The
default value is True.
Machine_Info : Boolean := False;
Specifies whether machine information is returned. The default value is
False.
If the value of this parameter is True, the returned string includes the
address of the frame in which the exception was raised and the machine
representation of the exception. See Chapter 6, "Manipulating Exceptions,"
for an explanation of exception representations.
return String;
Returns information about the exception. The string may be relatively long
(that is, greater than 80 characters), especially if Fully_Qualify and
Machine_Info are both True.
RESTRICTIONS
If no debugger is active for the session (either because no jobs have been
debugged since the user logged in or because the debugger has been
killed), this function returns only low-level machine information:
Task #1CCD4:
Program_Error<Space= 0, Index= 226> raised at #61902, #1B
EXAMPLES
If a task with number 1CCD4 is in an exception handler because of a
Program_Error exception and issues the call:
Io.Put_Line (Debug_Tools.Get_Raise_Location);
the following is displayed in an Environment output window:
Task ROOT_TASK, #1CCD4:
Exception Program_Error raised at: .DEBUG_TOOLS_EXAMPLES.14s.
If the Machine_Info parameter is set True in the call, as in:
Io.Put_Line (Debug_Tools.Get_Raise_Location (True, True));
the following is displayed in the Environment output window:
Task ROOT_TASK, #1CCD4:
Exception Program_Error raised at: .DEBUG_TOOLS_EXAMPLES.14s.
Control offset: #19, Raise Pc: #61902, #1B, Exception name: (#E2)
You can then use the returned information in the following interactive
debugger commands:
Debug.Exception_To_Name ("#E2");
Debug.Address_To_Location ("#61902, #1B");
which cause the following to be displayed in the debugger window:
Exception_To_Name ("#E2");
Name: Predefined exception PROGRAM_ERROR
Address_To_Location ("#61902, #1B");
Name: .DEBUG_TOOLS_EXAMPLES.14s
PC = #61902, #1B
REFERENCES
procedure Debug.Address_To_Location
subtype Debug.Exception_Name
procedure Debug.Exception_To_Name
@node !Tools.Debug_Tools.Get_Task_Name
function Get_Task_Name return String;
DESCRIPTION
Returns a string synonym set by the Set_Task_Name procedure.
This function allows a task to interrogate its name. If no synonym has
been assigned to the calling task, the null string ("") is returned.
Note: Task synonyms were formerly documented as task nicknames.
PARAMETERS
return String;
Returns the synonym set by the Set_Task_Name procedure. The null string
("") is returned if no name has been assigned.
RESTRICTIONS
If this function is called from a job not currently being debugged, the
call always returns the null string ("").
EXAMPLES
If the root task of a program is being debugged and issues the call:
Io.Put_Line (Debug_Tools.Get_Task_Name);
the following is displayed in an Environment output window:
Root_Task
If the program had first set the name of its root task to "Main" by calling
the Set_Task_Name procedure, the following would have been displayed:
Main
REFERENCES
procedure Set_Task_Name
procedure Debug.Set_Task_Name
@node !Tools.Debug_Tools.Message
procedure Message (Info : String);
DESCRIPTION
Displays a message in the debugger window.
This procedure displays the string specified by the Info parameter.
This procedure can be used to place comments in the debugger window for
annotation of a debugging session.
PARAMETERS
Info : String;
Specifies the string to be displayed in the debugger window.
Multiple lines must be separated with linefeed characters (character type
Ascii.Lf).
EXAMPLES
If a task with number 1CCD4 issues the call:
Debug_Tools.Message ("here is a message");
the following message is displayed in the debugger window:
From task: ROOT_TASK, #1CCD4: here is a message
@node !Tools.Debug_Tools.Register
generic
type T is limited private;
with function Image (Value : T;
Level : Natural;
Prefix : String;
Expand_Pointers : Boolean) return String;
procedure Register;
DESCRIPTION
Registers a special display for a type with the debugger.
This generic procedure provides facilities that enable you to write
special type displays for the debugger. The debugger uses these routines
to format and display the value of variables and to perform other actions.
These display routines can be created for any object type defined in
the Rational Environment or in your applications.
Display routines must be created and then registered with the debugger. If
no special display is registered for a type, the debugger uses the
structural type information from the type declaration when the Debug.Put
command is executed on objects of that type. Once a special display is
registered for a type, the debugger uses the special type display instead
of the structural type information.
To implement a special display for a given type:
1. Create an appropriate Image function for the type. An Image function is
a function that returns an image (that is, a predefined display) of
the value of an object of that type. See the reference entry for
generic formal function Register.Image for a complete description of
Image functions.
2. Instantiate the generic procedure Register, giving as its parameters
the type for which you want a special display and the name of your
Image function for that type.
3. Call the instantiation from your application.
Registering a new special display for a type overrides both the type's
default structural display and any existing special display for the type.
If another special display is currently registered for the type, it is
automatically unregistered and the new function is substituted.
Special displays can also be unregistered to return to the use of a type's
normal structural display. See the reference entry for generic procedure
Un_Register.
Special type displays can be registered in two ways:
* In the default Debugger_Initialization procedure, which executes when
the debugger is started. In this case, the special display remains in
effect until explicitly unregistered, a new special display is
registered for the type, the user logs off from the session, or the
debugger is killed.
* In the job being debugged. In this case, the special display remains in
effect during the life of the job, until the special display is
explicitly unregistered, or until a new special display is registered
for the type.
The debugger has preregistered special displays for many of the important
types defined in the specifications of the Rational Environment. These
preregistered special displays can be redefined if necessary. For a list of
these types, see the section below entitled "Preregistered Special Type
Displays."
The Debug.Show (Debug.Special_Types) debugger command lists the special
type displays 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.
RESTRICTIONS
Many important restrictions apply to the Image function being registered.
See the "Restrictions" section of the reference entry for the generic
formal function Register.Image.
The source code for instantiations of the Register procedure must be on
the system on which the program being debugged is executing. This is an
important restriction to consider when using software that has been
distributed in the form of a code view. The code view can include the
Image functions needed for registration. However, views containing the
actual source code for the registration must exist on the same system as
the code view.
EXAMPLE 1
Even when a structural display is 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 as a pointer chain connecting the list elements, which
would 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.
------------------------------
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 Integer_List;
with Debug_Tools;
with String_Utilities;
package body List_Display is
function Element_Images (Value : Integer_List.List)
return String is
-- This recursive function builds a string containing the
-- images of the items in a list ordered from left to right.
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;
function Image (Value : Integer_List.List;
Level : Natural;
Prefix : String;
Expand_Pointers : Boolean) return String is
-- The Image function used in this special display displays
-- lists with their elements ordered from left to right
-- enclosed in parentheses. For example: "( 1 2 3 )".
begin
if Integer_List.Is_Empty (Value) then
return "the list is empty";
else
return "( " & Element_Images (Value) & ")";
end if;
end Image;
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 (Debug.Put ("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 or 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-display functions are then created and registered for each of
these types. These special-display functions 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 text 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.
PREREGISTERED SPECIAL TYPE DISPLAYS
There are preregistered special displays for many of the important types
defined in the specifications of the Rational Environment. These
preregistered special displays can be redefined, if necessary. The types
for which displays are preregistered include:
!Implementation.Activity_Implementation.Activity_Handle
!Implementation.Activity_Implementation.Iterator
!Implementation.Dependency_Data_Base.Defid_Iterator
!Implementation.Dependency_Data_Base.Iterator
!Implementation.Diana.Attr_List
!Implementation.Diana.Attr_Name
!Implementation.Diana.Comment
!Implementation.Diana.Number_Rep
!Implementation.Diana.Seq_Type
!Implementation.Diana.Sequence
!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.Dtia_Client.Cursor
!Implementation.Dtia_Client.Image_Id
!Implementation.Dtia_Client.Selection
!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.Design.Abstract_Document.Format_Info
!Tools.Design.Abstract_Document.Handle
!Tools.Design.Abstract_Document.Linkage_Info
!Tools.Design.Abstract_Document.Node
!Tools.Design.Document.Element
!Tools.Design.Document.Element_List
!Tools.Design.Element_Cache.Handle
!Tools.Design.Mapping.Target_Info
!Tools.Design.Pdl.Area
!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.Gateway_Object.Handle
!Tools.Link_Tools.Dependent_Iterator
!Tools.Link_Tools.Link_Iterator
!Tools.Lrm.Ada_Program.Element
!Tools.Lrm.Ada_Program.Element_Iterator
!Tools.Lrm.Ada_Program.Element_List
!Tools.Lrm.Ada_Program.Line_Iterator
!Tools.Networking.Transport.Connection_Id
!Tools.Networking.Transport.Connection_Id_Iterator
!Tools.Networking.Transport.Network_Name_Iterator
!Tools.Networking.Transport.Route.Iterator
!Tools.Networking.Transport_Name.Host_Iterator
!Tools.Networking.Transport_Name.Service.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
REFERENCES
generic formal function Register.Image
generic formal type Register.T
generic procedure Un_Register
procedure Debug.Show
type Debug.State_Type, enumeration Special_Types
@node !Tools.Debug_Tools.Register.Image
with function Image (Value : T;
Level : Natural;
Prefix : String;
Expand_Pointers : Boolean) return String;
DESCRIPTION
Returns a string that is the image of the value of the Value parameter.
The Image function returns a string that is an image (that is, a predefined
display) of the value of an object. The form and content of the image
depend on the user-defined type of the object. See generic procedure
Register for details regarding object types.
Display of Structured Objects
When displaying a structured object, such as a record, the debugger
displays the number of levels of structure specified by the Display_Level
numeric flag (Debug.Numeric.Display_Level). For example, if a record has
five levels of subrecords, and Display_Level is set to 3, only the top
three levels of the record are displayed.
The debugger manages this through an internal Level parameter that tracks
the number of levels to be displayed for the current structure. It is
initialized to the value of the Display_Level flag for each Put command,
reduced by 1 each time the debugger steps into a substructure, and
increased by 1 each time a substructure is finished. (Actually, the
traversal over a structure is implemented recursively, with (Level - 1)
passed to the Level parameter of the display subprogram when a sub-
structure is displayed.) When Level = 0 for a substructure, it is elided;
that is, nothing from the substructure is displayed.
If a special display is currently registered for a type, the debugger
always uses the registered Image function when displaying objects of that
type, even if the object being displayed is embedded in a larger
structure. For example, if a record has as one of its components an object
for which a special display has been registered, the debugger will call
the registered Image function to display that one object and use the
default structural display for the remainder of the record.
When calling an Image function, the debugger passes to the Level parameter
of the Image function the number of levels remaining to be displayed
(Level - 1). Thus the number of levels actually displayed by a given Image
function varies depending on the display nesting depth at the time the
Image function is called. If the Display_Level flag is set to 3, and the
debugger is already two levels deep in a record when an Image function is
called, the Image function displays only one additional level.
The debugger uses the Pointer_Level numeric flag
(Debug.Numeric.Pointer_Level) in a manner similar to the way Display_Level
is used, except that it is decreased only when a pointer is traversed. If
the current pointer level is greater than or equal to 1 when a registered
Image function is called, the debugger returns True to the Expand_Pointers
parameter of the Image function; otherwise, the debugger returns False.
User-Supplied Image Functions
For user-defined special displays, the Image function is written by the
user. It is recommended that the user's function follow the same
conventions used by the debugger and by the predefined Image functions.
However, this is not required.
The user's Image function should follow the same conventions with Level as
used by the debugger, but this is not required. For example, if Level = 1
is passed to a user-supplied Image function, the function should display
only one level of the specified object, but it can display more levels and
the debugger will still work. When Level = 0 for a substructure, nothing
from the substructure should be displayed.
A user's Image function should (but is not required to) use the value of
the Expand_Pointers parameter to determine whether to traverse pointers
when producing the image of an object.
A user's Image function should (but is not required to) prepend the Prefix
string to each display line after the first.
PARAMETERS
Value : T;
Specifies the value for which the image is to be computed.
Level : Natural;
Specifies the number of levels of detail to be displayed. This is
determined dynamically by the nesting level of Value in the structure
being displayed by the debugger and by the value of the Display_Level
flag. If Level = 0, the entire value should be elided (omitted).
Prefix : String;
Specifies the string to be prepended to the beginning of display lines
after the first. Each new line (that is, every segment following an
Ascii.Lf line terminator character) in the returned string should have
this prefix.
Expand_Pointers : Boolean;
Specifies, when enabled, that internal pointers should be traversed and
expanded when producing the image of the object. This is determined
dynamically by the nesting level of Value in the structure being displayed
by the debugger and by the value of the Pointer_Level flag.
return String;
Returns the image of the value of the Value parameter.
RESTRICTIONS
An Image function used to instantiate the generic Register procedure must
be defined in a place where it will still be elaborated when invoked by the
debugger. (This is consistent with the rules of Ada; it is illegal to
invoke a function that is not currently elaborated.) The easiest way to
ensure this is to declare the function registered with the debugger as a
type T's special-display function at the same level as T. For example, if
T is defined at the top level of a package P, the special-display function
for T should also be defined at the top level of P.
The Image function cannot call the debugger (specifically, it cannot call
any of the subprograms in packages Debug or Debug_Tools). Further, the
code in the Image function cannot be debugged using the debugger when
implicitly called as a result of performing the Debug.Put command. That
is, when specifying a special display with Put, the debugger cannot access
the underlying Image function for the variable type corresponding to
that special display.
Image functions execute as part of the debugger job itself, not as part of
the job being debugged. Consequently, Image functions are scheduled as
part of the debugger job. If an Image function is resource-intensive (or
goes into an infinite loop--see "Errors," below), the system may become
heavily loaded during execution of the Image function.
Because Image functions execute as part of the debugger job, they cannot
depend on job-dependent states of the Environment. For example, the
Standard_Output and Current_Output files from package !Io.Text_Io are
job-specific. If an Image function attempts to call the Text_Io.Put_Line
procedure using the value of Current_Output for the file, the output will
not go to the Current_Output defined for the application; instead, it will
go to the Current_Output defined for the debugger. This applies to all
job-dependent states, such as current context, current profile, current
activity, and so on.
ERRORS
If the Image function goes into an infinite loop, the Debug.Put command
that initiated the looping Image function will never complete. If this
situation occurs, use Debug.Kill to terminate debugging of the job and
start over after removing the infinite loop from the special display.
EXAMPLES
See generic procedure Register for examples of Image functions.
REFERENCES
generic procedure Register
type Debug.Numeric, enumeration Display_Level
type Debug.Numeric, enumeration Pointer_Level
@node !Tools.Debug_Tools.Register.T
type T is limited private;
DESCRIPTION
Specifies the type of the object for which the special display is being
defined.
REFERENCES
generic procedure Register
@node !Tools.Debug_Tools.Set_Task_Name
procedure Set_Task_Name (Name : String);
DESCRIPTION
Assigns a string synonym to the specified task.
This name is used within the debugger to make identifying tasks easier. It
is also useful for distinguishing between multiple activations of the same
task type.
Most debugger commands recognize task synonyms. To use a synonym in a com-
mand, precede it with 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. This is
especially important when multiple activations of the same task type are
created. To aid differentiation between multiple activations of a task,
the debugger allows a unique synonym to be assigned to each activation. It
is some extra work to give each activation a unique name, but the effort
often greatly simplifies the task of understanding what is going on during
debugging.
A single synonym can be assigned to only one task; the debugger does not
allow synonyms to be overloaded. Reassigning a task synonym to a new task
removes that synonym from the task to which it was previously assigned.
Thus each activation of a task type must programmatically determine its
own task synonym unique from the synonyms created by other activations of
the same task type.
The name Root_Task is automatically assigned to the root task (the command
task) in a job. To avoid confusion, do not assign the Root_Task synonym to
any other task.
The Debug.Set_Task_Name command also assigns synonyms to tasks. However,
note that the parameters for Debug.Set_Task_Name differ from those for
this procedure.
Note: Task synonyms were formerly documented as task nicknames.
PARAMETERS
Name : String;
Specifies the name to be assigned to the task. The string must be a legal
Ada identifier. Strings containing illegal characters cause an error.
Keep the name reasonably short. Although names can be of any length,
debugger displays that include the task name are less readable if
excessively long names are used.
RESTRICTIONS
If this procedure is called from a job not currently being debugged, the
call is ignored and has no effect.
EXAMPLES
Example 1
The following code assigns the name My_Task to the current task. If there
is more than one activation of this task, only the last task to call
Set_Task_Name will retain the synonym.
Debug_Tools.Set_Task_Name ("My_Task");
Example 2
The following code assigns a unique name to each activation of the current
task. Each task will be named My_Task_n, where n is a unique number for
each task.
Unique_Number.Get (N);
Debug_Tools.Set_Task_Name
("My_Task_" & Integer'Image (N)
-- strip leading blank or minus from image of number
(Integer'Image (N)'First + 1 .. Integer'Image (N)'Last));
See Chapter 3, "Managing Tasks," for a complete example.
REFERENCES
procedure Get_Task_Name
subtype Debug.Path_Name
procedure Debug.Set_Task_Name
procedure Debug.Task_Display
@node !Tools.Debug_Tools.Un_Register
generic
type T is limited private;
procedure Un_Register;
DESCRIPTION
Cancels ("unregisters") the special display for a type.
This generic procedure revokes the registration of a special display
previously registered for an object type. For more information on special
displays, see the generic procedure Register.
Once a special display is unregistered, the default display for a variable
of this type is based on the structural information for the type. The
debugger no longer uses the Image procedure last registered to the type
for displays of variables of the type. The debugger uses the structural
information in the type declaration to display objects of this type in
the standard format, just as though no special display had been
registered.
Special displays do not stack. Regardless of the number of different
special displays that have been registered for the same type,
Un_Register causes a return to the original default structural display.
The parameter T defines the type for which a special display is
unregistered.
If no special displays are registered for the type, this procedure has no
effect.
Note: The specification of the generic procedure Un_Register is slightly
different for Rational's Cross-Development Facility (CDF) debuggers. See
the documentation for the appropriate CDF for more details.
REFERENCES
generic procedure Register
generic formal function Register.Image
generic formal type Un_Register.T
@node !Tools.Debug_Tools.Un_Register.T
type T is limited private;
DESCRIPTION
Specifies the type of the object for which the special display is removed.
REFERENCES
generic procedure Un_Register
@node !Tools.Debug_Tools.User_Break
procedure User_Break (Info : String);
DESCRIPTION
Causes the calling task to stop as though it had encountered a breakpoint.
This procedure interrupts execution of the current task in the same manner
as a breakpoint. When the debugger executes this procedure, it halts
execution and prints a status message that includes a string specified by
the Info parameter.
PARAMETERS
Info : String;
Specifies the string that is displayed in the debugger window.
Multiple lines must be separated with linefeed characters (character type
Ascii.Lf).
RESTRICTIONS
If this procedure is called from a job not currently being debugged, the
call is ignored and has no effect.
EXAMPLES
If a task with number 1CCD4 issues the call:
Debug_Tools.User_Break ("Serious error encountered");
the debugger stops the task and displays in the debugger window:
From task: ROOT_TASK, #1CCD4: Serious error encountered
User break: .DEBUG_TOOLS_EXAMPLES.CRASH.1s [Task : ROOT_TASK,
#1CCD4].
which identifies the task name and location of the call to the User_Break
procedure.