[OpenVMS documentation]
[Site home] [Send comments] [Help with this site] [How to order documentation] [OpenVMS site] [Compaq site]
Updated: 11 December 1998

OpenVMS Debugger Manual


Previous Contents Index

4.4.1 Processor Status Longword (VAX Only)

On VAX processors, the processor status longword (PSL) is a register whose value represents a number of processor state variables. The first 16 bits of the PSL (referred to separately as the processor status word, or PSW) contain unprivileged information about the current processor state. The values of these bits can be controlled by a user program. The latter 16 bits of the PSL, bits 16 to 31, contain privileged information and cannot be altered by a user-mode program.

The following example shows how to examine the contents of the PSL:


DBG> EXAMINE %PSL
MOD3\PSL: 
      CMP TP FPD IS CURMOD PRVMOD IPL DV FU IV T N Z V C 
       n   n  n   n  mode   mode   1v  n  n  n n n n n n
DBG>

See the VAX Architecture Handbook for complete information about the PSL, including the values of the various bits.

You can also display the information in the PSL in other formats. For example:


DBG> EXAMINE/LONG/HEX %PSL
MOD3\%PSL:        03C00010
DBG> EXAMINE/LONG/BIN %PSL
MOD3\%PSL:        00000011 11000000 00000000 00010000
DBG>

The command EXAMINE/PSL displays the value at any location in PSL format. This is useful for examining saved PSLs on the call stack.

To disable all conditions in the PSL, clear bits 0 to 15 with the following DEPOSIT command:


DBG> DEPOSIT/WORD PSL = 0
DBG> EXAMINE/PSL
MOD3\PSL:
      CMP TP FPD IS CURMOD PRVMOD IPL DV FU IV T N Z V C
       0   0  0   0  USER   USER   0   0  0  0 0 0 0 0 0
DBG> 
 

4.4.2 Processor Status (Alpha Only)

On Alpha processors, the processor status (PS) is a register whose value represents a number of processor state variables. The first three bits of the PS are reserved for the use of the software. The values of these bits can be controlled by a user program. The remainder of the bits, bits 4 to 64, contain privileged information and cannot be altered by a user-mode program.

The following example shows how to examine the contents of the PS:


DBG> EXAMINE %PS
MOD1\%PS: 
      SP_ALIGN IPL VMM   CM   IP SW 
         48     0   0   USER   0  3
DBG>

See the Alpha Architecture Reference Manual for complete information about the PS, including the values of the various bits.

You can also display the information in the PS in other formats. For example:


DBG> EXAMINE/LONG/HEX %PS
MOD1\%PS:        0000001B
DBG> EXAMINE/LONG/BIN %PS
MOD1\%PS:        00000000 00000000 00000000 00011011
DBG>

The command EXAMINE/PS displays the value at any location in PS format. This is useful for examining the combined current and saved PS values.

4.5 Specifying a Type When Examining and Depositing

The preceding sections explain how to use the EXAMINE and DEPOSIT commands with program locations that have a symbolic name and, therefore, are associated with a compiler-generated type.

Section 4.5.1 describes how the debugger formats (types) data for program locations that do not have a symbolic name and explains how you can control the type for those locations.

Section 4.5.2 explains how to override the type associated with any program location, including a location that has a symbolic name.

4.5.1 Defining a Type for Locations Without a Symbolic Name

Program locations that do not have a symbolic name and, therefore, are not associated with a compiler-generated type have the type longword integer by default. Section 4.1.5 explains how to examine and deposit into such locations using the default type.

The SET TYPE command enables you to change the default type in order to examine and display the contents of a location in another type, or to deposit a value of one type into a location associated with another type. Table 4-3 lists the type keywords for the SET TYPE command.

Table 4-3 SET TYPE Keywords
ASCIC D_FLOAT +H_FLOAT PACKED
ASCID DATE_TIME INSTRUCTION QUADWORD
ASCII: n ++EXTENDED_FLOAT ++LONG_FLOAT ++S_FLOAT
ASCIW F_LOAT ++LONG_LONG_FLOAT ++T_FLOAT
ASCIZ FLOAT LONGWORD TYPE=( type-expression)
BYTE G_FLOAT OCTAWORD WORD
      ++X_FLOAT


+VAX specific
++Alpha specific

For example, the following commands set the type for locations without a symbolic name to, respectively, byte integer, G_floating, and ASCII with 6 bytes of ASCII data. Each successive SET TYPE command resets the type.


