Document revision date: 19 July 1999
[Compaq] [Go to the documentation home page] [How to order documentation] [Help on this site] [How to contact us]
[OpenVMS documentation]

OpenVMS Alpha System Analysis Tools Manual


Previous Contents Index

Now that the breakpoint is set, you can proceed and activate the breakpoint. When that occurs, the debugger tries to open the source code for that location in the same place as where the module was compiled. Because that is not the same place as on your system, you need to tell the debugger where to find the source code. This is done with the debugger's SET SOURCE command, which takes a search list as a parameter so you can make it point to many places.

Example 7-6 Finding the Source Code

 
 
DBG> set source/latest sys$examples,sys$library 
DBG> go 
break at routine C_TEST_ROUTINES\test_c_code 
   166:     x = xdt$fregsav[0]; 
 
 

Now that the debugger has access to the source, you can put the debugger into screen mode to see exactly where you are and the code surrounding it.

Example 7-7 Using the Set Mode Screen Command

 
DBG> Set Mode Screen; Set Step Nosource 
 
- SRC: module C_TEST_ROUTINES -scroll-source------------------------------------ 
   151:     xdt$fregsav[5] = in64; 
   152:     xdt$fregsav[6] = in32; 
   153:     if (xdt$fregsav[9] > 0) 
   154:         *pVar =  (*pVar + xdt$fregsav[17])%xdt$fregsav[9]; 
   155:     else 
   156:         *pVar = (*pVar + xdt$fregsav[17]); 
   157:     xdt$fregsav[7] = test_c_code3(10); 
   158:     xdt$fregsav[3] = test; 
   159:     return xdt$fregsav[23]; 
   160: } 
   161: void test_c_code(void) 
   162: { 
   163:     int x,y; 
   164:     int64 x64,y64; 
   165: 
-> 166:     x = xdt$fregsav[0]; 
   167:     y = xdt$fregsav[1]; 
   168:     x64 = xdt$fregsav[2]; 
   169:     y64 = xdt$fregsav[3]; 
   170:     xdt$fregsav[14] = test_c_code2(x64+y64,x+y,x64+x,&y64); 
   171:     test_c_code4(); 
   172:     return; 
   173: } 
- OUT -output------------------------------------------------------------------- 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
- PROMPT -error-program-prompt-------------------------------------------------- 
 
 
 
 
 
 
DBG> 
 
 
 

Now, you want to set another breakpoint inside the test_c_code3 routine. You use the debugger's SCROLL/UP command (8 on the keypad) to move to that routine and see that line 146 would be a good place to set the breakpoint. It is at a recursive call. Then you proceed to that breakpoint with the GO command.