DBG> SET TYPE BYTE
DBG> SET TYPE G_FLOAT
DBG> SET TYPE ASCII:6

Note that the SET TYPE command, when used without the /OVERRIDE qualifier, does not affect the type for program locations that have a symbolic name (locations associated with a compiler-generated type).

The SHOW TYPE command identifies the current type for locations without a symbolic name. To restore the default type for such locations, enter the SET TYPE LONGWORD command.

4.5.2 Overriding the Current Type

The SET TYPE/OVERRIDE command enables you to change the type associated with any program location, including locations with compiler-generated types. For example, after the following command is executed, an unqualified EXAMINE command displays the contents of only the first byte of the location specified and interprets the contents as byte integer data. An unqualified DEPOSIT command modifies only the first byte of the location specified and formats the data deposited as byte integer data.


DBG> SET TYPE/OVERRIDE BYTE

See Table 4-3 for the valid type keywords for the SET TYPE/OVERRIDE command.

To identify the current override type, enter the SHOW TYPE/OVERRIDE command. To cancel the current override type and restore the normal interpretation of locations that have a symbolic name, enter the CANCEL TYPE/OVERRIDE command.

The EXAMINE and DEPOSIT commands have qualifiers that enable you to override the type currently associated with a program location for the duration of the EXAMINE or DEPOSIT command. These qualifiers override any previous SET TYPE or SET TYPE/OVERRIDE command as well as any compiler-generated type. See the DEPOSIT and EXAMINE commands for the type qualifiers available to each command.

When used with a type qualifier, the EXAMINE command displays the entity specified by the address expression in that type. For example:


DBG> EXAMINE/BYTE .           ! Type is byte integer.
MOD3\%LINE 15 :  -48
DBG> EXAMINE/WORD .           ! Type is word integer.
MOD3\%LINE 15 :  464
DBG> EXAMINE/LONG .           ! Type is longword integer.
MOD3\%LINE 15 :  749404624
DBG> EXAMINE/QUAD .           ! Type is quadword integer.
MOD3%LINE 15 :  +0130653502894178768
DBG> EXAMINE/FLOAT .          ! Type is F_floating.
MOD3%LINE 15 :   1.9117807E-38
DBG> EXAMINE/G_FLOAT .        ! Type is G_floating.
MOD3%LINE 15 :   1.509506018605227E-300
DBG> EXAMINE/ASCII .          ! Type is ASCII string.
MOD3\%LINE 15 :  ".."
DBG>

When used with a type qualifier, the DEPOSIT command deposits a value of that type into the location specified by the address expression, which overrides the type associated with the address expression.

The remaining sections provide examples of specifying integer, string, and user-declared types with type qualifiers and the SET TYPE command.

4.5.2.1 Integer Types

The following examples show the use of the EXAMINE and DEPOSIT commands with integer-type qualifiers (/BYTE, /WORD, /LONGWORD). These qualifiers enable you to deposit a value of a particular integer type into an arbitrary program location.


DBG> SHOW TYPE           ! Show type for locations without
type:  long integer      ! a compiler-generated type.
DBG> EVALU/ADDR .        ! Current location is 724.
724
DBG> DEPO/BYTE . = 1     ! Deposit the value 1 into one byte 
                         ! of memory at address 724.
DBG> EXAM .              ! By default, 4 bytes are examined.
724:  1280461057
DBG> EXAM/BYTE .         ! Examine one byte only.
724:  1
DBG> DEPO/WORD . = 2     ! Deposit the value 2 into first two 
                         ! bytes (word) of current entity.
DBG> EXAM/WORD .         ! Examine a word of the current entity.
724:  2
DBG> DEPO/LONG 724 = 999 ! Deposit the value 999 into 4 bytes
                         !(a longword) beginning at address 724.
DBG> EXAM/LONG 724       ! Examine 4 bytes (longword)
724:  999                ! beginning at address 724.
DBG>

4.5.2.2 ASCII String Type

The following examples show the use of the EXAMINE and DEPOSIT commands with the /ASCII:n type qualifier.

When used with the DEPOSIT command, this qualifier enables you to deposit an ASCII string of length n into an arbitrary program location. In the example, the location has a symbolic name (I) and, therefore, is associated with a compiler-generated integer type. The command syntax is as follows:


DEPOSIT/ASCII:n address-expression = "ASCII string of length n" 

The default value of n is 4 bytes.


DBG> DEPOSIT I = "abcde"    ! I has compiler-generated integer type. 
%DEBUG-W-INVNUMBER, invalid numeric string 'abcde'
                            ! So, it cannot deposit string into I.
DBG> DEP/ASCII:5 I = "abcde"! /ASCII qualifier overrides integer 
                            ! type to deposit 5 bytes of
                            ! ASCII data.
DBG> EXAMINE .              ! Display value of I in compiler- 
MOD3\I:  1146048327         ! generated integer type.
DBG> EXAM/ASCII:5 .         ! Display value of I as 5-byte 
MOD3\I:  "abcde"            ! ASCII string. 
DBG>

To enter several DEPOSIT/ASCII commands, you can establish an override ASCII type with the SET TYPE/OVERRIDE command. Subsequent EXAMINE and DEPOSIT commands then have the effect of specifying the /ASCII qualifier with these commands. For example:


DBG> SET TYPE/OVER ASCII:5! Establish ASCII:5 as override type.) 
DBG> DEPOSIT I = "abcde"  ! Can now deposit 5-byte string into I.) 
DBG> EXAMINE I            ! Display value of I as 5-byte) 
MOD3\I:  "abcde"          ! ASCII string. 
DBG> CANCEL TYPE/OVERRIDE ! Cancel ASCII override type. 
DBG> EXAMINE I            ! Display I in compiler-generated type. 
MOD3\I:  1146048327
DBG>

4.5.2.3 User-Declared Types

The following examples show the use of the EXAMINE and DEPOSIT commands with the /TYPE=(name) qualifier. The qualifier enables you to specify a user-declared override type when examining or depositing.

For example, assume that a Pascal program contains the following code, which declares the enumeration type COLOR with the three values RED, GREEN, and BLUE:


   .
   .
   .
TYPE 
    COLOR = (RED,GREEN,BLUE); 
   .
   .
   .

During the debugging session, the SHOW SYMBOL/TYPE command identifies the type COLOR as it is known to the debugger:


DBG> SHOW SYMBOL/TYPE COLOR
data MOD3\COLOR 
    enumeration type (COLOR, 3 elements), size: 1 byte
DBG>

The next example displays the value at address 1000, which is not associated with a symbolic name. Therefore, the value 0 is displayed in the type longword integer, by default.


DBG> EXAMINE 1000
1000:   0
DBG>

The next example displays the value at address 1000 in the type COLOR. The preceding SHOW SYMBOL/TYPE command indicates that each enumeration element is stored in 1 byte. Therefore, the debugger converts the first byte of the longword integer value 0 at address 1000 to the equivalent enumeration value, RED (the first of the three enumeration values):


DBG> EXAMINE/TYPE=(COLOR) 1000
1000:   RED
DBG>

The following DEPOSIT command deposits the value GREEN into address 1000 with the override type COLOR. The EXAMINE command displays the value at address 1000 in the default type, longword integer:


DBG> DEPOSIT/TYPE=(COLOR) 1000 = GREEN
DBG> EXAMINE 1000
1000:   1
DBG>

The following SET TYPE command establishes the type COLOR for locations, such as address 1000, that do not have a symbolic name. The EXAMINE command now displays the value at 1000 in the type COLOR:


DBG> SET TYPE TYPE=(COLOR)
DBG> EXAMINE 1000
1000:   GREEN
DBG>


Chapter 5
Controlling Access to Symbols in Your Program

Symbolic debugging enables you to specify variable names, routine names, and so on, precisely as they appear in your source code. You do not need to use numeric memory addresses or registers when referring to program locations.

In addition, you can use symbols in the context that is appropriate for the program and its source language. The debugger supports the language conventions regarding data types, expressions, scope and visibility of entities, and so on.

To have full access to the symbols that are associated with your program, you must compile and link the program using the /DEBUG command qualifier.

Under these conditions, the way in which symbol information is passed from your source program to the debugger and is processed by the debugger is transparent to you in most cases. However, certain situations might require some action.

For example, when you try to set a breakpoint on a routine named COUNTER, the debugger might display the following diagnostic message:


DBG> SET BREAK COUNTER
%DEBUG-E-NOSYMBOL, symbol 'COUNTER' is not in the symbol table
DBG>

You must then set the module where COUNTER is defined, as explained in Section 5.2.