Example 7-8 Using the SCROLL/UP DEBUG Command

 
- SRC: module C_TEST_ROUTINES -scroll-source------------------------------------ 
   133: void test_c_code4(void) 
   134: { 
   135:     int i,k; 
   136:     for(k=0;k<1000;k++) 
   137:       { 
   138:          test_c_code5(&i); 
   139:       } 
   140:     return; 
   141: } 
   142: int test_c_code3(int subrtnCount) 
   143: { 
   144:     subrtnCount = subrtnCount - 1; 
   145:     if (subrtnCount != 0) 
   146:         subrtnCount = test_c_code3(subrtnCount); 
   147:     return subrtnCount; 
   148: } 
   149: int test_c_code2(int64 in64,int in32, int64 test, int64* pVar) 
   150: { 
   151:     xdt$fregsav[5] = in64; 
   152:     xdt$fregsav[6] = in32; 
   153:     if (xdt$fregsav[9] > 0) 
   154:         *pVar =  (*pVar + xdt$fregsav[17])%xdt$fregsav[9]; 
   155:     else 
- OUT -output------------------------------------------------------------------- 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
- PROMPT -error-program-prompt-------------------------------------------------- 
 
 
 
DBG> Scroll/Up 
DBG> set break %line 146 
DBG> go 
DBG> 
 
 
 

When you reach that breakpoint, the source code display is updated to show where you currently are, which is indicated by an arrow. A message also appears in the OUT display indicating you reach the breakpoint at that line.

Example 7-9 BreakPoint Display

 
 
- SRC: module C_TEST_ROUTINES -scroll-source------------------------------------ 
   135:     int i,k; 
   136:     for(k=0;k<1000;k++) 
   137:       { 
   138:          test_c_code5(&i); 
   139:       } 
   140:     return; 
   141: } 
   142: int test_c_code3(int subrtnCount) 
   143: { 
   144:     subrtnCount = subrtnCount - 1; 
   145:     if (subrtnCount != 0) 
-> 146:         subrtnCount = test_c_code3(subrtnCount); 
   147:     return subrtnCount; 
   148: } 
   149: int test_c_code2(int64 in64,int in32, int64 test, int64* pVar) 
   150: { 
   151:     xdt$fregsav[5] = in64; 
   152:     xdt$fregsav[6] = in32; 
   153:     if (xdt$fregsav[9] > 0) 
   154:         *pVar =  (*pVar + xdt$fregsav[17])%xdt$fregsav[9]; 
   155:     else 
   156:         *pVar = (*pVar + xdt$fregsav[17]); 
   157:     xdt$fregsav[7] = test_c_code3(10); 
- OUT -output------------------------------------------------------------------- 
break at C_TEST_ROUTINES\test_c_code3\%LINE 146 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
- PROMPT -error-program-prompt-------------------------------------------------- 
 
 
 
DBG> Scroll/Up 
DBG> set break %line 146 
DBG> go 
DBG> 
 
 

Now you try the debugger's STEP command. The default behavior for STEP is STEP/OVER, unlike XDELTA and DELTA, which is STEP/INTO, so, normally you would expect to step to line 147 in the code. However, because you have a breakpoint inside test_c_code3 that is called at line 146, you will reach that event first.

Example 7-10 Using the Debug Step Command

 
- SRC: module C_TEST_ROUTINES -scroll-source------------------------------------ 
   135:     int i,k; 
   136:     for(k=0;k<1000;k++) 
   137:       { 
   138:          test_c_code5(&i); 
   139:       } 
   140:     return; 
   141: } 
   142: int test_c_code3(int subrtnCount) 
   143: { 
   144:     subrtnCount = subrtnCount - 1; 
   145:     if (subrtnCount != 0) 
-> 146:         subrtnCount = test_c_code3(subrtnCount); 
   147:     return subrtnCount; 
   148: } 
   149: int test_c_code2(int64 in64,int in32, int64 test, int64* pVar) 
   150: { 
   151:     xdt$fregsav[5] = in64; 
   152:     xdt$fregsav[6] = in32; 
   153:     if (xdt$fregsav[9] > 0) 
   154:         *pVar =  (*pVar + xdt$fregsav[17])%xdt$fregsav[9]; 
   155:     else 
   156:         *pVar = (*pVar + xdt$fregsav[17]); 
   157:     xdt$fregsav[7] = test_c_code3(10); 
- OUT -output------------------------------------------------------------------- 
break at C_TEST_ROUTINES\test_c_code3\%LINE 146 
break at C_TEST_ROUTINES\test_c_code3\%LINE 146 
 
 
 
 
 
 
 
 
 
 
 
 
 
- PROMPT -error-program-prompt-------------------------------------------------- 
 
 
DBG> 
DBG> set break %line 146 
DBG> go 
DBG> Step 
DBG> 
 
 

Now, you try a couple of other commands, EXAMINE and SHOW CALLS. The EXAMINE command allows you to look at all the C variables. Note that the C_TEST_ROUTINES module is compiled with the /NOOPTIMIZE switch which allows access to all variables. The SHOW CALLS command shows you the call sequence from the beginning of the stack. In this case, you started out in the image EXEC_INIT. (The debugger prefixes all images other than the main image with SHARE$ so it shows up as SHARE$EXEC_INIT.)

Example 7-11 Using the Examine and Show Calls Commands

 
 
- SRC: module C_TEST_ROUTINES -scroll-source------------------------------------ 
   135:     int i,k; 
   136:     for(k=0;k<1000;k++) 
   137:       { 
   138:          test_c_code5(&i); 
   139:       } 
   140:     return; 
   141: } 
   142: int test_c_code3(int subrtnCount) 
   143: { 
   144:     subrtnCount = subrtnCount - 1; 
   145:     if (subrtnCount != 0) 
-> 146:         subrtnCount = test_c_code3(subrtnCount); 
   147:     return subrtnCount; 
   148: } 
   149: int test_c_code2(int64 in64,int in32, int64 test, int64* pVar) 
   150: { 
   151:     xdt$fregsav[5] = in64; 
   152:     xdt$fregsav[6] = in32; 
   153:     if (xdt$fregsav[9] > 0) 
   154:         *pVar =  (*pVar + xdt$fregsav[17])%xdt$fregsav[9]; 
   155:     else 
   156:         *pVar = (*pVar + xdt$fregsav[17]); 
   157:     xdt$fregsav[7] = test_c_code3(10); 
- OUT -output------------------------------------------------------------------- 
break at C_TEST_ROUTINES\test_c_code3\%LINE 146 
break at C_TEST_ROUTINES\test_c_code3\%LINE 146 
C_TEST_ROUTINES\test_c_code3\subrtnCount:       8 
 module name     routine name      line           rel PC           abs PC 
*C_TEST_ROUTINES test_c_code3       146       00000000000000C4 FFFFFFFF83002D64 
*C_TEST_ROUTINES test_c_code3       146       00000000000000D4 FFFFFFFF83002D74 
*C_TEST_ROUTINES test_c_code2       157       00000000000001A0 FFFFFFFF83002E40 
*C_TEST_ROUTINES test_c_code        170       0000000000000260 FFFFFFFF83002F00 
*XDELTA          XDT$SYSDBG_INIT   9371       0000000000000058 FFFFFFFF83052238 
*SYS$DOINIT      INI$DOINIT        1488       0000000000000098 FFFFFFFF830520B8 
 SHARE$EXEC_INIT                              0000000000018C74 FFFFFFFF83086C74 
 SHARE$EXEC_INIT                              0000000000014BD0 FFFFFFFF83082BD0 
 
 
 
- PROMPT -error-program-prompt-------------------------------------------------- 
DBG> 
DBG> set break %line 146 
DBG> go 
DBG> Step 
DBG> examine subrtnCount 
DBG> show calls 
DBG> 
 
 

If you want to proceed because you are done debugging this code, first cancel all the breakpoints and then enter the GO command. Notice, however, that you do not keep running but get a message that you have stepped to line 147. This happens because the STEP command used earlier never completed. It was interrupted by the breakpoint on line 146.

Note that the debugger remembers all step events and only removes them once they have completed.

Example 7-12 Canceling the Breakpoints

 
 
- SRC: module C_TEST_ROUTINES -scroll-source------------------------------------ 
   136:     for(k=0;k<1000;k++) 
   137:       { 
   138:          test_c_code5(&i); 
   139:       } 
   140:     return; 
   141: } 
   142: int test_c_code3(int subrtnCount) 
   143: { 
   144:     subrtnCount = subrtnCount - 1; 
   145:     if (subrtnCount != 0) 
   146:         subrtnCount = test_c_code3(subrtnCount); 
-> 147:     return subrtnCount; 
   148: } 
   149: int test_c_code2(int64 in64,int in32, int64 test, int64* pVar) 
   150: { 
   151:     xdt$fregsav[5] = in64; 
   152:     xdt$fregsav[6] = in32; 
   153:     if (xdt$fregsav[9] > 0) 
   154:         *pVar =  (*pVar + xdt$fregsav[17])%xdt$fregsav[9]; 
   155:     else 
   156:         *pVar = (*pVar + xdt$fregsav[17]); 
   157:     xdt$fregsav[7] = test_c_code3(10); 
   158:     xdt$fregsav[3] = test; 
- OUT -output------------------------------------------------------------------- 
break at C_TEST_ROUTINES\test_c_code3\%LINE 146 
break at C_TEST_ROUTINES\test_c_code3\%LINE 146 
C_TEST_ROUTINES\test_c_code3\subrtnCount:       8 
 module name     routine name      line           rel PC           abs PC 
*C_TEST_ROUTINES test_c_code3       146       00000000000000C4 FFFFFFFF83002D64 
*C_TEST_ROUTINES test_c_code3       146       00000000000000D4 FFFFFFFF83002D74 
*C_TEST_ROUTINES test_c_code2       157       00000000000001A0 FFFFFFFF83002E40 
*C_TEST_ROUTINES test_c_code        170       0000000000000260 FFFFFFFF83002F00 
*XDELTA          XDT$SYSDBG_INIT   9371       0000000000000058 FFFFFFFF83052238 
*SYS$DOINIT      INI$DOINIT        1488       0000000000000098 FFFFFFFF830520B8 
 SHARE$EXEC_INIT                              0000000000018C74 FFFFFFFF83086C74 
 SHARE$EXEC_INIT                              0000000000014BD0 FFFFFFFF83082BD0 
stepped to C_TEST_ROUTINES\test_c_code3\%LINE 147 
 
 
- PROMPT -error-program-prompt-------------------------------------------------- 
DBG> go 
DBG> Step 
DBG> examine subrtnCount 
DBG> show calls 
DBG> cancel break/all 
DBG> go 
DBG> 
 
 
 

The STEP/RETURN command, a different type of step command, single steps assembly code until it finds a return instruction. This command is useful if you want to see the return value for the routine, which is done here by examining the R0 register.

For more information about using other STEP command qualifiers, see the OpenVMS Debugger Manual.

Example 7-13 Using the Step/Return Command

 
 
- SRC: module C_TEST_ROUTINES -scroll-source------------------------------------ 
   137:       { 
   138:          test_c_code5(&i); 
   139:       } 
   140:     return; 
   141: } 
   142: int test_c_code3(int subrtnCount) 
   143: { 
   144:     subrtnCount = subrtnCount - 1; 
   145:     if (subrtnCount != 0) 
   146:         subrtnCount = test_c_code3(subrtnCount); 
   147:     return subrtnCount; 
-> 148: } 
   149: int test_c_code2(int64 in64,int in32, int64 test, int64* pVar) 
   150: { 
   151:     xdt$fregsav[5] = in64; 
   152:     xdt$fregsav[6] = in32; 
   153:     if (xdt$fregsav[9] > 0) 
   154:         *pVar =  (*pVar + xdt$fregsav[17])%xdt$fregsav[9]; 
   155:     else 
   156:         *pVar = (*pVar + xdt$fregsav[17]); 
   157:     xdt$fregsav[7] = test_c_code3(10); 
   158:     xdt$fregsav[3] = test; 
   159:     return xdt$fregsav[23]; 
- OUT -output------------------------------------------------------------------- 
break at C_TEST_ROUTINES\test_c_code3\%LINE 146 
break at C_TEST_ROUTINES\test_c_code3\%LINE 146 
C_TEST_ROUTINES\test_c_code3\subrtnCount:       8 
 module name     routine name      line           rel PC           abs PC 
*C_TEST_ROUTINES test_c_code3       146       00000000000000C4 FFFFFFFF83002D64 
*C_TEST_ROUTINES test_c_code3       146       00000000000000D4 FFFFFFFF83002D74 
*C_TEST_ROUTINES test_c_code2       157       00000000000001A0 FFFFFFFF83002E40 
*C_TEST_ROUTINES test_c_code        170       0000000000000260 FFFFFFFF83002F00 
*XDELTA          XDT$SYSDBG_INIT   9371       0000000000000058 FFFFFFFF83052238 
*SYS$DOINIT      INI$DOINIT        1488       0000000000000098 FFFFFFFF830520B8 
 SHARE$EXEC_INIT                              0000000000018C74 FFFFFFFF83086C74 
 SHARE$EXEC_INIT                              0000000000014BD0 FFFFFFFF83082BD0 
stepped to C_TEST_ROUTINES\test_c_code3\%LINE 147 
stepped on return from C_TEST_ROUTINES\test_c_code3\%LINE 147 to C_TEST_ROUTINES\test_c_code3\%LINE 148 
C_TEST_ROUTINES\test_c_code3\%R0:       0 
- PROMPT -error-program-prompt-------------------------------------------------- 
DBG> examine subrtnCount 
DBG> show calls 
DBG> cancel break/all 
DBG> go 
DBG> step/return 
DBG> examine r0 
DBG> 

After you finish the system code debugging session, enter the GO command to leave this module. You will encounter another INI$BRK breakpoint at the end of EXEC_INIT. An error message indicating there are no source lines for address 80002010 is displayed, because debug information on this image or module is not available.

Also notice that there is no message in the OUT display for this event. That is because INI$BRKs are special breakpoints that are handled as SS$_DEBUG signals. They are a method for the system code to break into the debugger and there is no real breakpoint in the code.

Example 7-14 Source Lines Error Message

 
 
- SRC: module SYSTEM_ROUTINES -scroll-source------------------------------------ 
 15896: Source line not available 
 15897: Source line not available 
   .
   .
   .
 15906: Source line not available 
->5907: Source line not available 
 15908: Source line not available 
   .
   .
   .
 15917: Source line not available 
 15918: Source line not available 
- OUT -output------------------------------------------------------------------- 
break at C_TEST_ROUTINES\test_c_code3\%LINE 146 
break at C_TEST_ROUTINES\test_c_code3\%LINE 146 
C_TEST_ROUTINES\test_c_code3\subrtnCount:       8 
 module name     routine name      line           rel PC           abs PC 
*C_TEST_ROUTINES test_c_code3       146       00000000000000C4 FFFFFFFF83002D64 
*C_TEST_ROUTINES test_c_code3       146       00000000000000D4 FFFFFFFF83002D74 
*C_TEST_ROUTINES test_c_code2       157       00000000000001A0 FFFFFFFF83002E40 
*C_TEST_ROUTINES test_c_code        170       0000000000000260 FFFFFFFF83002F00 
*XDELTA          XDT$SYSDBG_INIT   9371       0000000000000058 FFFFFFFF83052238 
*SYS$DOINIT      INI$DOINIT        1488       0000000000000098 FFFFFFFF830520B8 
 SHARE$EXEC_INIT                              0000000000018C74 FFFFFFFF83086C74 
 SHARE$EXEC_INIT                              0000000000014BD0 FFFFFFFF83082BD0 
stepped to C_TEST_ROUTINES\test_c_code3\%LINE 147 
stepped on return from C_TEST_ROUTINES\test_c_code3\%LINE 147 to C_TEST_ROUTINES\test_c_code3\%LINE 148 
C_TEST_ROUTINES\test_c_code3\%R0:       0 
- PROMPT -error-program-prompt-------------------------------------------------- 
DBG> examine r0 
DBG> go 
%DEBUG-I-INIBRK, target system interrupted 
%DEBUG-I-DYNIMGSET, setting image SYS$BASE_IMAGE 
%DEBUG-W-SCRUNAOPNSRC, unable to open source file SYS$COMMON:[SYSLIB]SYSTEM_ROUTINES.M64; 
-RMS-E-FNF, file not found 
DBG> 
 
 
 

Enter the SHOW IMAGE command. You will see more images displayed as the boot path has progressed further.

Finally, enter GO, allowing the target system to boot completely, because there are no more breakpoints in the boot path. The debugger will wait for another event to occur.

Example 7-15 Using the Show Image Command

 
- SRC: module SYSTEM_ROUTINES -scroll-source------------------------------------ 
 15896: Source line not available 
 15897: Source line not available 
   .
   .
   .
 15906: Source line not available 
->5907: Source line not available 
 15908: Source line not available 
   .
   .
   .
 15917: Source line not available 
 15918: Source line not available 
- OUT -output------------------------------------------------------------------- 
    PRO2                                FFFFFFFF8329C000       FFFFFFFF832A2DFF 
 SYSLICENSE                      no     0000000000000000       FFFFFFFFFFFFFFFF 
    NPRO0                               FFFFFFFF80188000       FFFFFFFF801883FF 
    NPRW1                               FFFFFFFF80CCC000       FFFFFFFF80CCC5FF 
    PRO2                                FFFFFFFF8321E000       FFFFFFFF832247FF 
    PRW3                                FFFFFFFF83226000       FFFFFFFF832265FF 
 SYSTEM_DEBUG                    yes    FFFFFFFF82FFE000       FFFFFFFF83056000 
 SYSTEM_PRIMITIVES_MIN           no     0000000000000000       FFFFFFFFFFFFFFFF 
    NPRO0                               FFFFFFFF80034000       FFFFFFFF800775FF 
    NPRW1                               FFFFFFFF80C31A00       FFFFFFFF80CA11FF 
 SYSTEM_SYNCHRONIZATION_UNI      no     0000000000000000       FFFFFFFFFFFFFFFF 
    NPRO0                               FFFFFFFF80078000       FFFFFFFF800835FF 
    NPRW1                               FFFFFFFF80CA1200       FFFFFFFF80CA35FF 
 
 total images: 40                bytes allocated: 2803296 
- PROMPT -error-program-prompt-------------------------------------------------- 
%DEBUG-I-INIBRK, target system interrupted 
%DEBUG-I-DYNIMGSET, setting image SYS$BASE_IMAGE 
%DEBUG-W-SCRUNAOPNSRC, unable to open source file X6P3_RESD$:[SYSLIB]SYSTEM_ROUTINES.M64; 
-RMS-E-FNF, file not found 
DBG> show image 
DBG> go 
 
 


Previous Next Contents Index

  [Go to the documentation home page] [How to order documentation] [Help on this site] [How to contact us]  
  privacy and legal statement  
6549PRO_028.HTML