The debugger might display the following message if the same symbol X is defined (declared) in more than one module, routine, or other program unit:


DBG> EXAMINE X
%DEBUG-E-NOUNIQUE, symbol 'X' is not unique
DBG>

You must then resolve the symbol ambiguity, perhaps by specifying a path name for the symbol, as explained in Section 5.3.

This chapter explains how to handle these and other situations related to accessing symbols in your program.

The chapter discusses only the symbols (typically address expressions) that are derived from your source program:

The following types of symbols are discussed in other chapters:

Also, see Section 4.1.11 for information about how to obtain the memory addresses and register names associated with symbolic address expressions and how to symbolize program locations.

Note

If your program was optimized during compilation, certain variables in the program might be removed by the compiler. If you then try to reference such a variable, the debugger issues a warning (see Section 1.2 and Section 14.1).

Before you try to reference a nonstatic (stack-local or register) variable, its defining routine must be active on the call stack. That is, program execution must be paused somewhere within the defining routine (see Section 3.4.3).

5.1 Controlling Symbol Information When Compiling and Linking

To take full advantage of symbolic debugging, you must compile and link your program with the /DEBUG qualifier as explained in Section 1.2.

The following sections describe how symbol information is created and passed to the debugger when compiling and linking.

5.1.1 Compiling

When you compile a source file using the /DEBUG qualifier, the compiler creates symbol records for the debug symbol table (DST records) and includes them in the object module being created.

DST records provide not only the names of symbols but also all relevant information about their use. For example:

Most compilers allow you to vary the amount of DST information put in an object module by specifying different options with the /DEBUG qualifier. Table 5-1 identifies the options for most compilers (see the documentation supplied with your compiler for complete information).

Table 5-1 Compiler Options for DST Symbol Information
Compiler Command Qualifier DST Information in Object Module
/DEBUG 1 Full
/DEBUG=TRACEBACK 2 Traceback only (module names, routine names, and line numbers)
/NODEBUG 3 None


1 /DEBUG, /DEBUG=ALL, and /DEBUG=(SYMBOLS,TRACEBACK) are equivalent.
2 /DEBUG=TRACEBACK and DEBUG=(NOSYMBOLS,TRACEBACK) are equivalent.
3 /NODEBUG, /DEBUG=NONE, and /DEBUG=(NOSYMBOLS,NOTRACEBACK) are equivalent.

The TRACEBACK option is a default for most compilers. That is, if you omit the /DEBUG qualifier, most compilers assume /DEBUG=TRACEBACK. The TRACEBACK option enables the traceback condition handler to translate memory addresses into routine names and line numbers so that it can give a symbolic traceback if a run-time error has occurred. For example:


$ RUN FORMS
   .
   .
   .
%PAS-F-ERRACCFIL, error in accessing file PAS$OUTPUT 
%PAS-F-ERROPECRE, error opening/creating file 
%RMS-F-FNM, error in file name 
%TRACE-F-TRACEBACK, symbolic stack dump follows 
 
module name     routine name     line      rel PC      abs PC 
 
PAS$IO_BASIC    _PAS$CODE                 00000192    00001CED 
PAS$IO_BASIC    _PAS$CODE                 0000054D    000020A8 
PAS$IO_BASIC    _PAS$CODE                 0000028B    00001DE6 
FORMS           FORMS             59      00000020    000005A1
$

Traceback information is also used by the debugger's SHOW CALLS command.

5.1.2 Local and Global Symbols

DST records contain information about all of the symbols that are defined in your program. These are either local or global symbols.

Typically, a local symbol is a symbol that is referenced only within the module where it is defined; a global symbol is a symbol such as a routine name, procedure entry point, or a global data name, that is defined in one module but referenced in other modules.

A global symbol that is defined in a shareable image and is referenced in another image (for example the main, executable image of a program) is called a universal symbol. When creating a shareable image, you must explicitly define any universal symbols as such at link time. See Section 5.4 for information about universal symbols and shareable images.

Generally, the compiler resolves references to local symbols, and the linker resolves references to global symbols.

The distinction between local and global symbols is discussed in various parts of this chapter in connection with symbol lookup and with shareable images and universal symbols.


Previous Next Contents Index

[Site home] [Send comments] [Help with this site] [How to order documentation] [OpenVMS site] [Compaq site]
[OpenVMS documentation]

Copyright © Compaq Computer Corporation 1998. All rights reserved.

Legal
4538PRO_010.HTML