═══ 1. Procedure Help for Debugger ═══ The Debugger Online Help is divided into four types of information:  Procedures - how to perform a specific task or set of tasks  Reference - technical information you may need to understand how to perform a task  User Interface - context-sensitive help pages displayed when you press F1 from within the debugger  Concepts - overview information you may need to understand basic principles of debugging or components of the debugger interface Procedure help is organized hierarchically, so that you start from a high-level task and follow it down to the specific task you want to perform. Help is available for the following high-level tasks:  Prepare a program for debugging  Start or stop debugging a program  Set breakpoints in your program  Step through, run, or halt your program  Debug variable contents and memory  Debug logic and program flow ═══ 1.1. Prepare a Program for Debugging ═══ To prepare a program for debugging, you may need to perform some or all of the following tasks:  Establish a debug environment  Write programs for debugging  Compile a program for debugging ═══ 1.1.1. Write Programs for Debugging ═══ You can make your programs easier to debug by following these simple guidelines:  Do not hand-tune your source code for performance until you have fully debugged and tested the untuned version. Hand tuning may introduce new bugs or make the logic of your code harder to understand.  Where possible, do not put multiple statements on a single line, because some debugger features operate on a line basis. For example, you cannot set line breakpoints on more than one statement on the same line. Although you can step over multiple statements on the same line, it is difficult to determine which statements on the current line have been executed already, and which ones have not.  Assign intermediate expression values to temporary variables to make it easier to verify intermediate results. To be able to debug your programs at the line level, you must specify compiler options that generate debug information. For information on these compiler options, and for other information on preparing your application for debugging, see the Debug Tool User's Guide and Reference. ═══ 1.1.2. Compile a Program for Debugging ═══ In order to be able to debug your program at the source code level, you need to compile your program with certain compiler options that instruct the compiler to generate symbolic information in the object file. The Related Topics section below points to information on how to compile your program for a specific environment. Related Information Reference Compiler Options on OS/390 Procedures Write Programs for Debugging ═══ 1.1.3. Establish a Debug Environment ═══ To establish a debug environment, you need to perform some or all of the following tasks:  Set environment variables for the debugger  Start the debug session ═══ 1.1.3.1. Set Environment Variables for the Debugger ═══ The debugger user interface running on the workstation uses certain environment variables to determine where it looks for source files, executables, online help, and so on. See the Related Topics below for help on the environment variables themselves. To set an environment variable for a given session of the debugger, do the following on your OS/2 or Windows workstation: 1. Open a command shell window. 2. Use the SET command to set each environment variable to the required value: SET VARNAME=VAL1;VAL2;VAL3 where VARNAME is the name of the environment variable, and VAL1, VAL2, and VAL3 are values assigned to it (normally multiple values for a variable are separated by semicolons). If you want to add more values to an existing variable, use the following syntax: SET VARNAME=%VARNAME%;VAL4;VAL5 This adds both the existing contents of VARNAME and the new values to the variable. 3. Invoke the debugger daemonfrom that command shell. If you want to set these environment variables permanently, or if you are debugging remotely to an OS/390 host via APPC, do the following, depending on the operating system you are using: From Control Panel select System, then within the System notebook choose the Environment tab. Select the variable you want to change from the list, or enter a new variable name in the Variable entry field, and enter its values in the Value entry field. Click on OK or Apply to save the changed or new variable. Add the SET... commands to your CONFIG.SYS file. A reboot is required for these changes to take effect. Related Information Reference Environment Variables ═══ 1.1.3.2. Invoke the Debugger ═══ How you invoke the debugger for an OS/390 program depends on the communications protocol you are using. See the following for details:  TCP/IP connection  APPC connection (OS/2 only) Related Information Procedures Start the Debug Tool under OpenEdition MVS ═══ 1.1.3.2.1. Establish an APPC Connection ═══ Follow these steps to debug a program running on an OS/390 system through APPC. 1. Set the DEBUG_LANG environment variable to indicate the dominant programming language for your application. (For debugging remotely to OS/390, only COBOL is supported.) You can set this from the command shell or in your OS/2 CONFIG.SYS file. Note that this variable is usually set for you during installation. 2. Start your application on OS/390 with the TEST runtime option. This will cause the Debug Tool to be loaded; it will then automatically establish a connection to the OS/2 workstation through APPC. You can specify the TEST runtime option as: TEST(,,,VADAPPC&machinename:*) where machinename is the APPC symbolic destination name for your workstation. The details of how to start your program with the TEST option vary depending on the OS/390 environment the program runs in. The environments supported are batch (JES), TSO, CICS, and BTS. For more information on specific environments, or on what you can specify with the TEST option, see the Debug Tool User's Guide and Reference. Related Information Reference DEBUG_LANG Environment Variable Procedures Start the Debug Tool under OpenEdition MVS ═══ 1.1.3.2.2. Establish a TCP/IP Connection ═══ Follow these steps to debug a program running on an OS/390 system through TCP/IP. 1. Set the DEBUG_LANG environment variable to indicate the dominant programming language for your application. (For debugging remotely to OS/390, only COBOL is supported.) You can set this from the command shell, in your CONFIG.SYS file (OS/2), or in System Settings (Windows). Note that this variable is usually set for you during installation. 2. Start the remote debug daemon on the workstation. Click on the Remote Debug Daemon icon or shortcut, start the daemon from a WorkFrame MVS project, or issue the following command and options: idbugd -qport=nnnn -v where nnnn is a TCP/IP port such as 8000 or 8001 (note that this same port number must be specified when you start your application on OS/390). The daemon only needs to be started once. You can then conduct as many remote debug sessions as needed without having to restart the daemon. 3. Start your application on OS/390 with the TEST runtime option. This will cause the Debug Tool to be loaded. You can specify the TEST runtime option as: TEST(,,,VADTCPIP&machinename%nnnn:*) where machinename is the ip address of your workstation and nnnn is the same TCP/IP port number as specified on the idbugd command. If omitted, the port number defaults to 8000. The details of how to start your program with the TEST option vary depending on the OS/390 environment the program runs in. The environments supported are batch (JES), TSO, CICS, and BTS. For more information on specific environments, or on what you can specify with the TEST option, see the Debug Tool User's Guide and Reference. Related Information Reference DEBUG_LANG Environment Variable Procedures Start the Debug Tool under OpenEdition MVS ═══ 1.1.3.2.3. Start the Debug Tool under OpenEdition MVS ═══ As with MVS or TSO you must set up your STEPLIB so that the application to be debugged, the debugger and the runtime library can be found. Also you need to specify the runtime TEST option. If you did not compile with #pragma runopts then you need to specify this option through the system variable _CEE_RUNOPTS One possibility is to create a shell script in OpenEdition MVS with the following commands: #comment export STEPLIB=SHRC390.DEBUG.LEVEL4.SEQAMOD :SHARE.CEE170.SCEERUN export _CEE_RUNOPTS='TEST(,,,VADTCPIP&WRKST:*) POSIX(ON)' To set up your environment and execute myprog in the shell, invoke the shell script. Debug Tool should connect to the waiting debugger user interface on the workstation. The C runtime library must be Language Environment 1.7 or later in the exported STEPLIB variable. If your program is an MVS executable you need to:  Create an OpenEdtion file which has the same name as the MVS executable  Set the file's attributes to be executable with the sticky bit on  Put the MVS PDS or PDSE in the STEPLIB variable  Set the Language Environment runtime TEST option to invoke the debugger  Run the OpenEdition file, which is essentially a link to the MVS one. An example of doing this is: >touch /u/userid/myprog10 >chmod 1700 /u/userid/myprog10 >export STEPLIB=USERID.PROJ1.LOAD:$STEPLIB >export _CEE_RUNOPTS='TEST(,,,VADTCPIP&9.24.25.26:*) POSIX(ON)' >/u/userid/myprog10 The program to be debugged is USERID.PROJ1.LOAD(MYPROG10) ═══ 1.1.3.3. Use the Source Window ═══ Use the Source window to view the progress of your program as you debug it. The Source window displays your program's source code, and updates the display after each step or run command. You can set or clear breakpoints, add variables or expressions to a monitor, and more. See the following tasks related to using the Source window:  View different source files  Set and clear breakpoints  Add expressions and variables to a monitor  Run your program  Step through your program  Open other windows and monitors ═══ 1.1.3.3.1. View Different Source Files ═══ When you start the debugger, a single Source window appears. If your executable file was linked from several object files, you can open a Source window for each object, and view several source files at once: 1. Raise the Session Control window by selecting it from the Windows menu of any main debugger window 2. Click on the + icon beside the name of the executable, to open a list of object files 3. Double-click on the object file you want to view. If that object file is not already in a Source window, a new Source window opens containing the source file for that object file. You can also open new Source windows from the File menu of the Session Control window or of an existing Source window: 1. Select File->Open new source 2. Enter the name of the source file. This source file must be a part of the application you are currently debugging. 3. Click on OK. A Source window for the new source file opens, if the debugger is able to locate the file. Related Information Procedures Open Other Debugger Windows Use the Source Window Reference Problems Getting a Source View ═══ 1.1.3.4. Open Other Debugger Windows ═══ You can open other Source windows from a Source window or from the Session Control window. To open a monitor window from a Source window, click on a monitor toolbar button or select the desired monitor from the Monitors menu. You can also open a monitor window by adding a variable to that monitor, in one of the following ways:  Click the right mouse button on the variable in the Source window, then select the appropriate monitor from the popup menu.  Double-click the left mouse button on the variable, to add the variable to the Program monitor.  Click the right mouse button on the variable, press Ctrl+M, and select the desired monitor from the Monitor Expression dialog. To open the Breakpoints list window, select Breakpoints->List from the menu bar, or press Ctrl+X. To change the focus from a Source window to another window that is already opened (or minimized), select that window from the Windows menu. Related Information Procedures View Different Source Files Add Expressions and Variables to a Monitor ═══ 1.2. Start or Stop Debugging a Program ═══ To start or stop debugging a program, you will need to know how to perform some of the following subtasks:  Invoke the debugger  Set breakpoints in your program  Step through or run a program ═══ 1.2.1. Start Debugging a Compile Unit from a Load Occurrence Breakpoint Dialog ═══ You can set a breakpoint in a compile unit that causes execution to stop when the compile unit is first loaded by your application. The compile unit is generally loaded by your application the first time a function contained within the compile unit is called by another function within your application.This type of breakpoint is called a load occurrence breakpoint. To set a load occurrence breakpoint, do the following: 1. From the Breakpoints menu of the Session Control or Source windows, or from the Set menu of the Breakpoints List window, choose Set load occurrence breakpoint. 2. In the Load Occurrence Breakpoint dialog, enter the name of the compile unit you want to set the breakpoint in. 3. Click on OK to set the breakpoint and close the Load Occurrence Breakpoint dialog, or click on Set if you want to set more load occurrence breakpoints. When you run your application, execution will stop when the compile unit is first loaded. ═══ 1.2.2. Start Debugging a Compile Unit from the Breakpoints List Window ═══ You can start debugging a compile unit from the Breakpoints List window by setting a line breakpoint in that compile unit, then issuing the Run command. You can only do this if the compile unit you want to place the breakpoint in was compiled with debug information. To set a line breakpoint in a compile unit and then start debugging the compile unit, do the following: 1. Open a Breakpoints List window 2. From the Set menu choose Set line 3. In the Line Breakpoint dialog, from the Source pulldown list choose the compile unit containing the code you want to debug. 4. In the Line entry field, enter the line number within the source file you want to place a breakpoint in. 5. Click on the Defer breakpoint check box. 6. Issue the Run command by pressing Ctrl+R. You can also use a function breakpoint instead of a line breakpoint to accomplish the same task. Follow the above instructions, but choose Set -> Set function instead of Set -> Set line, and select the desired function name from the pulldown list in the breakpoint dialog. Related Information Procedures Set a Deferred Breakpoint Set a Line Breakpoint ═══ 1.2.3. Start Debugging a Compile Unit from the Session Control Window ═══ You can use the Session Control window to access a Source window containing the source for a compile unit you want to debug. 1. In the Session Control window, expand the Components Pane entry for the compile unit you want to debug. 2. Continue expanding appropriate items in the list until you find the source file or function you want to debug. If the source file or function is not listed, you may not have compiled the function with debug information. 3. Double-click on the source file or function to raise a Source window for it. 4. Set a line, function, or other breakpoint at an appropriate point in that source window. 5. Run your program. Related Information Procedures Run a Program Set Breakpoints ═══ 1.3. Set Breakpoints in Your Program ═══ You can set breakpoints in your program from a number of windows. See the following subtasks:  Set breakpoints from the Breakpoints List window  Set breakpoints from a Source window  Set function breakpoints from the Session Control window ═══ 1.3.1. Set Breakpoints in the Breakpoints List Window ═══ To set breakpoints from the Breakpoints List window, open the window (if it is not already open), using one of the following methods 1. Type Ctrl+X from any main debugger window or monitor 2. Select List from the Breakpoints menu of the Source window 3. Click on the button in the Source Window 4. Position the cursor in the prefix area, click mouse button 2, and select List from the popup menu. Then do the following: 1. From the Breakpoints List window, select the type of breakpoint you want to set from the Set menu. 2. Enter the information for the breakpoint in the dialog, and click on OK or press the Enter key. You can set breakpoints from the Source window and the Session Control window as well. Unless you want to set multiple breakpoints with the same nonstandard optional parameters, you may find it easier to use the Source window for setting line breakpoints, and the Session Control window for setting function breakpoints. Storage change breakpoints and load occurrence breakpoints can be set from any of the three windows. Related Information Procedures Set Multiple Breakpoints Set and Clear Breakpoints from a Source Window Set Function Breakpoints from the Session Control Window Concepts Types of Breakpoints ═══ 1.3.2. Set and Clear Breakpoints from a Source Window ═══ You can set and clear breakpoints from a Source window in the following ways:  Toggle a breakpoint on or off for a line. There are three ways to do this: - Double-click on the prefix area for that line - Highlight the line using either the up and down cursor keys or the mouse, then press the space bar - Highlight the line, then select Breakpoints->Toggle at current line.  From the prefix area, or while the pointer is over a function name, click on mouse button 2 [note] and select a breakpoint option from the popup menu  Open a Breakpoints List window, and set or clear the breakpoint from there  Select a type of breakpoint from the Breakpoints menu, and enter the appropriate information. Note: Clearing a breakpoint deletes it, meaning that you must recreate it if you want to use it again. If you plan to use a breakpoint again later, it is better to disable the breakpoint instead. Related Information Procedures Enable and Disable Breakpoints ═══ 1.3.3. Set Function Breakpoints from the Session Control Window ═══ You can set function breakpoints in the Session Control window by either of the following methods:  Go to the Breakpoints menu and choose Set function breakpoint  Select a function in the Components pane, click mouse button 2 to bring up a popup menu, and choose Set function breakpoint. Related Information Procedures Set Breakpoints ═══ 1.3.4. Set a Deferred Breakpoint ═══ A deferred breakpoint is a breakpoint set in a compile unit that is not currently loaded. To set a deferred line breakpoint, do the following: 1. Open a Line breakpoint dialog in one of the following ways:  From a Source window or the Session Control window, select Breakpoints->Set line  From a Breakpoint List window, select Set->Set line. 2. Enter an asterisk (*) in the Executable field, or the name of the load module if the compile unit is not in the main load module. 3. Enter the line number where you want the breakpoint set 4. Specify any additional information you wish in the Optional Parameters group box. 5. Check the Defer breakpoint check box. 6. Click on OK or press Enter. You can set function breakpoints in a similar manner. Related Information Procedures Start Debugging a Compile Unit from a Load Occurrence Breakpoint Dialog Start Debugging a Compile Unit from the Session Control Window ═══ 1.4. Run or Step Through a Program ═══ You can use debugger toolbar buttons, accelerator keys, and menu commands to accomplish the following subtasks:  Run your program  Step through your program ═══ 1.4.1. Run a Program ═══ After you have set appropriate breakpoints in your program, you are ready to issue the Run command. The debugger runs the program from the current line to the first enabled breakpoint it encounters and a Source window displays the current line. You can then examine the contents of storage, variables, the call stack, or processor registers; step through your program; or issue the Run command again to run to the next enabled breakpoint. Related Information Procedures Set Breakpoints Step through a Program View Variables, Memory, Registers, and the Stack ═══ 1.4.2. Step through a Program ═══ Use the Step Over and Step Into commands to step through your program one statement at a time. For statements that do not contain a subroutine call or method invocation, these commands work in exactly the same way. The current statement is executed. Then, if the next statement is on a different line, the debugger moves the current line in the current Source window to the next executable line (comment and blank lines are skipped). If the next statement is on the same line, the debugger does not reposition the current line. The Step Over command works differently from the Step Into command, for statements that call subroutines and invoke methods: with function calls:  When you issue a Step Over command, the debugger runs through all functions called from within the line, the called routine or function, and execution stops at the next line in the Source window you issued the Step Over command from. (If the debugger encounters an enabled breakpoint in a called function, execution stops at that breakpoint.)  When you issue a Step Into command, the debugger stops at the next statement for which debug information is available. This statement is the first statement of the called function, if that function was compiled with debug information. If not, it is the first statement in another function further down the call, if a function within the call has debug information. If neither the called function nor any function it calls was compiled with debug information, the debugger stops at the statement following the call. When you are inside a function and want to return to the code that issued the call, you can use the Step Return command. If the debugger can determine a return address, it runs the program up to but excluding the statement immediately after the one containing the call. ═══ 1.4.3. Terminate a Debug Session ═══ To terminate a debug session and exit the debugger, do one of the following:  Select File->Close debugger from any debugger window that has a File menu.  Press F3 from any debugger window that is not a dialog  Switch to the Session Control window and use your windowing system's technique for closing that window. For example, OS/2 and Windows operating systems, double-click on the upper left corner of the window or press Alt+F4. ═══ 1.5. Debug Variable Contents and Memory ═══ Choose from among the following subtasks:  Change the contents of storage  View a location in storage  Add expressions and variables to a monitor  Open a new storage monitor  View variables, memory, registers, and the stack ═══ 1.5.1. Change the Contents of Storage, Variables, and Registers ═══ To change the contents of storage in a Storage monitor, do the following: 1. Raise or open a Storage monitor (select Storage monitor from the Monitors menu of the Source or Session Control windows, or press Ctrl+G, or click on the button) 2. If the address whose contents you want to change is not shown, use the PageUp and PageDown keys to scroll to that address, or click on an entry in the address column and enter a new address 3. Double-click on an entry in a data column in the monitor (or click on the entry and press Enter) 4. Type a value that is valid for the shown representation 5. Press Enter. To change the contents of a variable in a Local Variables, Program, Private, or Popup monitor, or a register in the Registers monitor, do the following: 1. Raise or open the appropriate monitor (from the Monitors menu of a Source window or the Session Control window, or using the appropriate accelerator key or toolbar button) 2. Double-click on the entry field that shows the contents of the variable or register you want to change 3. Type a value that is valid for the current representation of that variable or register 4. Press Enter. Related Information Reference Values that Are Valid for the Current Representation ═══ 1.5.1.1. Use the Registers Monitor ═══ Here are some of the common tasks you can perform from the Registers monitor:  Change the contents of registers  Change what kinds of registers are displayed ═══ 1.5.1.1.1. View the Contents of Registers ═══ You may want to view the contents of a single register, or of many registers at once. View Contents of a Single Register If you only want to view the contents of a small number of registers, enter the names of those registers as expressions in a Monitor Expression dialog and select what monitor you want them to appear in. For example, if you want to monitor the EAX register on an Intel machine, do the following: 1. From a Source window, select Monitors->Monitor expression from the menu bar, or press the Ctrl+M accelerator key, to open a Monitor expression dialog. 2. Enter the register name as the expression (EAX) 3. Choose what monitor you want the expression to appear in. Do not choose the storage monitor. 4. Click on the OK button or press Enter. The register is displayed in the monitor you selected. Note that if the name of the register corresponds to the name of a variable in your program, the variable may be displayed instead of the register depending on the monitor you choose, the current scope, and the scope of the variable. View Contents of Many Registers at Once If you want to open a monitor showing the contents of all or most processor registers, do the following: 1. Raise a Source window or the Session Control window 2. Select Monitors->Registers or click on the pushbutton. 3. A Registers Monitor displays the contents of processor registers for the current thread. Related Information Procedures Add Expressions and Variables to a Monitor Change the Contents of Registers Change Which Registers Are Displayed Use the Registers Monitor Concepts Introduction to the Registers Monitor ═══ 1.5.1.1.2. Change Which Registers Are Displayed ═══ You can choose what groups of registers are displayed in the Registers monitor by selecting Options->Display style. In the dialog that appears, select what items you want to display. Related Information Concepts Introduction to the Registers Monitor Procedures Change the Contents of Registers View the Contents of Registers Reference Registers Monitor Split Bars ═══ 1.5.1.1.3. Change the Contents of Registers ═══ Caution: Changing the contents of registers that affect program flow (for example, registers used to manipulate the stack) can destabilize the program you are debugging and may cause it to terminate abnormally. You can change the contents of most registers in the Registers monitor as follows: 1. Either double-click on the current value of the register or move the cursor to that register and press Enter. 2. Type in a new value, and press Enter. If updating of the register is allowed and your entry can be evaluated to a value the register supports, the register is updated. Note: On OS/390, you cannot change the contents of the IAR (Instruction Address Register) register, which displays the currently executing instruction's address. Related Information Reference Valid Entries for Registers Expressions Supported ═══ 1.5.2. Add Expressions and Variables to a Monitor ═══ From the Source window, you can add a variable or expression to a monitor, so that you can keep track of how the variable's contents or the expression's value changes during program execution. You can use any of the following methods:  Position the pointer over the variable, click mouse button 2 [note], and select the monitor you want from the popup menu.  Highlight the variable or expression, then select Monitors->Monitor expression. A dialog opens containing the variable or expression; select a monitor from there.  Select Monitors->Monitor expression. In the dialog, enter the variable or expression and choose a monitor.  Double-click on a variable to add it to the Program monitor. Related Information Reference Expressions Supported ═══ 1.5.3. Open a New Storage Monitor ═══ You can bring up a new Storage monitor in a number of ways:  Click on the toolbar button from a Source window or the Session Control window.  Select Monitors->Storage from a Source window or the Session Control window.  Highlight an expression in a Source window, click mouse button 2 [note], and select Add to storage monitor from the popup menu.  Select Monitors->Monitor expression from a Source window or the Session Control window, enter the expression you want to monitor, and select the Storage monitor radio button. A new storage monitor opens each time you do one of the above, even if you already opened another storage monitor for the same Source window, variable or expression. Related Information Procedures Open Other Debugger Windows Change the Storage Monitor Address Range ═══ 1.5.4. View Variables, Memory, Registers, and the Stack ═══ Follow one or more of the tasks below:  Add a variable or expression to a monitor so you can view or change its contents  View variable contents  View storage contents  View the contents of registers  View the contents of the call stack ═══ 1.5.4.1. View Variable Contents ═══ To view the contents of a variable you have already added to a monitor, do the following: 1. Raise a window that contains a Windows menu (for example, a Source window or the Session Control window) 2. Select the monitor you added the variable to from that Windows menu. 3. If necessary, use the scroll bars or PageUp and PageDown keys to scroll the monitor until the variable is visible. 4. If necessary, change the representation of the variable: select its contents, click on mouse button 2, and select Next representation from the popup menu. To view the contents of a variable you have not yet added to a monitor, do one of the following:  If the variable is in scope in the current Source window, select Monitors->Local variables from the menu bar of the Source window to open a Local variables monitor. This monitor should contain all local variables that are currently in scope. If the value of the variable you are looking for is blank, invalid, or incorrect, the variable may not currently be in scope.  Add the variable to a monitor (see under Procedures below). Related Information Procedures Add Expressions and Variables to a Monitor Debug Variable Contents and Memory ═══ 1.5.4.2. View a Location in Storage ═══ To view a particular location in storage (for example, the storage used by a variable), either select Options->Monitor expression from the Storage monitor, or open a new Storage monitor from a Source window or the Session Control window, and specify an expression to monitor. See the Reference section below for information on what types of expressions the debugger supports. COBOL: If a variable whose type is other than POINTER is specified, the Storage monitor opens at the address of that variable. For variables of type POINTER, the storage monitor opens at the address contained in the variable. C++: To view the storage for a class object or a variable, specify the address of the object or variable name by preceding the name with an ampersand (&). Related Information Reference Expressions Supported Procedures Change the Contents of Storage, Variables, and Registers Add Expressions and Variables to a Monitor Change the Representation of Storage ═══ 1.5.4.2.1. Change the Storage Monitor Address Range ═══ You can change the address range you want displayed in a Storage monitor to a specified address. Double-click on an entry in one of the address columns (for example, the 'Flat' column), or move the cursor to that entry and press Enter; then enter a new address. You can also scroll through the range using the cursor keys (including Page Up and Page Down), or using the scrollbar. If the debugger cannot determine the contents of storage at a particular location, it displays the contents as a series of question marks (?). This can occur when you display storage that your program does not own or when the address range does not point to a valid storage area. If you want to view the storage associated with a different variable, adding that variable to a new Storage monitor is easier because the debugger determines the variable's address in storage for you. You may want to close the old Storage monitor first if its contents are no longer needed. Related Information Procedures Add Expressions and Variables to a Monitor Change the Contents of Storage, Variables, and Registers Change the Representation of Storage Open a New Storage Monitor View a Location in Storage Concepts Introduction to the Storage Monitor ═══ 1.5.4.2.2. Change the Representation of Storage ═══ To change the representation of storage in the Storage monitor, do one of the following:  Select a representation from Options->Display style, OR  Click on the appropriate display style toolbar button: . The change in representation does not affect any other open storage monitors, only the one in which you make the change. Related Information Procedures Change the Contents of Storage, Variables, and Registers Change the Storage Monitor Address Range ═══ 1.5.4.3. View the Contents of the Call Stack ═══ You can view information for the active functions on a thread's stack. A function is on the stack from the time it is called until after it returns. To view stack information for functions, open or raise a Call Stack window in one of the following ways:  If a Call Stack monitor is already open, access it from the Windows menu of any debugger window that contains this menu.  Select Monitors->Call stack from a Source or Session Control window, or press the Ctrl+K accelerator key, or click on the toolbar button. Related Information Procedures Use the Call Stack Window Concepts Introduction to the Call Stack Window ═══ 1.5.4.4. Use the Call Stack Window ═══ You can display functions in the Call Stack window in two orders: the order in which they were called, and the order in which they will return (in other words, with the most recently called function on top or on the bottom). To change the order, click on the Growth Direction button () or select Display style and change the setting of the Growth direction group box. To view the code for a function, position the pointer over the line for that function, and do one of the following:  Select the line and press Enter  Double-click with mouse button 1  Click mouse button 2 [note] and select View from the popup menu A Source window appears containing the source for the function. If this function is the current function, the current execution point is highlighted. Otherwise, the line that called the next innermost function on the call stack is highlighted. You can select what type of information is displayed in the Call Stack window by changing the display style. You can choose to display the program unit name, call statement number, compilation date/time, and other information. Related Information Concepts Introduction to the Call Stack Window ═══ 1.6. Debug Logic and Program Flow ═══ To debug logic and program flow, you may need to perform the following subtasks:  Set, clear, enable, and disable breakpoints  Step through, run, or halt a program  Skip over sections of code using Jump to location commands  View the contents of variables, memory, registers, and the stack. ═══ 1.6.1. Set, Clear, Enable, and Disable Breakpoints ═══ See the following subtasks:  Set breakpoints  Clear breakpoints  Enable and disable breakpoints  Modify breakpoint characteristics ═══ 1.6.1.1. Set Breakpoints ═══ You can set breakpoints from the following windows:  Breakpoints List window  Source window  Session Control window (function breakpoints only) Related Information Procedures Set Multiple Breakpoints Concepts Types of Breakpoints Introduction to the Breakpoints List Window ═══ 1.6.1.1.1. Set a Line Breakpoint ═══ You can set a line breakpoint from a Source window or from the Breakpoints List window. There are three ways to set a line breakpoint from the Source window: 1. Make sure the appropriate line is visible in the window (use the scroll bar or cursor keys to locate it), then double-click on the line number in the prefix area of the line. 2. Type the line number in the source window. A Line number dialog opens up. The line number you entered is placed in the dialog entry field. Click on the the Breakpoint button. 3. Select Breakpoints->Set line from the menu bar, and fill in appropriate fields in the resulting Line breakpoint dialog box as described below for the Breakpoints List window. To set a line breakpoint in a Breakpoints List window, do the following: 1. Select Set->Line from the menu bar. 2. In the resulting Line breakpoint dialog box, enter the line number and source file you want to place the breakpoint in. 3. Enter other conditions for your breakpoint, such as the frequency, if you like. Related Information Procedures Set Breakpoints Set Breakpoints in the Breakpoints List Window Set and Clear Breakpoints from a Source Window Concepts Types of Breakpoints ═══ 1.6.1.1.2. Set Multiple Breakpoints ═══ You can set several breakpoints with the same optional parameters from a Type Breakpoint dialog, where Type corresponds to the type of breakpoint (Line, Function, Storage change, Load occurrence). To do this, follow these steps: 1. From the breakpoint dialog, enter the information for the first breakpoint. Change any fields in the Optional Parameters section of the window, as desired. 2. Click on Set. The settings are saved for the current breakpoint. 3. For each additional breakpoint, enter only the changed information (for example, the new line number, new function name, new address), and again click on Set. 4. After you have set the last breakpoint, click on Cancel to dismiss the dialog. Related Information Procedures Set Breakpoints ═══ 1.6.1.2. Delete Breakpoints ═══ To delete all breakpoints at once, select Edit->Delete all from the Breakpoints List window. To delete individual breakpoints, position the pointer over the desired breakpoint, click on mouse button 2, and select Delete. When you delete a breakpoint, all information about it is lost. If you want to temporarily deactivate a breakpoint and activate it later, you should disable the breakpoint instead. Related Information Procedures Enable and Disable Breakpoints ═══ 1.6.1.2.1. Delete All Breakpoints ═══ You can delete all breakpoints for your program from the Breakpoints List window in three ways:  Click on the toolbar button  Select Delete all from the Edit menu  Position the pointer on a breakpoint in the list, click mouse button 2, and select Delete all from the popup menu. Once you have deleted all breakpoints, all information on them is lost. If you want to temporarily prevent all breakpoints from stopping execution, but you may need to activate them later, disable them instead, by selecting Edit->Disable all. Related Information Procedures Enable and Disable Breakpoints ═══ 1.6.1.3. Enable and Disable Breakpoints ═══ You can disable a breakpoint so that it does not stop execution, and then later enable it again. The advantage of disabling a breakpoint instead of deleting it is that it is easier to enable a breakpoint than to recreate it. The debugger lets you:  Enable breakpoints one at a time  Disable breakpoints one at a time  Enable all breakpoints at once  Disable all breakpoints at once. Related Information Procedures Delete Breakpoints Set Breakpoints ═══ 1.6.1.4. Modify Breakpoint Characteristics ═══ Note: Modifying breakpoints is not supported for OS/390 debugging. You can still enter values in the dialog, however when you click on OK or Set, a popup error message displays. To modify breakpoint characteristics for OS/390 debugging, delete the breakpoint in question and add it again with the desired characteristics. You can change the following characteristics of a breakpoint:  Which threads the breakpoint applies to  How often the debugger should skip the breakpoint (the frequency) You can also change the Required parameters fields for a breakpoint, which amounts to deleting the existing breakpoint and setting a new one. To change a breakpoint's characteristics, select the breakpoint in the Breakpoints List window and choose Edit->Modify, or place your pointer over the breakpoint, click mouse button 2, and select Modify. A Type Breakpoint window opens, where Type corresponds to the type of breakpoint (Line, Function, Storage change, Load occurrence), with the current settings for the breakpoint already placed in the window's fields. For information on individual fields within each window, see that window's help. Related Information Procedures Set a Deferred Breakpoint ═══ 1.6.2. Skip over Sections of Code ═══ You can change the current execution point in a debugging session to another location in the current Source window, so that certain lines are executed again, or are skipped over when they otherwise would not be. From within the Source window containing the current execution point, do the following: 1. Scroll to the line number you want to jump to, if it is not already visible. 2. Issue the Jump to location command by doing one of the following:  Click on the prefix area for the line, click mouse button 1, and select Jump to location from the popup menu  Select the line, then select Run->Jump to location from the menu bar  Select the line, then press the N key, which is the accelerator for the Jump to location command. Note that using Jump to location can cause unpredictable results if you jump outside the current function, jump over code that has side-effects (for example, calls to functions whose results are assigned to variables, or functions that change the contents of variables passed by reference), or jump into the middle of a block such as a for loop. ═══ 2. Concepts Help for Debugger ═══ The Debugger Online Help is divided into four types of information:  Procedures - how to perform a specific task or set of tasks  Reference - technical information you may need to understand how to perform a task  User Interface - context-sensitive help pages displayed when you press F1 from within the debugger  Concepts - overview information you may need to understand basic principles of debugging or components of the debugger interface Concepts help is organized hierarchically; see the following main topics:  Main debugger windows  Monitors ═══ 2.1. Main Debugger Windows ═══ You can get to help on the following debugger windows from here:  Source Window  Call Stack Window  Breakpoint List Window  Session Control Window See also the following main help pages:  Dialogs  Monitor Windows  Other Help Topics ═══ 2.1.1. Introduction to the Source Window ═══ The Source window displays the source code for the program you are debugging. You can either step through or run your program from the Source window. A step command lets you step through your program, usually one statement at a time. Step commands are useful for monitoring logic flow, and for seeing how variables, storage, registers, or the stack are affected by each line that you step through. The Run command runs your program up to the next breakpoint, or until an exception that is not handled occurs, or until the program ends. Breakpoints are markers you place in your program to tell the debugger to stop whenever execution reaches that point. For example, if a particular statement in your program is causing problems, you could set a breakpoint on the line containing the statement, then run your program. Execution stops at the breakpoint, before the statement is executed, and you can check the contents of variables, registers, storage, and the stack, then either step over the statement to see how the problem arises, or jump over the statement to temporarily circumvent the problem. Related Information Procedures Run a Program Run or Step Through a ProgramStep through a Program Set and Clear Breakpoints from a Source Window Reference When You Start Debugging Problems Getting a Source View Prefix Area ═══ 2.1.2. Introduction to the Call Stack Window ═══ When one function calls another, information about the calling function is placed on the stack for the executing thread. The debugger examines the stack and the processor registers to determine all functions that have been called for that thread, and lists these functions in the Call Stack window. Each Call Stack window displays information for a single thread. The thread number is indicated in the window title. Related Information Procedures Use the Call Stack Window ═══ 2.1.3. Introduction to the Breakpoints List Window ═══ Use the Breakpoints List window to view breakpoints for your program, delete them, or add new ones. Related Information Procedures Set Breakpoints Delete Breakpoints Enable and Disable Breakpoints Modify Breakpoint Characteristics (not supported on OS/390) View Popup Choice Reference Breakpoints List Popup Menu ═══ 2.1.3.1. Types of Breakpoints ═══ The debugger supports the following types of breakpoints:  Statement breakpoints are triggered before a statement at a particular point is executed.  Function breakpoints are triggered when the function they apply to is reached.  Storage change breakpoints are triggered when the storage within a particular address range is written to.  Load occurrence breakpoints are triggered when a DLL or dynamically loaded module is loaded into an application. This happens the first time a reference is made to a function within the DLL or dynamically loaded module. Related Information Procedures Set Breakpoints ═══ 2.1.4. Introduction to the Session Control Window ═══ The Session Control window is the control window of the debugger, and is displayed during the entire debugging session. It contains a status line that indicates what the debugger is doing (for example, Ready). The window is divided into two panes. The left pane, called the Threads pane, shows the active threads for the program, while the right pane, called the Components pane, shows the list of object files. You can resize these panes with the mouse by dragging the split bar between them to the left or right. Use the mouse or the cursor left and right keys to shift the focus between the panes. You can expand the items in these panes by clicking on the '+' to their left, and you can collapse them by clicking on the '-'. Related Information Reference Using the Threads Pane Using the Components Pane ═══ 2.2. Monitors ═══ You can view help on the following debugger monitor windows:  Registers Monitor  Storage Monitor  Monitor Expression Dialog  Popup Monitor  Private Monitor  Program Monitor  Local Variables Monitor Help is also available on the following monitor-related topics:  Popup Menus for Private and Program Monitors  Differences Between the Program and Private Monitors See also the following main help pages:  Main Debugger Windows  Dialogs  Other Help Topics ═══ 2.2.1. Introduction to the Program Monitor ═══ You can monitor variables and expressions from Source windows in the Program monitor. This monitor is not associated with any particular Source window, and remains open until you close it directly or exit the debugger. Use it to monitor global variables or variables you want to see at all times during your debugging session. You can open the Program monitor from a Source window by adding a variable or expression to the program monitor. From within the Program monitor, you can select one or more expressions or variables, and access a popup menu to apply changes to them. For example, you can delete an expression from the monitor, change its representation, or edit its contents. Expressions and variables that have a '+' on their left can be expanded, and those with a '-' can be collapsed. Arrays and C++ class objects, for example, are displayed by default in expanded format, with entries both for the array and for elements within it. To collapse the list of elements, or to expand a collapsed list, double-click on the '+' or '-', or place the cursor on that line and press the Enter key. C++ only: Pointers are displayed with a '>' on their left. You can change an array or class object to pointer representation by dereferencing it. You can display the value of the pointer, or the start of the memory it points to, by choosing a different representation for it. Related Information Procedures Add Expressions and Variables to a Monitor ═══ 2.2.2. Introduction to the Private Monitor ═══ You can monitor variables and expressions from a given Source window in a Private monitor, which is associated with only that Source window. Private monitors help you keep track of local variables and expressions in programs with multiple compile units. They are particularly useful in cases where the number of variables or expressions is large, or where variables with the same name appear in different compilation units. You can open a Private monitor for a Source window by adding an expression or variable to the Private monitor from that Source window. From within a Private monitor, you can select one or more expressions or variables, and access a popup menu to apply changes to them. For example, you can delete an expression from the monitor, change its representation, or edit its contents. Expressions and variables that have a '+' on their left can be expanded, and those with a '-' can be collapsed. Arrays and C++ class objects, for example, are displayed by default in expanded format, with entries both for the array and for elements within it. To collapse the list of elements, or to expand a collapsed list, double-click on the '+' or '-', or place the cursor on that line and press the Enter key. C++ only: Pointers are displayed with a '>' on their left. You can change an array or class object to pointer representation by dereferencing it. You can display the value of the pointer, or the start of the memory it points to, by choosing a different representation for it. Related Information Procedures Add Expressions and Variables to a Monitor ═══ 2.2.3. Differences between Program and Private Monitors ═══ The Program and Private monitors are very similar, but have the following differences:  The Program monitor can be used to monitor all variables, while a Private monitor is associated with a single Source window.  The Program monitor remains open at all times unless you close it or exit the debugger. A Private monitor closes whenever the Source window it is associated with closes, and is hidden whenever its Source window becomes inactive (for example, when a statement in that Source window returns control to code in another Source window).  Because a Private monitor is associated with a specific Source window, whose focus is raised whenever you select the monitor, it does not have a Windows menu. Related Information Procedures Add Expressions and Variables to a Monitor Debug Variable Contents and Memory View Variable Contents ═══ 2.2.4. Introduction to the Local Variables Monitor ═══ You can monitor variables within the current scope of a Source window from the Local Variables monitor. This monitor is associated with a particular thread, and closes automatically when that thread terminates. It is updated, after each Step or Run command, to show what variables are currently in scope, and what the contents of those variables are. To open a Local Variables monitor for a given thread, highlight that thread in the Threads pane of the Session Control window, or raise the Source window for that thread; then choose Monitors->Local variables. From within a Local Variables monitor, you can select one or more variables, and access a popup menu to apply changes to them. For example, you can delete a variable from the monitor, change its representation, or edit its contents. Expressions and variables that have a '+' on their left can be expanded, and those with a '-' can be collapsed. Arrays and C++ class objects, for example, are displayed by default in expanded format, with entries both for the array and for elements within it. To collapse the list of elements, or to expand a collapsed list, double-click on the '+' or '-', or place the cursor on that line and press the Enter key. C++ only: Pointers are displayed with a '>' on their left. You can change an array or class object to pointer representation by dereferencing it. You can display the value of the pointer, or the start of the memory it points to, by choosing a different representation for it. Related Information Reference Private Monitor Program Monitor Popup Monitor ═══ 2.2.5. Introduction to the Registers Monitor ═══ The Registers monitor shows the contents of processor registers for a particular thread in your program. If you are debugging multiple threads, you can display a separate Registers monitor for each thread. Although all threads share the same set of registers, the operating system saves the register contents of each thread as the thread is suspended, and restores that thread's processor contents when the thread resumes. ═══ 2.2.6. Introduction to the Storage Monitor ═══ The Storage monitor lets you view and update the contents of storage areas used by your program. You can do the following:  Specify a variable, array, class object (C++ only), expression, or storage address to view.  Change the address range to view  Modify the contents of storage  Change the representation the debugger uses to display storage, for example, from hexadecimal to floating-point You can open a new Storage monitor from a Source window or from the Session Control window. The title of each Storage monitor includes the variable name or address range whose contents the window displays, as well as the current representation for the window. Related Information Procedures View a Location in Storage Change the Storage Monitor Address Range Change the Contents of Storage, Variables, and Registers Change the Representation of Storage Open a New Storage Monitor ═══ 2.3. Expressions ═══ For information on what expressions you can enter in the Expression entry field of the Monitor Expression dialog or the Monitor Expression in Storage dialog, see the section on supported expressions for the language you are debugging:  C++  COBOL ═══ 2.4. Stopping Thread ═══ A stopping thread is the thread that caused the program being debugged to stop. ═══ 2.5. Other Help Topics ═══ You can get to the following debugger help topics from here:  Common Menu Choices  Toolbar Buttons  Expressions Supported  Toolbar Short Cut Menu  Environment Variables  Search Order See also the following main help pages:  Main Debugger Windows  Dialogs  Monitor Windows  Debugger Help Home Page ═══ 2.5.1. Record of Directories ═══ The record of directories is a cumulative list of all directories you have entered in source path dialog boxes that opened when the debugger could not locate a source file. This list is only cumulative for the duration of the debugger session; when you exit the debugger, the list is not saved. The debugger assumes that any directory in the record of directories may be on either the debugger machine or the debuggee machine. ═══ 3. Reference Help for Debugger ═══ The Debugger Online Help is divided into four types of information:  Procedures - how to perform a specific task or set of tasks  Reference - technical information you may need to understand how to perform a task  User Interface - context-sensitive help pages displayed when you press F1 from within the debugger  Concepts - overview information you may need to understand basic principles of debugging or components of the debugger interface Reference help is organized hierarchically; see the following main topics:  When you start debugging  Debugging threads  Debugger options  Environment variables  Expressions supported  Problems Getting a Source View ═══ 3.1. When You Start Debugging ═══ The first time you debug a program, the debugger raises the following windows:  A Source window. This window contains the source code of the compile unit that contains the entry point for your program. If that compile unit was not compiled with the TEST option, the Source window is not displayed.  The Session Control window. Use this window to access other windows, to control the debugging of threads and functions, and to perform various debugger commands. (Only a single thread is supported on COBOL programs.) The DEBUG_LANG environment variable sets the dominant language for a debugging session. The dominant language affects certain terminology (for example, whether the C++ term function or the COBOL term entry point is used) in both the user interface and the help. It also affects what choices are available on certain dialogs and menus. The setting of DEBUG_LANG overrides the language of the compilation unit being debugged; for example, if DEBUG_LANG=COBOL and you step into a C++ function, the debugger's appearance continues to reflect a dominant language of COBOL. Only the COBOL choice is available for debugging OS/390 programs. DEBUG_LANG=CPP The debugger runs up to the start of main. DEBUG_LANG=COBOL The debugger runs up to the first debuggable statement in the application. If no part of the application was compiled and linked with debug information, the debugger displays a Source Filename dialog, and ignores any file name you enter. You can then press Cancel; only the Session Control window is displayed. From here you issue a Run command and the program will run to completion. The debugger starts after program initialization but before static (C++) or symbolic (COBOL) variables have been initialized. This means that you cannot view the contents of variables until you have performed a step or run. When you start debugging a program for the first time, no variables or expressions are being monitored. During the debug session, you may add variables or expressions to a local variables monitor. When you exit the debugger, local variables and expressions are saved in the program profile, and will be activated the next time you debug this program. ═══ 3.1.1. Stepping and Functions ═══ In a line that contains multiple calls, you can choose to step over all the calls, or step through the calls individually. Given a complex C++ call such as func1( func2(), func3() );, you can do the following:  Step over the entire line with a single Step Over command.  Step through each called function with a series of Step Into commands. You can then step through the function, or, to return to the original statement so that you can step into the next function, issue a Step Return command. You can also use a combination of step commands and function breakpoints to more finely control which functions called from a given line are stepped into and which are stepped over. Related Information Procedures Set and Clear Breakpoints from a Source Window ═══ 3.2. Debugger Options ═══ The idbugd command on the workstation supports the following options: -v Display connection information. The default is not to display this information. -qdebugger= The debugger that the daemon will invoke. The default is the name of the daemon without the last letter. For example, if the daemon name is idbugd, the default debugger is idbug. -qservice= The service name that is used by the daemon to get the port number. The default is the name of the daemon without the last letter. -qport= The port number that the daemon listens to for incoming requests. If you do not specify a port, the daemon looks up the port number for the specified service from the system services file on the workstation (for example the file \etc\services). ═══ 3.3. Compiler Options on OS/390 ═══ If you want to debug your program on OS/390, you must compile and link it as follows:  Compile with the TEST option.  Link an MVS load module. For further details on the required compilation and linking options, see the Debug Tool User's Guide and Reference ═══ 3.4. Environment Variables ═══ The debugger uses the following environment variables. If you want to place multiple entries in any of the variables that contain path names, separate the entries with a semicolon.  DEBUG_LANG  DEBUG_NUMBEROFELEMENTS  DEBUG_REMOTE_SEARCH_PATH  DEBUG_TAB  DEBUG_TABGRID  DPATH  LIBPATH (OS/2 only)  HELP  PATH  You should also ensure that the Debug Tool load library is available. See the Debug Tool User's Guide for more information. Related Information Procedures Set Environment Variables for the Debugger ═══ 3.4.1. DEBUG_LANG Environment Variable ═══ The DEBUG_LANG environment variable sets the dominant language for a debugging session. The dominant language affects certain terminology (for example, whether the C++ term function or the COBOL term entry point is used) in both the user interface and the help. It also affects what choices are available on certain dialogs and menus. The setting of DEBUG_LANG overrides the language of the compile unit being debugged; for example, if DEBUG_LANG=COBOL and you step into a C++ function, the debugger's appearance continues to reflect a dominant language of COBOL. Available choices are: CPP The dominant language is C++. If DEBUG_LANG is not set, this is the default. COBOL The dominant language is COBOL. The VisualAge for COBOL product sets DEBUG_LANG to COBOL at installation. ┌─────────────────────────┬─────────────────────────┬─────────────────────────┐ │Value of DEBUG_LANG │CPP │COBOL │ ├─────────────────────────┼─────────────────────────┼─────────────────────────┤ │'Entry' vs. 'Function' │The term 'function' is │The term 'entry' is used.│ │used in dialogs and │used │ │ │windows to indicate a C++│ │ │ │function or a COBOL or │ │ │ │PL/I entry point │ │ │ ├─────────────────────────┼─────────────────────────┼─────────────────────────┤ │Heap checking │You can perform heap │Heap checking is not │ │ │checks using Run->Check │available. │ │ │heap when stopping │ │ └─────────────────────────┴─────────────────────────┴─────────────────────────┘  Debugger settings, such as default fonts, changed when one dominant language is in effect are not applied to the debugger when the other dominant language is in effect  Step commands in a source view may behave differently in certain situations. Related Information Reference Environment Variables ═══ 3.4.2. DEBUG_NUMBEROFELEMENTS Environment Variable ═══ The DEBUG_NUMBEROFELEMENTS environment variable can be set to an integer value, to tell the debugger the maximum number of elements to display for an array, structure, or object in a Program, Private, Local Variables, or Popup monitor. Related Information Reference Environment Variables ═══ 3.4.3. DEBUG_REMOTE_SEARCH_PATH Environment Variable ═══ The DEBUG_REMOTE_SEARCH_PATH environment variable is used to search partitioned data sets on the remote host for a requested source file. If more than one PDS is specified, the names must be separated by a semicolon. Related Information Reference Environment Variables Search Order ═══ 3.4.4. DEBUG_TAB Environment Variable ═══ The DEBUG_TAB environment variable affects how the debugger expands tab characters in a Source window, when DEBUG_TABGRID is set to 0 (or is not set). The value for this variable is an integer, indicating the number of spaces to convert a tab character into.Unlike DEBUG_TABGRID, DEBUG_TAB does not cause the debugger to place tabbed information in specific columns; it simply results in each tab in the displayed files being converted to the indicated number of spaces. Related Information Reference DEBUG_TABGRID Environment Variable ═══ 3.4.5. DEBUG_TABGRID Environment Variable ═══ The DEBUG_TABGRID environment variable affects how the debugger uses tab characters to align tabs to columns in a Source window. The value of this variable is an integer indicating the starting position and frequency of the tab. For example, if you set DEBUG_TABGRID=6, the debugger sets tab stops at 6, 12, 18, 24, and so on. If DEBUG_TABGRID is set to a nonzero value, the setting of DEBUG_TAB has no effect. Related Information Reference Environment Variables DEBUG_TAB Environment Variable ═══ 3.4.6. LIBPATH Environment Variable (OS/2 Only) ═══ The LIBPATH environment variable tells the debugger where to look for debugger DLLs on the workstation. The LIBPATH environment variable must be set from within CONFIG.SYS; you cannot set it using the SET command. Related Information Reference Environment Variables ═══ 3.4.7. Other Environment Variables ═══ The debugger also uses the following standard environment variables on the Windows or OS/2 workstation. These variables all contain one or more directory names separated by semicolons: PATH The PATH environment variable is used to locate the debugger executable , as well as any other executables being run on the workstation. On Windows platforms the PATH environment variable is also used to locate DLLs. DPATH The DPATH environment variable is used to locate message files, which the debugger needs to display messages and the text of menus and dialogs. HELP The HELP environment variable is used to locate the online help files for the debugger. Related Information Reference Environment Variables ═══ 3.4.8. Search Order ═══ The debugger searches for C++ source files for an OS/390 debuggee program in the following locations: 1. The specified PDS or sequential file on the host 2. The current directory of the debugger machine 3. The record of directories on the debugger machine 4. Paths in the DEBUG_PATH environment variable on the debugger machine If the source file cannot be located in any of the above directories, a dialog box opens requesting the path name for the source file. The path name you enter is searched for on the debugger machine. This path name is also added to the record of directories to be used in future searches. Related Information Concepts Record of Directories ═══ 3.5. Expressions Supported ═══ The expressions you can enter in an expression entry field (for example, in a Monitor Expression dialog or a Set breakpoint dialog) are different for each language the debugger supports. See the following for more information:  Supported C++ expressions  Supported COBOL expressions Related Information Concepts Expressions ═══ 3.5.1. COBOL Expressions Supported ═══ You can enter the following types of COBOL expressions in an expression entry field: Variable: A variable used in your program. The following can be specified with COBOL variables:  Group qualification (for example, A OF B OF C)  Table subscripting (for example, A(1, 2, 3)) Note that only constants can be specified for array indices (no variables or operators).  Reference modification (for example, A(1:2)) Note that reference modification is not allowed for group names. Also, only constants can be specified for the reference modification begin and length values (no variables or operators). Notes 1. COBOL condition names cannot be specified. 2. Operators (for example, A + B) are not allowed. 3. The value displayed for COBOL index names and data items is the actual value in storage. For example, if INM is an index name for a one-dimensional table whose elements are two bytes wide and INM is set to reference the third element in the table, the value shown by the debugger (i.e., the value in storage) would be 4. Constant: The constant can be one of the following types:  Fixed or floating-point constant  A string constant, enclosed in double or single quotation marks (for example, 'string' or 'string')  Hexadecimal constant (for example, X'0041014D'). Note that the number of bytes represented by the hexadecimal constant must be equal to the number of bytes of the corresponding variable in assignment or comparison. Note: In a COBOL constant, the period is always used as the decimal point (i.e., the DECIMAL-POINT IS COMMA clause is ignored by the debugger). COBOL figurative constants are not supported by the debugger. Register: Any of the processor registers that can be displayed in the Registers Monitor. In the case of conflicting names, program variable names take precedence over register names. Expressions Supported in Conditional Breakpoints Expressions supported by the expression conditions in conditional breakpoints are further limited in the following ways:  Only the relation condition is supported, with the following operators: >, <, =, >=, <=, NOT >, NOT <, NOT =  The left operand must be a variable and the right operand must be a constant. For example, var1 > 5 is valid, while 5 < var1 and var1 > var2 are not.  The hexadecimal constant is allowed only with POINTER variables.  Nonnumeric and external floating point variables must be compared with a nonnumeric literal.  Zoned decimal variables must be compared with a numeric constant.  Complex conditions and group comparisons are not allowed.  Comparison is locale-based, independent of any COLLSEQ compile option or collating sequence specification within the program. ═══ 3.5.2. C++ Expressions Supported ═══ The expression language that is supported by the debugger for C++ programs is a subset of the C/C++ language. You can only monitor expressions with:  A supported operand type  A supported operator  A supported typecasting operation ═══ 3.5.2.1. C++ Supported Data Types ═══ You can monitor an expression that uses the following typecasting operations only:  8-bit signed byte  8-bit unsigned byte  16-bit signed integer  16-bit unsigned integer  32-bit signed integer  32-bit unsigned integer  Single-precision floating-point floating-point  Double-precision floating-point floating-point  80-bit floating-point (OS/390 only)  Pointers  User-defined types These data types include int, short, char and so on. ═══ 3.5.2.2. C++ Supported Expression Operands ═══ You can monitor an expression that uses the following types of operands only: Operand Definition Variable A variable used in your program. Constant The constant can be one of the following types:  Fixed or floating-point constant within the ranges supported by the system the debuggee program is running on.  A string constant, enclosed in double quotation marks (for example, 'mystring')  A character constant, enclosed in single quote marks (for example, 'x') Register Any of the processor registers that can be displayed in the Registers Monitor. In the case of conflicting names, program variable names take precedence over register names. For conversions that are done automatically when the registers display in mixed-mode expressions, general-purpose registers are treated as unsigned arithmetic items with a length appropriate to the register. If you monitor an enumerated variable, a comment appears to the right of the value. If the value of the variable matches one of the enumerated types, the comment contains the name of the first enumerated type that matches the value of the variable. If the length of the enumerated name does not fit in the monitor, the contents appear as an empty entry field. The comment (empty or not) lets you distinguish between a valid enumerated value and an invalid value. An invalid value does not have a comment to its right. You cannot update an enumerated variable by entering an enumerated type. You must enter a value or expression. If the value is a valid enumerated value, the comment to the right of it is updated. Bit fields are supported for C/C++ compiled code only. You can display and update bit fields, but you cannot use them in expressions. You cannot look at variables that have been defined using the #define preprocessor directive. ═══ 3.5.2.3. C++ Supported Expression Operators ═══ You can monitor an expression that uses the following operators only: Operator Coded as Global scope resolution ::a Class or namespace scope resolution a::b Subscripting a[b] Member selection a.b or a->b Size sizeof a or sizeof (type) Logical not !a Ones complement ~a Unary minus -a Unary plus +a Dereference *a Type cast (type) a Multiply a * b Divide a / b Modulo a % b Add a + b Subtract a - b Left shift a << b Right shift a >> b Less than a < b Greater than a > b Less than or equal to a <= b Greater than or equal to a >= b Equal a == b Not equal a != b Bitwise AND a & b Bitwise OR a | b Bitwise exclusive OR a ^ b Logical AND a && b Logical OR a || b ═══ 3.5.3. Values that Are Valid for the Current Representation ═══ When you are entering a value in an entry field such as a register in the Registers monitor, a column of storage in the Storage monitor, or the contents of a variable in another monitor, the debugger checks that the value you enter is valid for the current representation of that column or entry field. A value is valid for the current representation if it contains only the characters used for that representation, and does not exceed the length of the variable or register involved. For example, if you want to change the contents of storage, and the Content style setting for a particular Storage monitor is 32-bit integer, the value you enter must be a valid 32-bit integer, not a floating-point value or other value.Or, if you want to change the contents of a character string and the current representation is as a text string, you must enter a new string in double quotes, and the length of the string must not exceed the declared array size. Related Information Reference Expressions Supported Procedures Change the Contents of Storage, Variables, and Registers ═══ 3.5.4. Valid Addresses and Expressions ═══ Here are some examples of addresses or expressions you can enter in the Address or expression field of the Set Storage Change dialog: MyVariable (C++) : The address pointed to by MyVariable, if such a variable exists in your program, and if its value is a valid storage address (for example, if the variable is a pointer to another variable or to an offset within an array). MyVariable (COBOL or PL/I) If MyVariable is of type POINTER, the contents of the variable are used as the address; for other variables, the address of the variable is used. &MyVariable (C++) The storage of the variable MyVariable. A1FCC The hex address A1FCC, unless you have a variable declared as A1FCC, in which case it is treated the same as MyVariable above. 0xA1FCC The hex address A1FCC. RegisterName The name of a processor register on the system the debuggee program is running on. If the expression evaluates to a processor register, that register's contents are used in place of the register name. X'000A1FCC' (COBOL) The hex address A1FCC. Note that if you use this syntax, you must specify an even number of hex digits. For the above value you could specify 0xA1FCC or X'0A1FCC', but not X'A1FCC'. Related Information Reference Expressions Supported ═══ 3.6. Problems Getting a Source View ═══ Sometimes when debugging, you may find that the Source window is not available, or that the Source window does not appear to match the program you are debugging (for example, step commands behave erratically). There are several likely reasons for such problems:  The code you are debugging was compiled with debug information, but the debugger cannot locate the source code  The source has been downloaded to your workstation but is not pointed to by the DEBUG_LOCAL_PATH environment variable. Related Information Reference Debugger Cannot Find Source Code Debugger Cannot Find Source Files on Workstation Environment Variables ═══ 3.6.1. Debugger Cannot Find Source Code ═══ You may not be able to open a Source window for an object, even though the code was compiled with debug information, if the debugger cannot find the source code for it. When you start debugging such a program, or when execution lands in a part of the program that was compiled with debug information but the debugger cannot find the source code for it, the debugger opens a Source Filename dialog. In this dialog you can enter the name of the data set or PDS and member containing the source file. If you choose Cancel when this dialog appears, no Source window displays for the object. If the source code has been moved to another data set, select View->Change text, and enter the name of the data set, including the PDS member name, in the Change text file dialog.(The debugger searches for source files using a search path based on environment variables. If you are having problems getting a Source window for an object, check that the appropriate variables are properly set. If you choose Cancel, only the Session Control window will display. From there you can run your application or exit the debugger. If your application contains calls to routines that have debug data and have source code available, you can have the debugger stop at the entry to these routines. To do this from the Session Control window, you can set a deferred breakpoint for individual routines or you can have the debugger stop at entry to all routines. Related Information Reference Environment Variables Procedures Set a Deferred Breakpoint ═══ 3.6.2. Debugger Is Using a Different Executable Version ═══ ═══ 3.6.3. Debugger Cannot Find Source Files on Workstation ═══ One possible reason the debugger does not display your source code is that you expected the debugger to look for source files on the workstation, but have not downloaded the required source files, or have not told the debugger where to find them. If you have want the debugger to search for source files on the workstation, make sure that:  You have downloaded the necessary source files  The DEBUG_PATH environment variable on the workstation contains the paths of all directories where such source files are stored. You must separate entries with semicolons. For example, if you have files in F:\PRIVATE\SOURCE and G:\BUILD\SRC on your workstation, you should set DEBUG_PATH to: F:\PRIVATE\SOURCE;G:\BUILD\SRC ═══ 3.7. Debugging Threads ═══ Note: The sections on debugging threads are intended primarily for users with limited knowledge of developing multithreaded programs, in particular, those whose programming experience is mainly with single-threaded environments such as Windows 3.1. Multithreaded programs may behave differently in the debugger than they do when run normally. Because debugger features such as single-stepping and certain kinds of breakpoints involve processing overhead, running a multithreaded program within the debugger may affect the timing of thread switches. If you are experiencing problems, you can use the Threads pane of the Session Control window to enable or disable threads so that you can debug problems related to thread timing. The main problems you are likely to encounter in debugging multithreaded programs are timing and deadlock problems. You should not assume that a timing or deadlock problem that seems only to occur when your program is running within the debugger will never occur outside of the debugger. It is far more likely that the processing overhead of the debugger is merely increasing the frequency with which coding problems lead to deadlocks or thread timing errors. The following sections describe issues relating to debugging multithreaded programs, and contain suggestions for ensuring that your multithreaded programs are threadsafe both during debugging and in production use:  Threads and C++ Class Members  Threads and Load Occurrence Breakpoints ═══ 3.7.1. Threads and C++ Class Members ═══ If you use the same C++ class in two different threads, you may have thread problems such as the following:  If the class contains static variables, you may have re-entrancy problems.  If you are using the same instance from two separate threads, the instance may be accessed by both threads at once, resulting in a loss of data integrity. In both cases you need re-entrancy protection. For example, use a semaphore whenever you access the static variables or the common class instance. Related Information Reference Debugging Threads ═══ 3.7.2. Threads and Load Occurrence Breakpoints ═══ If you set a load occurrence breakpoint for a compile unit that has not been loaded, you may find that, in a multithreaded program, the compile unit never triggers the breakpoint, even though it must have been loaded by a call to a function within it. The usual cause of a load occurrence breakpoint not triggering is that you associated the breakpoint with a particular thread. To avoid this problem, choose 'every' to have the load occurrence breakpoint trigger regardless of which thread first calls a function within it. The debugger tells you which thread triggered the load. C++ only: For all breakpoint types, you can specify a breakpoint at the same location but with different conditions for different threads. For example, you can set a breakpoint that is triggered in thread 1 when the variable a has the value 3, and a breakpoint at the same location triggered in thread 2 when the variable a has the value 4. Conditions on thread-specific breakpoints can be useful for determining whether you have thread data integrity problems. Related Information Reference Debugging Threads ═══ 3.8. More Information on Recursion ═══ Recursion does not have to involve a function calling itself directly; for example: func1 calls func2 calls func3 calls func1. After the call to func3, each time you step into one of these functions, the entry for that call shows a recursion count one higher than the previous entry for that call. You can use the recursion value to detect unintentionally recursive calls. The debugger can keep track of all calls, whether they are done using a function or pointer to function, or, for C++, a virtual function. ═══ 3.9. Valid Entries for Registers ═══ If the value you enter consists entirely of valid hexadecimal characters, it is treated as a hexadecimal value unless it is also the name of a variable that is currently in scope. For example, suppose you have a variable feedbeef, and you enter 'feedbeef' as a register value. If the variablefeedbeef can be represented as a hex value, that hex value is used. Otherwise, the debugger uses the hex value 'feedbeef'. To force the debugger to use a hex value rather than the contents of a variable, precede the hex value with '0x' (for example, '0xfeedbeef'). In COBOL, you can also use 'X'feedbeef''. For C++, you can also enter an expression. Numbers used in the expression are treated as decimal unless explicitly preceded with '0x'. Only decimal and hexadecimal constants can be entered. Related Information Reference Expressions Supported ═══ 3.10. Registers Monitor Split Bars ═══ You can change the amount of space given to each group of registers in the Registers monitor, as follows: 1. Place the pointer on the split bar (a division between two panes of the window). The pointer's shape changes to an icon with two arrows. 2. Click and hold mouse button 1. 3. Drag the mouse up or down (for register groups displayed in rows) or left or right (for register groups displayed in columns) until you reach the desired size for the pane. 4. Release the mouse button. To save the position of the split bars, select Options->Display style and click on the Save Split Bar Positions check box. ═══ 3.11. Call Statement Example for COBOL ═══ Given the following:: . . . PROGRAM-ID. MAINPRG. . . . CALL 'PROG1'. . . . If you step into PROG1 and display the Call Stack window, the call statement shown for MAINPRG is the line number where PROG1 was called. The entry with the highest entry number in the Call Stack window has no Call Statement value because it has not itself called any routine. ═══ 3.12. Call Statement Example for C++ ═══ Given the following source code: void func1() {/* ... */} void main() { func1(); } If you step into func1 and display the Call Stack window, the call statement shown for main is the line number where func1 was called from. The function with the highest entry number in the Call Stack window has no Call Statement entry because it has not itself called any function. ═══ 3.13. Jump to Location -- COBOL Example ═══ In the example below, assume that line 61 is the current line and that you selected line 62. If you issue a Jump to Location command and then a Step Into command, line 65 will become the current line. However, if you issue a Run to Location command instead of the Jump to Location command, line 63 will become the current line. 59 MOVE 13 TO VAR2. 60 MOVE 12 TO VAR1. 61 MOVE 12 TO VAR2. 62 IF VAR1 = VAR2 THEN 63 CALL 'PROG1' 64 ELSE 65 CALL 'PROG2' 66 END-IF. ═══ 3.14. Jump to Location -- C++ Example ═══ In the example below, if you have stepped over the assignment to var2, and you select the if line and issue a Jump to Location command followed by two Step Into commands, execution stops at the first line of func2 instead of func1: //... var1=11; var2=12; // just stepped over this statement var1=12; if (var1==var2) func1(); else func2(); ═══ 4. User Interface Help for Debugger ═══ The Debugger Online Help is divided into four types of information:  Procedures - how to perform a specific task or set of tasks  Reference - technical information you may need to understand how to perform a task  User Interface - context-sensitive help pages displayed when you press F1 from within the debugger  Concepts - overview information you may need to understand basic principles of debugging or components of the debugger interface The main topics for User Interface help are listed below:  Source window  Call Stack monitor  Registers monitor  Storage monitor  Breakpoint List window  Session Control window  Popup Monitor  Private Monitor  Program Monitor  Popup Menu for Private and Program Monitors  Local Variables Monitor  Dialogs  Toolbar Buttons, Shortcut Keys, and Common Menu Items ═══ 4.1. Source Window ═══ The Source window displays the source code for the program you are debugging. You can perform most debugger actions from the Source window. For more details see:  Introduction to the Source window  How to use the Source window  Menus, buttons, shortcut keys ═══ 4.1.1. Menus, Buttons, and Shortcut Keys ═══ The Source window provides the following menu bar menus, popup menus, toolbar buttons, and shortcut keys:  Menu bar menus: - File - View - Breakpoints - Monitors - Run - Options - Windows - Help  Prefix area popup menu and code area popup menu  Toolbar buttons:  Shortcut keys: - [Ctrl+B->Session Control] - [Ctrl+E->Registers] - [Ctrl+G->Storage] - [Ctrl+K->Call Stack] - [Ctrl+R->Run] - [Ctrl+V-> Local variables] - [Ctrl+X-> Breakpoint list] ═══ 4.1.1.1. File Menu ═══ Use the File menu of the Source window to open a new source file, find a function or the current execution point, or exit the debugger. The File menu contains the following choices:  Open New Source  Find Function  Where is Execution Point -- [Ctrl+P]  Close Debugger -- [F3] ═══ 4.1.1.2. View Menu ═══ Use the View menu of the Source window to locate a text string, scroll through the view, or view a different source file. The View menu contains the following choices:  Find -- [Ctrl+F]  Find Next -- [Ctrl+N]  Scroll to Line Number  Select Include (not available for COBOL)  Change Text File ═══ 4.1.1.2.1. Find ═══ Select View->Find or press Ctrl+F to locate a string of text in the Source Window. Enter the string in the Find dialog. The debugger searches forward from the current highlighted word or line to the end of the file, then wraps to the beginning and searches up to the highlighted word or line. If the string is found, it is highlighted. Otherwise the message Text not found is displayed. If you want to search for only exact case matches to the search string, click on the Case sensitive check box. Once you have entered a string in the Find dialog, you can repeat the find operation by selecting View->Find Next or by pressing Ctrl+N. ═══ 4.1.1.2.2. Find Next ═══ Select View->Find Next or press Ctrl+N to find the next string that matches the search string you specified using View->Find or Ctrl+F. If you have not yet specified a string to search for, this choice is not available. ═══ 4.1.1.2.3. Scroll to Line Number ═══ Select View->Scroll to Line Number to move to another line in the source file. This action only affects what you see; it does not change what line will be executed next. A dialog opens where you enter a line number to scroll to. You can then either click on OK to scroll to that line, or you can select Breakpoint if you want to set a breakpoint at the line number. Once you have scrolled to a line number, you can select Run to locationor Jump to location to runor jump to that line. You can also open the Scroll to Line Number dialog by typing a line number directly from within the Source window. The dialog opens and the number you typed is placed in the line number entry field. ═══ 4.1.1.2.4. Select Include ═══ Select View->Select Include to display a list of the source files included in your program. You can select a file from this list to view. You can also access these files from the notebook tabs in the Source window (unless you have disabled the Source as Notebook check box in the Source window options). ═══ 4.1.1.2.5. Change Text File ═══ Select View->Change text file to view a different source file. Sometimes the debugger locates the wrong source file for your program. Change Text File lets you specify the correct data set and member names for the source file. In the dialog that appears, enter the data set name and member (if the data set is a PDS) that contains the source file you want. Note: Change Text File does not open a new Source window or change the executable being debugged. If you enter the wrong data set name, you may still be able to set breakpoints, issue step commands, and see the debugger moving the current line. However, the debugger's behavior is related to the current object file, not to the current source file, and so this behavior may seem out of sync with the source file. If you want to debug a different object file within the same program, do not use this menu item; select File->Open New Source instead. ═══ 4.1.1.3. Breakpoints Menu ═══ Use the Breakpoints menu of the Source window to set and delete breakpoints. It contains the following choices:  Set line  Set entry  Set storage change  Set load occurrence  List -- [Ctrl+X]  Toggle at current line -- space bar  Delete All - delete all breakpoints You can also set, delete, enable, and disable breakpoints in the prefix area of the source view. Related Information Procedures Delete All Breakpoints ═══ 4.1.1.3.1. List ═══ Select Breakpoints->List, or press Ctrl+X from a Source window or the Session Control window, to open the Breakpoints List window. This window lists information on all breakpoints, and lets you enable, disable, set, and delete breakpoints. ═══ 4.1.1.3.2. Toggle at Current Line ═══ Select Breakpoints->Toggle at current line to set a breakpoint at the current line. If there is already a breakpoint at the current line, this action clears it. Other ways to toggle a breakpoint are to double-click on the line number or to select the line number and press the space bar. ═══ 4.1.1.4. Monitors Menu ═══ Use the Monitors menu to display one of the debugger monitors. Monitors keep track of the contents of the call stack, registers, storage, and variables, and are updated after each step command or encountered breakpoint. In the Source window, the Monitors menu also includes the Monitor Expression choice, which lets you enter a variable or expression to monitor. You can access the following windows from the Monitors menu:  Call stack  Registers  Storage  Local Variables ═══ 4.1.1.5. Run Menu ═══ A subset of the following menu choices appears on the Run menu of the Source and Session Control windows:  Step over -- [O]  Step into -- [I]  Step return -- [T]  Run -- [R] or [Ctrl+R]  Run to Location -- [L]  Jump to Location -- [N]  Hide Debugger on Run  Thread Enabled The help for each debugger window contains appropriate links to the menu choices it supports. ═══ 4.1.1.6. Prefix Area Popup Menu ═══ When you click mouse button 2 [note] in the prefix area of an executable line in a Source window, a popup menu appears with some or all of the following choices:  Run to location -- run to this line  Jump to location -- jump to this line  Set line breakpoint -- set a breakpoint at this line  Clear breakpoint -- clear the breakpoint at the current line  Set breakpoint -- set a breakpoint at the current line  Disable breakpoint -- disable the breakpoint at the current line  Enable breakpoint -- enable the disabled breakpoint at the current line Executable lines are shown in blue in the prefix area, while non-executable lines (such as comment lines) are shown in black. ═══ 4.1.1.7. Code Area Popup Menu ═══ When you click mouse button 2 [note] while your pointer is over text in the source code area of a Source window, a popup menu appears with the choices shown below. The first four choices are used to add the highlighted item to the indicated type of monitor:  Popup expression  Add to private monitor  Add to program monitor  Add to storage monitor  Copy -- copy the highlighted item into the system clipboard  Find -- find the next occurrence of the highlighted item  Find entry -- find an entry point that matches the highlighted item (entries in different compile units may not be found)  Set entry breakpoint -- set a breakpoint at the entry that matches the highlighted item (entry must be in the same compile unit) For the last two choices, if the selected text corresponds to an overloaded C++ function (one that is implemented with two or more distinct signatures), an Overloaded dialog opens so that you can select which function signature corresponds to the function you selected. ═══ 4.1.1.8. Toolbar Buttons and Shortcut Keys ═══ The Source window provides the following toolbar buttons and shortcut keys:  [O] -- Step over  [I] -- Step into  [T] -- Step return  [R] -- Run  -- Monitor expression  -- Call stack monitor  -- Registers monitor  -- Storage monitor  [Ctrl+X] -- Breakpoints list  [Ctrl+B] -- Session Control window ═══ 4.1.2. Prefix Area ═══ The prefix area of the Source window is the leftmost column in the main area of the window. The values in the prefix area correspond to the line numbers in the current source file You can use the prefix area in the following ways:  To get a bearing on where you are in your file, by using line numbers as references.  To set and clear breakpoints. Double-click mouse button 1 on a value in the prefix area, or press the space bar while the cursor is in the prefix area. This toggles between setting and removing a breakpoint.  To run or jump to a line. Click mouse button 2 [note] over the line's prefix area, and select either Run to location or Jump to location from the popup menu. Breakpoints are indicated in the prefix area by reverse red highlighting. ═══ 4.2. Call Stack Window ═══ You can use the Call Stack window to view a list of active functions for a thread, and to raise a Source window to view the code for any of these functions. To display the window, select Monitors->Call stack or click on the pushbutton in the Source window or the Session Control window. Call Stack window Menus, buttons, and shortcut keys Related Information Procedures Use the Call Stack Window Concepts Introduction to the Call Stack Window ═══ 4.2.1. Menus, Buttons, and Shortcut Keys ═══ The Call Stack window provides the following menus, buttons, and shortcut keys:  A popup menu with one item, View  File Options Windows Help   [Ctrl+B->Session Control] [Ctrl+R->Run] ═══ 4.2.1.1. File Menu ═══ The File menu of the Call Stack window contains only one choice, Close Debugger. ═══ 4.2.1.2. Options Menu ═══ The Options menu of the Call Stack window contains the following choices:  Fonts  Display style  Restore defaults  Tool buttons  Hover help  Infoarea ═══ 4.2.1.2.1. Display Style ═══ Select Options->Display style to specify what information you want displayed in the Call Stack window, and to specify the growth direction for the window. In the dialog that appears, you can select from the following items (not necessarily in the order shown here):  Entry No Function  Prog. Unit Name  Call Statement  Recursion  Stack frame  Stack Size  Compile Date/Time  Function address Click on an entry from the list above for help about it. To select an item in the dialog, position the pointer over it and click mouse button 1, or press the space bar. (Clicking or pressing again deselects a selected item.) Selected items appear white on a gray background. To cancel changes you have made to the window without closing the window, click on Reset. To restore the debugger defaults, click on Defaults. You can move through the list by using either the mouse and slide bar or the cursor keys. ═══ 4.2.1.3. View ═══ Position the pointer over a function in the Call Stack window, click mouse button 2, and select View from the popup menu. A Source window that contains the source code for the function is opened or raised. ═══ 4.2.1.4. Growth Direction ═══ You can change the order in which functions on the call stack are displayed in the Call Stack window -- with the most recent entry at the top, or at the bottom. You can have the window display the most recently called routine at the top, and the outermost calling routine (usually the main program) at the bottom. If you click on the button, the order is reversed. To change the default growth direction, select Options->Display style and choose the appropriate growth direction from the dialog. ═══ 4.2.1.5. Growth Direction Push button ═══ Button: Menu: Options->Display style (from Call Stack window) The Growth direction command changes the order in which functions on the call stack are displayed (whether the most recently called function appears at the top or bottom). See Growth Direction for more information. ═══ 4.2.2. Source ═══ The Source item in the Call Stack window lists the name of the source file (or object file) for each active function in the current thread. Select Source from the Options->Display style dialog for the Call Stack window if you want a column showing source file names to be displayed. Source file names are displayed by default. ═══ 4.2.3. View Popup Choice ═══ Use the View choice on the Breakpoints List window's popup menu to raise the focus of the Source window containing a line or function breakpoint: 1. Select the breakpoint in the Breakpoints List window 2. Click mouse button 2 3. Select View from the breakpoint popup menu You can also raise the focus of the Source window by double-clicking on the breakpoint with mouse button 1. The line containing the breakpoint is displayed in a Source window, with its prefix area selected. If you want to alter the breakpoint, position the pointer on that line, click mouse button 2 [note], and select an item from the popup menu. ═══ 4.2.4. Compile Date/Time ═══ The Compile Date/Time item in the Call Stack window shows the date and time the function was compiled. Select Compile Date/Time from the Options->Display style dialog for the Call Stack window if you want a column showing compilation time stamps to be displayed. ═══ 4.2.5. Entry No ═══ The Entry No (entry number) item in the Call Stack window is a column of numbers that indicate the order of functions. The function with the highest number is the currently executing function; the one with the next highest number is its caller. Depending on the growth direction of the Call Stack window, entry numbers appear in descending or ascending order. The smallest entry number is always 1. Select Entry No from the Options->Display style dialog for the Call Stack window if you want a column showing entry numbers to be displayed. ═══ 4.2.6. Function ═══ The Function item in the Call Stack window lists the name of each active function in the current thread, or, where the name is not available, the function's address. To view the source for that function, you can:  Double-click on its name  Select its line and press Enter  Position the pointer over it, click on mouse button 2, and select View from the popup menu Select Function from the Options->Display style dialog for the Call Stack window if you want a column showing function names to be displayed. This column is displayed by default. ═══ 4.2.7. Recursion ═══ The Recursion item in the Call Stack window shows the number of times a function has been called and has not yet returned. For example, when a function recursefunc calls itself and you step into recursefunc, the debugger adds a new recursefunc entry to the Call Stack window. The recursion count for the new entry is one greater than for the previous recursefunc entry. Select Recursion from the Options->Display style dialog for the Call Stack window if you want a column showing recursion values to be displayed. Related Information Reference More Information on Recursion ═══ 4.2.8. Call Statement ═══ The Call Statement item in the Call Stack window shows the statement that transferred control out of the function. You can view a C++ or COBOL example of the use of this item. Select Call statement from the Options->Display style dialog for the Call Stack window if you want a column showing the statement number to be displayed. ═══ 4.2.9. Stack Frame Pointers ═══ These entries in the Call Stack window are the stack frame addresses for each active function on the call stack. ═══ 4.2.10. Stack Size ═══ The Stack Size item in the Call Stack window is the size, in bytes, of the stack frame for the called function. A function's stack frame includes the address to return to when the function completes, a pointer to the previous function's stack frame, and any local variables or arrays declared in the calling function. Given that the return address and previous function pointer are fixed-size components of a stack frame, the stack frame size provides an indication of how much local data is declared by the function. In C++, because the heap, not the stack frame, contains the storage for dynamically allocated local variables, only the pointers to such variables take up stack frame space. Select Size from the Options->Display style dialog for the Call Stack window if you want a column showing the size of the stack frame. ═══ 4.3. Registers Monitor ═══ Use the Registers monitor to view or modify the contents of the registers monitored for your program. The debugger displays a separate Registers monitor for each thread. See the following topics for more information:  How to use the Registers monitor  Menus, buttons, and shortcut keys ═══ 4.3.1. Menus, Buttons, Shortcut Keys ═══ The Registers monitor provides the following menus, buttons, and shortcut keys:  File Options Windows Help   [Ctrl+B->Session Control] [Ctrl+R->Run] ═══ 4.3.1.1. File Menu ═══ The File menu of the Registers monitor contains only one choice, Close Debugger. ═══ 4.3.1.2. Options Menu ═══ The Options menu of the Registers monitor contains the following choices:  Fonts  Display style  Restore defaults  Tool buttons  Hover help  Infoarea ═══ 4.3.1.2.1. Display Style ═══ Use the Display Style dialog to customize how the information in your Registers monitor is displayed. You can choose what groups of registers are displayed in the window, whether groups are laid out in columns (vertical orientation) or rows (horizontal orientation), whether or not the name of each group appears above its column or row, and whether the positions of split bars between rows or columns are saved. This dialog has the following group boxes and check boxes: Groups Use this selection list to choose the groups of registers you want to display. (Available groups are dependent on the processor on which the application being debugged is running.) To select an item, position the pointer over it and click mouse button 1 or press the space bar. Repeating this action deselects the item. Selected items appear white on a gray background. You can move through the list by using the mouse and slide bar, or by using the cursor up and down keys. Orientation Select Vertical if you want each group of registers to display in its own column, or select Horizontal if you want it to display in its own row. (A row can have multiple lines.) Column titles Select this check box if you want the title of each group of registers to appear above its group. Save split bars Select this check box if you want to save the positions of split bars between rows or columns of registers, from one debugging session of your program to the next. To cancel changes you have made without closing the dialog, click on Reset. To restore the debugger defaults, click on Defaults. ═══ 4.4. Storage Monitor ═══ Use the Storage monitor to view and update the contents of storage areas used by your program. See the following topics for more information:  Introduction to the Storage monitor  Menus, buttons, and shortcut keys ═══ 4.4.1. Menus, Buttons, and Shortcut Keys ═══ The Storage monitor provides the following menus, buttons, and shortcut keys:  File Options Windows Help   [Ctrl+B->Session Control] [Ctrl+R->Run] ═══ 4.4.1.1. File Menu ═══ The File menu of the Storage monitor contains only one choice, Close Debugger. ═══ 4.4.1.2. Options Menu ═══ The Options menu of the Storage monitor contains the following choices:  Fonts  Display style  Monitor expression  Restore defaults  Tool buttons  Hover help  Infoarea ═══ 4.4.1.2.1. Display Style ═══ Use the Display style dialog to specify what information is shown in the Storage monitor, what addressing scheme is used, how many columns of bytes are displayed on each line, and whether column titles are shown. To choose the desired style from the Content Style list, scroll through the list using the cursor keys, or position the pointer over the item you want; then click mouse button 1. To cancel changes you have made without closing the dialog, click on Reset. To restore the debugger defaults, click on Defaults. For information on the other items in the Display style dialog, click on the links below:  Address style  Columns per line  Column titles ═══ 4.4.1.2.1.1. Address Style ═══ Only the flat address style is available. ═══ 4.4.1.2.1.2. Columns per Line ═══ Enter a number, or use the arrows beside this field, to specify the number of Columns per line of storage you want displayed. The size of a single column is based on the content style you select. For example, if you select Hex and character, a column is a single byte; if you select 16-bit integer, a column is two bytes. ═══ 4.4.1.2.1.3. Column Titles ═══ Select this check box if you want a title line to appear above the storage area of the Storage monitor. When you choose Column Titles, the Storage monitor displays the address style above the column showing addresses, and displays the offset of the displayed range above the column showing storage contents. ═══ 4.4.1.2.1.4. Display String Literals in ASCII or EBCDIC ═══ You can view string literals in the Storage monitor in either ASCII or EBCDIC. The default is EBCDIC for OS/390 applications, ASCII for workstation applications. To change the default representation, select Options->Display style and choose the appropriate representation:  HEX and EBCDIC  HEX and ASCII ═══ 4.4.1.2.2. Monitor Expression in Storage ═══ Select Options->Monitor Expression from the Storage monitor to enter the variable or expression you want to monitor. The storage monitor is updated to show the requested storage address and contents. This saves you from having to scroll up and down through the monitor's storage pane if you know what storage you want to look at. For COBOL, if a variable is added to the storage monitor, the storage monitor opens at the address of that variable. If the variable is of type POINTER, it opens at the address specified by the contents of that variable. For C++, given the code: int x=12; int *y=&x; to view the storage for x, you can enter either &x or y. Note: For C++, if you enter the name of a variable that is not a pointer, or an expression that is not related to pointers, the debugger shows storage beginning at the address corresponding to the value of the variable or expression. This storage may not have any connection to the variable itself or to the program you are debugging. Normally you would only use variables or expressions that evaluate to an address (for example, pointers, array names, or expressions containing pointers). Select the Enabled monitor check box if the expression you are entering evaluates to a dynamically changing address and you want the Storage monitor to show the storage for that changing address. For instance, if you enter a pointer as part of the expression, and the address contained in that pointer changes dynamically, the Storage monitor will display a different location in storage each time the pointer changes. Related Information Concepts Expressions ═══ 4.4.1.3. Single-Precision Floating-Point Pushbutton ═══ Button: Menu: Select Options->Display style from the Storage monitor, then select Single-precision floating-point float from the Content style list. This causes storage in the Storage monitor to be displayed as a series of single-precision floating-point numbers. Each number begins on a four-byte boundary. ═══ 4.4.1.4. Double-Precision Floating-Point Pushbutton ═══ Button: Menu: Select Options->Display style from the Storage monitor, then select Double-precision floating-point float from the Content style list. This causes storage in the Storage monitor to be displayed as a series of double-precision floating-point numbers. Each number begins on an eight-byte boundary. ═══ 4.4.1.5. 32-Bit Unsigned Pushbutton ═══ Button: Menu: Select Options->Display style (from the Storage monitor), then select 32-bit unsigned integer from the Content style list. This causes storage in the Storage monitor to be displayed as a series of 32-bit unsigned integers. Each number begins on a four-byte boundary. ═══ 4.4.1.6. 32-bit Signed Pushbutton ═══ Button: Menu: Select Options->Display style (from Storage monitor) then select 32-bit signed integer from the Content style list. This causes storage in the Storage monitor to be displayed as a series of 32-bit signed integers. Each number begins on a four-byte boundary. ═══ 4.4.1.7. Character Pushbutton ═══ Button: Menu: Select Options->Display style (from the Storage monitor) then select Character from the Content style list. This causes storage in the Storage monitor to be displayed as a series of characters. Alphanumeric characters and some punctuation characters are displayed normally; other characters are shown only as small dots. To view the value of a nondisplayed character, change to Hex and character display style and look for the character's hexadecimal value. The Character display style displays storage in EBCDIC. You can display character storage in ASCII by selecting ASCII from the Display Style dialog instead of Character. ═══ 4.4.1.8. Hex and Character Push button ═══ Button: Menu: Select Options->Display style from the Storage monitor, then select Hex and character from the Content style list. This causes storage in the Storage monitor to be displayed in columns of hexadecimal data, followed by a single column of characters. In the character section, alphanumeric characters and punctuation characters are displayed normally; other characters are shown only as small dots. When storage is displayed in hex and character data, the characters can be in either ASCII or EBCDIC format depending on the platform the debugger is running on. See Display String Literals in ASCII or EBCDIC for information on how to change the default character set. ═══ 4.5. Breakpoints List Window ═══ Use the Breakpoints List window to set, delete, enable, or disable breakpoints. See the following topics for more information:  Introduction to the Breakpoints List window  Menus, buttons, and shortcut keys ═══ 4.5.1. Menus, Buttons, and Shortcut Keys ═══ The Breakpoint List window provides the following menus, buttons, and shortcut keys:  File Edit Set Options Windows Help   [Ctrl+B->Session Control] [Ctrl+R->Run] It also provides a popup menu. ═══ 4.5.1.1. File Menu ═══ The File menu of the Breakpoints List window contains only one choice, Close Debugger. ═══ 4.5.1.2. Edit Menu ═══ Use the Edit menu of the Breakpoint List window to delete, change, disable, or enable breakpoints that have already been set. This menu contains the following choices:  Delete  Disable (shown only when the highlighted breakpoint is enabled)  Enable (shown only when the highlighted breakpoint is disabled)  Modify (not supported for OS/390)  Delete all  Disable all  Enable all ═══ 4.5.1.2.1. Disable ═══ To disable the currently selected breakpoint, choose Edit->Disable from the Breakpoints List window, or place the pointer over the breakpoint you want to disable. Then click on mouse button 2, and select Disable. (The breakpoint must be enabled for this menu choice to be shown.) When you disable a breakpoint, it does not stop execution when the program is run. You can later enable it by selecting Edit->Enable from the Breakpoints List window, or by clicking mouse button 2 on it and selecting Enable from the popup menu. You can also enable all disabled breakpoints by selecting Edit->Enable all. Related Information Procedures Enable and Disable Breakpoints ═══ 4.5.1.2.2. Enable ═══ To enable the currently selected breakpoint, choose Edit->Enable from the Breakpoints List window, or place the pointer over the breakpoint, click mouse button 2, and select Enable. (The breakpoint must be disabled for this menu choice to be shown.) Disabled breakpoints are remembered by the debugger but do not cause execution to stop when the program runs. When you enable a disabled breakpoint, the debugger stops program execution whenever the breakpoint is encountered. Related Information Procedures Enable and Disable Breakpoints ═══ 4.5.1.2.3. Modify ═══ Note: Modifying breakpoints is not supported for OS/390 debugging. You can still enter values in the dialog, however when you click on OK or Set, a popup error message displays. To modify breakpoint characteristics for OS/390 debugging, delete the breakpoint in question and add it again with the desired characteristics. Select Edit->Modify from the Breakpoints List window to modify settings for the selected breakpoint (for example, the frequency with which it causes execution to stop, or what threads it applies to). After you have made the desired changes, click on OK. If you click on Set instead, the changes are applied and the dialog stays open. Subsequent changes you make within the dialog are applied to the same breakpoint. Related Information Procedures Modify Breakpoint Characteristics ═══ 4.5.1.2.4. Delete all ═══ Choose Edit->Delete all from the Breakpoints List menu bar to delete all breakpoints in the monitor. Note: If you want to temporarily disable all breakpoints and then later re-enable them, use Edit->Disable all instead. ═══ 4.5.1.2.5. Disable All ═══ Choose Edit->Disable all from the Breakpoints List window to disable all breakpoints. When you disable breakpoints, the debugger remembers where they are set, but does not use them to stop execution when the program is run. You can later enable them all by selecting Edit->Enable all. You can enable individual breakpoints by clicking with mouse button 2 on each breakpoint you want to enable, and selecting Enable from the popup menu. ═══ 4.5.1.2.6. Enable All ═══ Choose Edit->Enable all from the Breakpoints List window to enable all breakpoints that have been disabled. ═══ 4.5.1.3. Set Menu ═══ Use the Set menu of the Breakpoint List window to set various kinds of breakpoints through a dialog. This menu contains the following choices:  Set line  Set entry  Set storage change  Set load occurrence ═══ 4.5.1.3.1. Set Line ═══ Select Set->Set Line, or select Line breakpoint from the prefix area popup menu, to set a line breakpoint at a particular line number. In the dialog that appears, you can specify what executable and source file you want to set the breakpoint in. If the source code consists of several files (that is, if one or more files include other files) you can select which source file the breakpoint should be set in from the Include File pulldown list. Type a line number in the Line entry field. The breakpoint is set on that line number. More information is available on the following entry field items:  Thread  Defer breakpoint  Frequency ═══ 4.5.1.3.2. Set Function ═══ Select Set->Set Function to set a breakpoint at the start of a function. Select Set->Set Entry to set a breakpoint at an entry point. In the dialog that appears, type the name of the function in the Function entry field, or select the List button and click on the function you want. You can also specify what executable and source file you want to set the breakpoint in. If the source code consists of several files (that is, if one or more files include other files) select which source file to set the breakpoint in from the Include File pulldown list. More information is available on the following entry field items:  Thread  Frequency If the function you specified is an overloaded C++ function (your program contains two or more functions with the same name but different signatures), an Overloaded dialog appears, displaying a list of the overloads of the function. Choose the desired one from the list. ═══ 4.5.1.3.3. Set Storage Change ═══ Use the Set storage change choice to cause execution to stop whenever storage at a specific address is written to. Execution stops even if the value written to storage is the value that was already present at that address. Caution: If you set a storage change breakpoint for an address that is on the call stack, be sure to remove the breakpoint before leaving the routine associated with it. Otherwise, when you return from the routine, the routine's stack frame will be removed from the stack, but the breakpoint will still be active. Any other routine that gets loaded on the stack will then contain the breakpoint. In the Address or Expression entry field, you can type the address or a variable name or expression that evaluates to a valid address. C++: You can also enter the address of a variable, by preceding the variable name with an ampersand (for example, &myVariable). COBOL: For POINTER variables, the contents of the variable are used as the address. For all other variables, the address of the variable is used. Note: If you type FEEDBEEF in the Address or expression entry field, and there is a variable named FEEDBEEF, the debugger will interpret the entry as the variable FEEDBEEF, not the hex value FEEDBEEF. More information is available on the following fields:  Bytes to monitor  Thread  Frequency Related Information Reference Expressions Supported Valid Addresses and Expressions ═══ 4.5.1.3.3.1. Bytes to Monitor ═══ Select a value from Bytes to Monitor on the Storage Change Breakpoint dialog to tell the debugger the number of bytes you want it to monitor. You can monitor 1 to 128 bytes. ═══ 4.5.1.3.3.2. Set Load Occurrence ═══ Select Set Load Occurrence to set a breakpoint that will stop execution when the DLL you specify has been loaded. In the Load Occurrence Breakpoint dialog, type the name of the DLL or program in the DLL File Name entry field. For example, if the DLL or program is in the partitioned data set A.B.LOAD(HELLO), you would enter only the member name, HELLO. Execution stops when the DLL or program is loaded. For information on other fields in this dialog, see the following:  Thread  Frequency (From/To/Every) ═══ 4.5.1.4. Options Menu ═══ The Options menu of the Breakpoints List window contains the following choices:  Fonts  Display style  Sort  Restore defaults  Tool buttons  Hover help  Infoarea ═══ 4.5.1.4.1. Display Style ═══ You can change the way items in the Breakpoint List window are displayed by selecting Options->Display style, then selecting those items you want from the Select Items list in the Display Style dialog. The Select Items list in the Display Style dialog contains the following items: Type The type of breakpoint, for example, Line or Address Executable The name of the executable file the breakpoint applies to Source The name of the compilation unit the breakpoint applies to File The source file Function The function containing the breakpoint Line The line containing the breakpoint Address The address of the breakpoint State Whether the breakpoint is enabled or disabled Status Whether the breakpoint is active or deferred (a deferred breakpoint is a breakpoint set in a compile unit that has not yet been loaded) Thread What threads the breakpoint applies to Expression An optional expression that must evaluate to true for the breakpoint to cause execution to stop. From The first encounter of the breakpoint that causes execution to stop. For example, if this value is set to 5, each run command could, if no other breakpoints are encountered and the program does not terminate, pass over the breakpoint four times before stopping the fifth time. To The last encounter of the breakpoint that causes execution to stop. Every The frequency at which encounters of the breakpoint cause execution to stop. For example, if Every is set to 2, the breakpoint causes execution to stop every other time the breakpoint is encountered. If you select the Reset pushbutton any changes you have made in the Display Style dialog are discarded, and the dialog is refreshed to show the display style in effect when you opened the dialog. If you select Default the default items are displayed in the Breakpoint List window. ═══ 4.5.1.4.2. Sort ═══ You can change the order of items in the Breakpoint List window by selecting Options->Sort, then selecting the item you want the debugger to sort on from the Select Item list in the Sort dialog. By default, breakpoints are sorted by line number. ═══ 4.5.1.5. Defer Breakpoint ═══ Select the Defer breakpoint check box from within the Line Breakpoint dialog if you want to set a line breakpoint in a compile unit that is not currently loaded. When a compile unit in which you have set a deferred breakpoint is loaded, the breakpoint state changes from deferred to active. When the compile unit is freed, the breakpoint state changes back to deferred. If you enter an incorrect source, file, or line number, the debugger will be unable to activate the breakpoint when the compile unit is loaded, and the breakpoint will remain in the deferred state. Note: You cannot set a deferred breakpoint in a preloaded compile unit, but you can set one in a program that has some preloaded compile units and some dynamically loaded ones. Related Information Procedures Set a Deferred Breakpoint ═══ 4.5.2. Thread ═══ The Thread pulldown list in a Set breakpoint or Modify breakpoint dialog lets you choose what threads to activate the breakpoint in. To select a thread ID from the list, select the List button, then highlight the thread where you want to set the breakpoint. ═══ 4.5.3. Defer Breakpoint ═══ Select the Defer breakpoint check box if you want to set a function breakpoint in a DLL or subprogram that is not currently loaded. If you set a deferred function breakpoint on a C++ function, and that function is overloaded, the debugger sets the breakpoint in all of the overloaded functions when the DLL or subprogram is loaded. When a DLL or subprogram in which you have set a deferred breakpoint is loaded, the breakpoint state changes from deferred to active. When the DLL or subprogram is freed, the breakpoint state changes back to deferred. If you enter an incorrect source, file, or function, the debugger will be unable to activate the breakpoint when the DLL or subprogram is loaded, and the breakpoint will remain in the deferred state. Note: You cannot set a deferred breakpoint in a preloaded DLL or subprogram, but you can set one in a program that has some preloaded DLL or subprograms and some dynamically loaded ones. ═══ 4.5.4. Frequency ═══ Use the Frequency fields to tell the debugger when to stop on a breakpoint and when to skip it. The debugger keeps track of how many times each breakpoint is encountered. The fields in this section tell the debugger on which encounter of a breakpoint the debugger should first stop, how often it should stop, and on which encounter the debugger should no longer stop. ┌──────────────────────────────────────┬─────────────────────────────────────┐ │Entry field │Purpose │ ├──────────────────────────────────────┼─────────────────────────────────────┤ │From │Enter the first breakpoint encounter │ │ │you want the debugger to stop on. For│ │ │example, if you want the debugger to │ │ │skip over the breakpoint the first │ │ │five times it is encountered, enter │ │ │'6'. │ ├──────────────────────────────────────┼─────────────────────────────────────┤ │To │Enter the last breakpoint encounter │ │ │you want the debugger to stop on. For│ │ │example, if you want it to start │ │ │ignoring the breakpoint after the │ │ │20th encounter, enter '20'. To have │ │ │it always stop on the breakpoint, │ │ │enter 'Infinity'. │ ├──────────────────────────────────────┼─────────────────────────────────────┤ │Every │Enter the frequency with which you │ │ │want the debugger to stop on this │ │ │breakpoint. For example, if you want │ │ │it to stop on only one out of every │ │ │four it encounters, enter '4'. │ └──────────────────────────────────────┴─────────────────────────────────────┘ ═══ 4.5.5. Expression ═══ Note: The Expression entry field in breakpoint dialogs is not available for COBOL programs running on OS/390. If you are setting a line breakpoint or function breakpoint in a C++ program, or a line or address breakpoint in a COBOL or PL/I program, you can type an expression into the Expression entry field in a Set breakpoint or Modify breakpoint dialog. The execution of the program stops at the breakpoint only if the condition specified in this field tests true. For example, if you are debugging a C++ program you could type the following: (i==1) || (j==k) && (k!=5) For a COBOL program, you could type the following: myvar = 'abc' Note: Variables in a conditional expression that is associated with a function breakpoint are limited to any static or global variables known to the called function when the function is called. The expression cannot contain local or automatic variables. Related Information Reference Expressions Supported ═══ 4.5.6. Breakpoints List Popup Menu ═══ In the Breakpoints List window, if your pointer is on a line containing breakpoint information and you click on mouse button 2, a popup menu appears with the following choices that affect breakpoints:  View  Delete - deletes the selected breakpoint  Enable (if breakpoint is currently disabled)  Disable (if breakpoint is currently enabled)  Modify (not supported on OS/390) - opens a dialog that lets you change the breakpoint  Delete all - deletes all the breakpoints Related Information Procedures Delete Breakpoints Modify Breakpoint Characteristics Delete All Breakpoints ═══ 4.6. Session Control Window ═══ The Session Control window is open throughout the debugging session. It shows the current status of the debugger, and gives you a number of ways to access other windows or perform common functions. See the following topics for more information:  Introduction to the Session Control window  Menus, buttons, and shortcut keys ═══ 4.6.1. Using the Components Pane ═══ You can expand any item in the Components pane that has a '+' beside it. The following list shows what items you can expand, and what items appear when you do: Item with + Expands to *(corresponds to the load module) A list of compile units. A compile unit does not appear in the list until it has been called. Compile unit The names of nested programs Source file (C++ only): File-scope functions and class member functions defined within each source file. C++ class member functions are not shown. To shift the focus within the Session Control window between the Threads and Components panes, use the pointer or the cursor left and right keys. To move between items in the list, use the mouse or the cursor up and down keys. To expand or collapse items in the list, use the + and - keys. To open or raise the focus of the Source window for , double-click on the item, or highlight it and press Enter. To access the popup menu for a function, select that function and click on mouse button 2 . This menu lets you set a breakpoint on the function or view its source code. ═══ 4.6.2. Using the Threads Pane ═══ When you expand a thread in the Threads pane, the thread's priority is visible. To move between items in the list, use the mouse or the cursor up and down keys. To expand or collapse items in the list, use the + and - keys. To open or raise the focus of the Source window for a thread, press the Enter key while the thread is highlighted, or double-click on it. To access a popup menu for a highlighted thread, click mouse button 2. This menu lets you disable or enable the thread, access monitors specific to it, or jump to the execution point in the Source window for the thread. To enable a disabled thread or disable an enabled one, select the thread, then choose Run->Thread enabled. This toggles the current enablement for that thread. If the thread is enabled, a checkmark appears beside Thread enabled. Note: In the Source window, the current execution line is reverse-highlighted in black. When a thread becomes disabled, the current execution line for that thread's Source Window changes to gray. For guidance on designing and debugging multithreaded programs, see Debugging Threads. ═══ 4.6.3. Menus, Buttons, and Shortcut Keys ═══ The Session Control window provides the following menus, buttons, and shortcut keys:  File Breakpoints Monitors Run Options Windows Help   [Ctrl+E->Registers] [Ctrl+G->Storage] [Ctrl+K->Call Stack] [Ctrl+P->Source] [Ctrl+R->Run] [Ctrl+V->Local variables] [Ctrl+X-> Breakpoint list] The Session Control window also has a popup menu. ═══ 4.6.3.1. Shortcut Keys ═══ The Session Control window provides the following shortcut keys:  [Ctrl+E->Registers]  [Ctrl+G->Storage]  [Ctrl+K->Call Stack]  [Ctrl+P->Source]  [Ctrl+R->Run]  [Ctrl+V->Local variables]  [Ctrl+X-> Breakpoint list] ═══ 4.6.3.2. Breakpoints Menu ═══ Use the Breakpoints menu to set and delete breakpoints. It contains the following choices:  Set line  Set function  Set storage change  Set load occurrence  List -- [Ctrl+X]  Delete All - Deletes all breakpoints Related Information Procedures Delete All Breakpoints ═══ 4.6.3.3. Options Menu ═══ The Options menu in the Session Control window lets you change settings for the window and for the debugger itself. It contains the following choices:  Window settings  Debugger settings ═══ 4.6.3.3.1. Display Style ═══ Select Options->Window settings->Display style to specify what you want displayed in the Session Control window. The dialog contains the following check boxes: Check box Effect when checked Show all components All components are displayed (when this choice is not checked, only components with debug information are displayed) Show module path The path name is displayed Sort components Components are sorted in alphabetical order Sort threads Threads are sorted in numerical order Show status line A status line is displayed, showing the current state of the debugger (for example, Executing) ═══ 4.6.3.3.2. Window Settings ═══ Select the Window settings cascading choices from the Session Control window Options menu to modify these settings: Fonts Lets you change the font for the Session Control window. Display style Opens a Display Style dialog where you can specify how information in the Session Control window should appear. Restore defaults Resets all settings for the Session Control window to their original values. Tool buttons Displays or hides the toolbar buttons for the window. Hover help Enables or disables hover help, which provides brief descriptions of menu choices and toolbar buttons when your pointing device passes over them. Infoarea Enables or disables the window's information area, which provides longer textual descriptions of menu choices and toolbar buttons when your pointing device passes over them. ═══ 4.6.3.3.3. Set Breakpoints at Entry Points ═══ Select the Set breakpoints at entry points check box in the Debugger Properties dialog of the Session Control window to automatically set a breakpoint at each function. ═══ 4.6.3.4. Threads/Components Popup Menu ═══ Popup menus are available for both the Threads pane and the Components pane of the Session Control window. In the Threads pane, when you highlight the main entry for a thread and click mouse button 2, the popup menu displays a subset of the following choices:  Execution point -- opens or raises a Source window showing the next line to be executed in the thread  Enable -- changes a disabled thread's state to enabled, so that it can run (shown only for disabled threads)  Disable -- changes an enabled thread's state to disabled, to prevent it from running (shown only for enabled threads)  Registers -- opens or raises a Registers monitor for that thread  Call Stack -- opens or raises a Call Stack window for that thread  Local variables -- opens or raises a Local Variables window for that thread In the Components pane, if you click mouse button 2 over a function, the popup menu contains the following choices:  View -- open or raise a Source window for the file or function  Set function breakpoint -- set a breakpoint at the start of this function, for the current thread only  Set breakpoint every -- set a breakpoint at the start of the function, for all threads If you click mouse button 2 over an object file, the popup menu contains only the View choice. ═══ 4.6.3.5. Source ═══ Menu: Windows->Source from the Session Control window Keystroke: Ctrl+P Opens or raises a Source window. When you use Ctrl+P to access a source window, the source window raised or opened contains the contents of the active thread and function. When you use the Windows menu and more than one Source window is currently open, a Source choice is available for each open Source window. ═══ 4.7. Monitor Expression Dialog ═══ Use the Monitor Expression dialog to add a variable or expression to one of the following monitors, which are listed in the dialog within a radio button group box:  Popup  Private  Program  Storage The current context is shown in an information group box. This is the context (file, line number, etc.) that the debugger uses in evaluating the expression you enter. Type in an expression, and either click on OK or Monitor. OK closes the dialog, while Monitor leaves the dialog open so that you can add more expressions. If the expression you want to add is already in your source code, you can place that expression in the Expression entry field in the Monitor Expression dialog as follows: highlight it with the mouse, then select Monitor->Monitor expression or click on the toolbar button. See Expressions Supported for more information on what types of expressions the debugger supports. Related Information Concepts Expressions ═══ 4.7.1. Current Context ═══ The context group box on the right side of the Monitor Expression dialog shows the current execution point in your program: the file name, line number, type of view, and thread number. If you have tried to add an expression to a monitor and the debugger issues the error message 'Expression validation failed', you may have included out-of-scope variables or constants in your expression. If you are familiar with the structure of your program, the Context group box may help you determine if scoping problems are the cause of the error. See Expressions Supported for information on what types of expressions the debugger supports. ═══ 4.8. Popup Monitor ═══ A Popup monitor displays a variable or expression you select for monitoring. This monitor is associated with a specific Source window and closes when the associated window closes. Each time you add a variable or expression to a Popup monitor, a new Popup monitor opens. The contents of each Popup monitor are updated after each Step or Run command (except for disabled variables or expressions within such windows). You can do the following from a Popup monitor:  Access a popup menu using mouse button 2  Change the contents of a variable The Popup monitor has the following menu items on its titlebar menu:  File  Options  Help Related Information Procedures Add Expressions and Variables to a Monitor ═══ 4.8.1. File Menu ═══ The File menu of the Popup monitor contains only one choice, Close Debugger. ═══ 4.8.2. Popup Menu for the Popup Monitor ═══ To access a popup menu from within a Popup window, place the pointer over a monitored variable or expression, and click mouse button 2. Depending on the variable or expression you selected, the popup menu provides a subset of the following choices:  Edit  Next representation  Change font  Dereference (not available for COBOL)  Delete  Enable  Disable ═══ 4.8.2.1. Change Font ═══ Choose Change font from the popup menu in a Popup monitor to change the font used within that particular monitor. Choose the desired font from the Font Selection dialog that appears. ═══ 4.9. Private Monitor ═══ Use a Private monitor to monitor variables or expressions from a given Source window. Each Source window can have its own Private monitor. This monitor is similar to the Program monitor. See the following for more information:  Introduction to the Private Monitor  Monitor popup menu  Menus, buttons, and shortcut keys Related Information Concepts Differences between Program and Private Monitors ═══ 4.9.1. Menus, Buttons, and Shortcut Keys ═══ The Private monitor provides the following menus, buttons, and shortcut keys:  Edit Options Help   [Ctrl+B->Session Control] [Ctrl+R->Run] The Private monitor also has a popup menu. To access it, place the pointer within the content area of the window and click mouse button 2. ═══ 4.9.1.1. Edit Menu ═══ The Edit menu of both the Program monitor and Private monitor contains the following choices:  Delete  Delete all  Select all  Deselect all  Enable  Disable  Other elements  Representation ═══ 4.9.1.1.1. Delete ═══ Select Edit->Delete from the monitor menu bar, or Delete from a monitor popup menu, to delete the selected variables or expressions from the monitor. To delete all expressions, select Edit->Delete all. ═══ 4.9.1.1.2. Delete All ═══ Choose Edit->Delete all from the monitor menu bar to delete all expressions and variables in the monitor. Note: If you delete an expression or variable and then later decide that you want to monitor it, you must add it again from the Source window. ═══ 4.9.1.1.3. Disable ═══ Select Edit->Disable from the monitor menu bar, or Disable from the monitor popup menu, to prevent the displayed contents of the selected variables or expressions from being updated when they change. ═══ 4.9.1.1.4. Enable ═══ Select Edit->Enable from the monitor menu bar to have the debugger refresh the displayed contents of the selected variables or expressions whenever they change. Variables and expressions are enabled by default, so this choice is only available if a variable or expression has been disabled. ═══ 4.9.1.1.5. Other Elements ═══ If an array, structure, or C++ class object in a monitor contains more than 50 elements, only 50 elements are displayed at a time. By default, the first 50 elements are displayed. To display a different range of elements, select Edit->Other elements (or select Other elements from the monitor popup menu), and enter the number of the first element to display. You can change the default maximum of 50 elements to a different maximum by setting the DEBUG_NUMBEROFELEMENTS environment variable on the local workstation before starting the debugger. In a C++ class object, elements are listed in declaration order, regardless of their access specifier (private, protected or public). The 50-element limit applies to each level within an array or a C++ class object. For example, if a C++ class contains 100 member variables and the first variable is a 60-element array, the debugger displays the name of the array only (with a '+' to its left so that you can expand it) and the next 49 elements of the C++ class object. When you expand the array, the debugger displays the first 50 elements of the array, and the next 49 elements of the C++ class object. To view more elements of the array, position the pointer on the array name and select Other elements. To view more elements of the C++ class object, position the pointer on the object name and select Other elements. ═══ 4.9.1.1.6. Representation, Next Representation ═══ Select Edit->Representation, or Next representation from the monitor popup menu, to change the representation of monitor contents. Edit->Representation: The available representations for the selected variable or element are shown in a cascading menu. For example, for a 32-bit signed integer, the available representations are decimal and hexadecimal. Next representation (from the monitor popup menu, or from the toolbar button): The next representation of the selected variable or element is shown. The debugger cycles through available representations in the same order as would be shown in the Edit->Representation cascading menu list for the selected item. ═══ 4.9.2. Options Menu ═══ The Options menu of the Private and Program monitors contains the following choices:  Fonts  Restore defaults  Show enablement  Show context  Tool buttons  Hover help  Infoarea ═══ 4.9.2.1. Show Enablement ═══ You can disable a variable or expression within a monitor so that its displayed contents are not updated when the variable or expression changes. Later you can enable the variable or expression so that its contents are updated. Select Options->Show enablement if you want the current enablement of each variable or expression to be shown. A column appears that shows either 'Enabled' or 'Disabled' for each entry in the monitor. ═══ 4.9.2.2. Show Context ═══ Select Options->Show context from a monitor window to display the following information in separate columns for each object or array:  The name of the data set (PDS and member, if applicable) that contains the source where the object or array is declared  The line number  The thread number  The variable or expression name This information is only shown once for each object or array. ═══ 4.10. Program Monitor ═══ Use the Program monitor to collect variables or expressions that you want to monitor. This monitor is not associated with any specific Source window, and is always displayed unless you specifically close it. It is similar to the Private monitor. See the following for more information:  Introduction to the Program monitor  Monitor popup menu  Menus, buttons, and shortcut keys Related Information Concepts Differences between Program and Private Monitors ═══ 4.10.1. Menus, Buttons, and Shortcut Keys ═══ The Program monitor provides the following menus, buttons, and shortcut keys:  File Edit Options Windows Help   [Ctrl+B->Session Control] [Ctrl+R->Run] The Program monitor also has a popup menu. To access it, position the pointer in the content area of the window and click mouse button 2. ═══ 4.10.1.1. File Menu ═══ The File menu of the Program monitor contains only one choice, Close Debugger. ═══ 4.11. Popup Menu for Private and Program Monitors ═══ When you select a variable or element in the Program monitor or a Private monitor, and click mouse button 2, a popup menu appears with a subset of the following choices:  Edit  Delete  Disable  Dereference (not available for COBOL)  Next representation  Other elements ═══ 4.11.1. Edit Contents ═══ To edit the contents of a variable in a monitor, do one of the following:  Select the line containing the variable, click mouse button 2, and select Edit from the popup menu  Double-click on the content of the variable  Use the cursor keys or the mouse to highlight the line containing the variable, and press Enter. Then enter a new value and press Enter. This value must be valid for the type of variable. Related Information Procedures Change the Contents of Storage, Variables, and Registers ═══ 4.11.2. Dereference ═══ Note: The Dereference choice is not available for COBOL programs running on OS/390. Choose Dereference from the popup menu in a Program, Private, or Local Variables monitor to show the storage contents of the selected pointer variable. This choice is available only when the variable you have selected is a pointer, or is an array or object name displayed in pointer representation (with a '>' to its left). To change an array or object to pointer representation, choose Edit->Representation from the menu bar, or Next representation from the popup menu. ═══ 4.12. Local Variables Monitor ═══ Use the Local Variables monitor to view all local variables that are currently in scope. The Source window for each thread of your program has its own Local Variables monitor. See the following for more information:  Introduction to the Local Variables monitor  Local Variables popup menu  Menus, buttons, and shortcut keys ═══ 4.12.1. Menus, Buttons, and Shortcut Keys ═══ The Local Variables monitor provides the following menus, buttons, and shortcut keys:  File Edit Options Windows Help   [Ctrl+B->Session Control] [Ctrl+R->Run] The Local Variables monitor also has a popup menu. To access it, position the pointer in the content area of the monitor and click mouse button 2. ═══ 4.12.1.1. File Menu ═══ The File menu of the Local Variables monitor contains only one choice, Close Debugger. ═══ 4.12.1.2. Edit Menu ═══ The Edit menu of the Local Variables monitor contains the following choices:  Delete  Select all  Deselect all  Other elements  Representation ═══ 4.12.1.3. Options Menu ═══ The Options menu of the Local Variables monitor contains the following choices:  Fonts  Restore defaults  Show context  Tool buttons  Hover help  Infoarea ═══ 4.12.2. Popup Menu for the Local Variables Monitor ═══ When you select a variable or element in a Local Variables monitor and click mouse button 2, a popup menu appears with a subset of the following choices:  Edit  Dereference (not available for COBOL)  Delete  Next representation  Other elements ═══ 4.13. Debugger Dialogs ═══ You can get to help on the following debugger dialogs from here:  Source List Dialog  Exception Dialog  Overloaded Dialog  Source Filename Dialog  Monitor Expression Dialog  Exception Filtering Dialog See also the following main help pages:  Main Debugger Windows  Monitor Windows  Other Help Topics  Debugger Help Home Page ═══ 4.13.1. Debugger Properties Dialog ═══ Use the Debugger Properties dialog to define:  Whether to keep displaying, minimize, or discard a Source window from which control has just passed  Whether multiple views can be displayed.  Whether to automatically set a breakpoint at every entry point.  Whether clicking on mouse button 2 will perform a step command or bring up a popup menu. This dialog contains the following group boxes:  Display at stop  Old source disposition  Settings  Mouse button 2 behavior ═══ 4.13.1.1. Display at stop Group Box ═══ The Display at stop group box lets you control how many Source windows are displayed at once, and how many Source windows the Old source disposition setting applies to. The choices are: Only stopping thread Keeps, minimizes, or discards all views that are not the stopping thread. All threads Keeps, minimizes, or discards the views for old components within each thread. For example, if you select Only stopping thread, the Old source disposition applies to all the Source windows except the current view of the stopping thread. If you select All threads, the Old source disposition applies only to the Source windows for the components from which execution has just left within a thread. ═══ 4.13.1.2. Old source disposition Group Box ═══ The Old source disposition group box lets you control the behavior of Source windows from which control has just passed. The choices are: Keep Leaves old Source windows open Minimize Changes old Source windows into icons Discard Closes old Source windows Note: The setting of the Display at Stop group box affects what Source windows the Old source disposition choices apply to. ═══ 4.13.1.3. Settings Group Box ═══ The Settings group box contains the following:  The Multiple views check box, which you can select to display more than one Source window for a particular object. If the check box is enabled, when you open a new window for an object, the first window stays open and is overlaid by the second one. If the check box is disabled, the first window is closed when a second window is opened. The default is not to display multiple Source windows.  The Set breakpoints at entry points check box. If this check box is enabled, the debugger will set breakpoints at all functions for programs that were compiled and linked with debug information. ═══ 4.13.1.4. Mouse button 2 behavior Group Box ═══ The behavior of mouse button 2 within the Source window depends on the Mouse button 2 behavior group box in the Debugger properties dialog (accessed from the Source or Session Control windows through Options->Debugger settings->Debugger properties). Select one of the following check boxes to determine how mouse button 2 will behave in the Source window. Popup menus Displays a popup menu, where one is available; otherwise does nothing. Step always Performs a step command. Popup menus and step in white space Displays a popup menu, when the pointer is over certain text (for example, a variable or a line number in the prefix area), and performs a step command when the pointer is over white space or over text for which no popup menu is available. C++ example:.If Popup menus and step in white space is checked, and you click mouse button 2 on the C++ source line int myVar=18;, a popup menu appears if the pointer is over int, myVar, or 18, and a step command is performed if the pointer is on white space or the = or ; symbols. COBOL example: If Popup menus and step in white space is checked, and you click mouse button 2 on the COBOL line MOVE 18 TO MYVAR., a popup menu appears if the pointer is over MOVE, 18, TO, or MYVAR, and a step command is performed if the pointer is on white space or the period. ═══ 4.13.2. Exception Dialog ═══ The Exception dialog is displayed whenever an exception is raised that matches the exception category you specified in the Exception Filtering dialog. The line where the exception occurred is highlighted in a Source window. This dialog gives you three choices: Examine/Retry The debugger behaves as if the exception did not occur, continues execution at the instruction right after the one that raised the exception, and stops execution at the next source statement for which debug information is available. Depending on how critical the original exception was, a new exception may be raised before the debugger reaches the next source statement. Step exception The debugger steps into the first registered exception handler (tracked by the operating system). Execution stops at the first executable line of code in that exception. Run exception The debugger runs the exception handler that is registered to handle the type of exception that was encountered. ═══ 4.13.3. Exception Filtering Dialog ═══ In the Exception Filtering dialog, select the types of exceptions you want the debugger to recognize. If an exception is encountered during execution, and that exception is in an exception category you selected, the Exception dialog opens. Otherwise the exception is ignored. You can choose one of the following exception categories: Test(NONE) The debugger does not recognize any exceptions Test(ERROR) The debugger stops at all severity 2 or higher exceptions Test(ALL) The debugger stops at all Language Environment (LE) exceptions ═══ 4.13.4. Find Function Dialog ═══ To use the Find Function dialog: 1. In the Function entry field, type the name of the function you want to locate. An error message appears if a matching function was not found. 2. If you want to search only files that contain debugging information, enable the Debugging information only check box. 3. If you want to search for the string exactly as typed, select the Case sensitive check box. Do not select it if you want to search for both uppercase and lowercase matches to the string. 4. Select OK. If you specified a C++ function and the debugger finds more than one overload of the function you specified, an Overloaded dialog opens, listing the overloads of that function. Select the desired overload from that list. ═══ 4.13.5. Monitor Properties Dialog ═══ Use the Monitor Properties dialog to select the settings for monitoring variables or expressions. You can set one check box in each of the following group boxes (click on the Group box name for more information): Group box Purpose Monitor Location The window into which the variable or expression being monitored is placed. Popup Duration For a popup expression window, determines how long the monitors are displayed. ═══ 4.13.5.1. Monitor Location ═══ Choose one of the following radio buttons to determine which monitor will open when you select a variable or expression to monitor.  Popup monitor  Private monitor  Program monitor  Storage monitor ═══ 4.13.5.2. Popup Duration ═══ If you selected Popup in the Monitor Location group box, select one of the following radio buttons to specify at what point the popup expression window is closed. Step/run The monitor closes when the next step or run command is executed. New source The monitor closes when execution stops in a new source. Permanent The monitor is associated with a specific Source window, and is closed when that Source window is closed. ═══ 4.13.6. Open New Source Dialog ═══ Use the Open New Source dialog to open another Source window containing a new executable or DLL for the program you are already debugging. You may find it easier to open a new Source window by expanding components in the Components pane of the Session Control window until you find the compilation unit you want. The Open New Source dialog is useful for opening a source view for a compile unit when you are unsure of the file name of the executable that was created from that compile unit. If you know the name of the compile unit, turn on the All executables check box and type in the compile unit name, then select OK. If you do not know the name of the compile unit, leave the Source field blank, and turn off the All executables check box. You can then select an executable from the Executable pulldown list. If you want to view only those executables compiled and linked with debug information, turn on the Debugging information only check box. Once you have chosen an executable, click on OK (or press Enter) and a Source List dialog displays with a list of the compilation units for that executable. From this Source List dialog, select the compilation unit you want to open a Source window for. You can use Open new source to specify a partitioned data set member or a sequential file. If the debugger cannot find a sequential file on the host, it uses the file name to search on the workstation. If it cannot find a partitioned data set member on the host, it extrapolates a workstation file name from the member name and the end of the data set name, and searches for that file on the workstation. Related Information Reference Environment Variables ═══ 4.13.7. Overloaded Dialog ═══ When you specify a C++ function in a debugger entry field (for example, when you are setting a function breakpoint), and the debugger finds more than one overload of that function, an Overloaded dialog appears, containing a list of all functions with the name you specified. Choose the function from the displayed list that matches the function you wanted. A signature is the combination of return type and argument types that distinguish a C++ function from other functions of the same name. ═══ 4.13.8. Source List Dialog ═══ The Source List dialog opens if you select an executable in the Open New Source dialog but do not specify a new source file to open. The lefthand pane contains the names of executable files, and the righthand pane shows corresponding compile units. Select a compile unit from the list, and either click on OK or press Enter. You can resize the panes by dragging the split bar between them to the left or right. ═══ 4.13.9. Source Filename Dialog ═══ The Source Filename dialog is displayed when you try to debug a component that contains debugging data for which the source code cannot be located. To respond to this dialog, do one of the following:  If the source file is located in another partitioned data set or sequential data set, type in the partitioned data set and member name or the sequential data set name, and select OK.  If you do not have the source file for this component, select Cancel. No Source window will be displayed. ═══ 4.14. Toolbar Buttons, Shortcut Keys, and Common Menu Items ═══ Each window of the debugger provides a subset of the following toolbar buttons, shortcut keys, and menu choices:  Toolbar buttons:  Shortcut keys: [Ctrl+B] -->Raise Session Control window [Ctrl+R] -->Run (The Source window and Session Control window have their own specialized sets of shortcut keys.)  Menu choices: File Edit Monitors Run Options Windows Help ═══ 4.14.1. Toolbar Buttons ═══ Toolbar buttons let you quickly access a wide range of commands and windows from the Source and Session Control windows, and a lesser range from other windows. These buttons are displayed when the Tool buttons item is set from a window's Options menu (or from a menu beneath Options). The following toolbar buttons are available: ═══ 4.14.1.1. Call Stack Button ═══ Click on the button to open or raise a Call Stack window containing the contents of the call stack for the current thread. This is the same as selecting Monitors->Call Stack or typing Ctrl+K. ═══ 4.14.1.2. Delete All Button ═══ Click on the button to delete all breakpoints in a breakpoint list, or to delete all variables and expressions in a monitor. ═══ 4.14.1.3. Delete Button ═══ Click on the button to delete the selected breakpoint in a breakpoint list, or to delete the selected variable or expression in a monitor. ═══ 4.14.1.4. Session Control Button ═══ Click on the button to bring the Session Control window into focus. ═══ 4.14.1.5. Monitor Expression Button ═══ Click on the button from the Source window to add a variable or expression to one of the debugger monitors. In the Monitor expression dialog that opens, enter a variable or expression to monitor. If you highlight a variable or expression before you press the Monitor expression button, that variable or expression is automatically placed in the Monitor expression dialog. See Expressions Supported for information on what types of expressions the debugger supports. ═══ 4.14.1.6. Project Button ═══ Note: This button is only supported for versions of the debugger installed with an IBM VisualAge product, and is only shown if the debugger was invoked from a WorkFrame project. Click on the Project button to open or raise the WorkFrame. ═══ 4.14.1.7. Registers Button ═══ Click on the button to open or raise a Registers monitor containing the contents of processor registers for the current thread. This is the same as selecting Monitors->Registers or typing Ctrl+E. ═══ 4.14.1.8. Storage Button ═══ Click on the button to open or raise a Storage monitor, which you can use to display storage used by your program. This is the same as selecting Monitors->Storage or typing Ctrl+G. ═══ 4.14.1.9. Breakpoints Button ═══ Click on the button to open or raise the Breakpoints list window, which you can use to view, set, clear, disable, or enable breakpoints. This is the same as selecting Breakpoints->List or typing Ctrl+X. ═══ 4.14.2. Common Menu Choices ═══ A subset of the following menus appears on many debugger windows:  File  Edit  Options -- you can view help for a short list of common options, or a complete list of all available options  Monitors  Run  Windows  Help The help for each debugger window contains appropriate links to the menus it supports. ═══ 4.14.2.1. File Menu ═══ A subset of the following menu choices appears on the File menu of many debugger windows:  Open new source  Locate function  Where is execution point -- [Ctrl+P]  Close debugger -- [F3] The help for each debugger window contains appropriate links to the File menu choices it supports. ═══ 4.14.2.1.1. Open New Source ═══ Note: The Open new module choice on the File menu is available only on the Source and Session Control windows. Select this choice when you want to view a source file that is associated with your application, but is not currently shown in a Source window. The Open New Source dialog displays. Note: Open new source does not change the program being debugged. The source file you select must be one that is used by the program you are currently debugging. ═══ 4.14.2.1.2. Where is Execution Point ═══ Select Where is execution point from the File menu to view the next line to be executed. If the file containing that line is already in a Source window, that Source window has its focus raised; otherwise, a new Source window opens. The next line to be executed is highlighted and has the cursor on it. ═══ 4.14.2.1.3. Close Debugger ═══ Select Close debugger from the File menu to end the program you are debugging and exit the debugger. When you close the debugger, the window positions, sizes, and other settings are saved in a program profile. This profile is used the next time you debug that program, to establish startup settings for the new debug session. ═══ 4.14.2.2. Edit Menu ═══ A subset of the following menu choices appears on the Edit menu of many debugger windows:  Delete  Select all  Deselect all The help for each debugger window contains appropriate links to the menu choices it supports. ═══ 4.14.2.2.1. Delete ═══ Button: Shortcut key: [Delete] Menu: Edit->Delete (from Breakpoints List window, and Program, Private, and Local Variables monitors) Delete deletes the highlighted item or items in the current window. In a Monitor window, the selected expressions or variables are deleted. In a Breakpoint List window, the selected breakpoint is deleted (you can only select one breakpoint at a time). Note: When you delete a breakpoint, all information on it is lost. If you need to temporarily prevent a breakpoint from stopping execution but you want to be able to easily activate it later, you should disable it instead, by selecting Edit->Disable. Related Information Procedures Enable and Disable Breakpoints ═══ 4.14.2.2.2. Select All ═══ Select Edit->Select all from a Program or Private monitor to select all the variables and expressions shown in the monitor. You can then individually deselect certain variables, and use one of the available Edit menu choices to delete, enable, or disable the remaining selected variables. ═══ 4.14.2.2.3. Deselect All ═══ Select Edit->Deselect all from a monitor to deselect all selected variables and expressions shown in the monitor. ═══ 4.14.2.3. Options Menu ═══ The following Options menu choices are shared by several debugger windows: Fonts Lets you change the font for the current window. Restore defaults Resets all settings for this window to the debugger defaults for the window. Tool buttons Determines whether the toolbar buttons are displayed in the window. Hover help Enables or disables hover help, which provides brief descriptions of menu choices and toolbar buttons when the pointer is placed over them. Infoarea Enables or disables the window's information area, which provides longer textual descriptions of menu choices and toolbar buttons when the pointer is placed over them. ═══ 4.14.2.4. Monitors Menu ═══ A subset of the following menu choices appears on the Monitors menu of the Source and Session Control windows:  Monitor expression  Call Stack  Registers  Storage  Local variables The help for each debugger window contains appropriate links to the menu choices it supports. ═══ 4.14.2.4.1. Monitor Expression ═══ Select Monitors->Monitor expression to open a Monitor expression dialog. Here, you can enter a variable or expression to monitor, and select what monitor to display it in. ═══ 4.14.2.4.2. Call Stack ═══ Select Monitors->Call Stack to open a Call Stack window for the current thread. Here, you can view the contents of the call stack to determine what calls are currently in progress. ═══ 4.14.2.4.3. Registers ═══ Select Monitors->Registers to open a Registers monitor. Here, you can view or alter the contents of registers for the processor of the machine that the program being debugged is running on. ═══ 4.14.2.4.4. Storage ═══ Select Monitors->Storage to open a Storage monitor. Here, you can view or alter the contents of storage used by your program. ═══ 4.14.2.4.5. Local Variables ═══ Select Monitors->Local variables to open a Local Variables monitor. Here, you can view or alter the contents of variables that are currently in scope for a given thread. When you select this choice from a Source window, the Local Variables monitor uses the thread for that Source window. When you select it from the Session Control window, the Local Variables monitor uses the currently highlighted thread in the Threads pane. ═══ 4.14.2.5. Run Menu ═══ Use the Run menu to perform step commands, run your program, hide debugger windows, and enable or disable threads. It contains the following choices:  Step over -- [O]  Step into -- [I]  Step return -- [T]  Run -- [R]  Run to location -- [L]  Jump to location -- [N]  Hide debugger on Run  Thread enabled Shortcut keys (shown above in brackets) and toolbar buttons are available for many of the Run menu choices. See the help panels for these choices for more information. ═══ 4.14.2.5.1. Hide Debugger on Run ═══ Select Run->Hide debugger on Run to hide the debugger windows when your program is running. This option does not affect the windows when you are stepping through your program. ═══ 4.14.2.5.2. Thread Enabled ═══ Select Run->Thread enabled to allow the thread that is highlighted in the Threads box of the Session Control window to execute when the program runs. When threads are enabled, a check mark is displayed beside the Thread enabled choice. This is the default setting. When threads are not enabled, no check mark is displayed and the highlighted thread is not executed when the program is run. ═══ 4.14.2.6. Project ═══ The Project menu is available when you have loaded the debugger from a Workframe project. Use it to perform project-related tasks. The list of choices depends upon the type of project, the platform, and the language. See the WorkFrame online help for further information on the choices. ═══ 4.14.2.7. Options Menu ═══ Use the Options menu to change the appearance and behavior of the debugger. You can change settings for the particular window from which you access the menu, and settings for the debugger itself. This menu contains the following choices:  Window settings  Debugger settings ═══ 4.14.2.7.1. Window Settings ═══ Select the Window settings cascading choices to modify these settings for the window from which you access the Options menu: Colors (Source window only) Lets you change the colors used in the Source window. Fonts (Source window only) Lets you change the font for the Source window. Only fixed-pitch fonts are available. Display style Opens a dialog where you can specify how information in this window should appear. Additional help is available for the Session Control window. Monitor expression (Storage monitor only) Opens a Monitor Expression in Storage dialog, where you can enter an expression for monitoring in storage. Restore defaults Resets all settings for this window to their original values. Notebook (Source window only) Displays source files within the Source window in a notebook format. Tool buttons Displays or hides the toolbar buttons for the window. Hover help Enables or disables hover help, which provides brief descriptions of menu choices and toolbar buttons when your pointing device passes over them. Infoarea Enables or disables the window's information area, which provides longer textual descriptions of menu choices and toolbar buttons when your pointing device passes over them. ═══ 4.14.2.7.2. Debugger Settings ═══ Select the Debugger settings cascading choices to modify debugger settings:  Debugger properties  Monitor properties  Default data representation  Program profiles  Exception filtering  Save debugger window positions  Global font change  Enable window cascading  Display tool buttons -- shows the toolbar buttons at the top of each window  Display hover help -- displays a help bubble, when one is available, near the pointer when you move the pointer over a tool button  Display infoarea -- displays a line of help, when one is available, at the bottom of the window when you move the pointer to a new area of the window. ═══ 4.14.2.7.2.1. Default Data Representation ═══ Note: You cannot change the default data representation when debugging COBOL programs on OS/390. The Character data representation is the default. Select Options->Debugger settings->Default data representation to specify how you want your data represented in the monitors. A cascading menu appears with choices for the languages supported by the debugger. ═══ 4.14.2.7.2.2. Program Profiles ═══ Select Options->Debugger settings->Program profiles to specify where you want the debugger program profiles stored, what profile information to save, or what profiles to delete. This menu has three choices: Select information Select the types of information to save in the program profile. If Save profile information is checked, your changes to this list will be saved for future debugging sessions. If it is not checked, your changes will only affect profiles saved until you exit this session of the debugger. Delete program profiles A dialog opens with a list of program profiles. Select those profiles you want to delete, and click on OK. Profile filenames are similar to their associated program filenames,but have an extension that contains the character '@'. Change location Change the location of the files that hold the debugger settings. Enter the new path for program profiles in the Change location dialog. ═══ 4.14.2.7.2.3. Exception Filtering ═══ Select Options->Debugger settings->Exception filtering to open the Exception Filtering dialog. Select the types of exceptions that you want the debugger to recognize. ═══ 4.14.2.7.2.4. Save Debugger Window Positions ═══ Select Options->Debugger Settings->Save debugger window positions to save the position and size of each debugger window that is currently open, so that these settings are used the next time you start the debugger. ═══ 4.14.2.7.2.5. Global Font Change ═══ Select Debugger Settings->Global font change to change the font in all debugger windows. (The font you choose affects all debugger windows except Source windows.) ═══ 4.14.2.7.2.6. Enable Window Cascading ═══ Select Debugger Settings->Enable window cascading to display newly opened debugger windows offset to the right of and below previous windows, so that you can see the titles of previous windows. If this choice is disabled, successive windows will overlay earlier ones. ═══ 4.14.2.7.3. Windows Menu ═══ The Windows menu lists the currently open debugger windows, including Source windows, monitors, the Breakpoints List window, and the Session Control window. To switch to a different window, select this menu from any window where the option is available, and click on the window you want to go to. When you minimize the debugger, some of its windows may not be on the list of windows displayed by the operating system. To access a minimized window not on the window list, select the Session Control window, then use the Windows menu to access the window you want. ═══ 4.14.2.7.4. Help ═══ The Help menu provides help for the current window and for other help on the debugger. The following choices are available:  Help index -- displays a list of index entries within the help file.  General help -- displays high-level help for the current window.  Using help -- displays help on how to access and use help features of the debugger.  How do I -- displays task-oriented help for common debugger tasks.  Product information -- displays the logo screen for the debugger. If you want to search for a string within a help file, click on Search from the help window, enter the search string in the entry field, select All sections, and click on Search. ═══ 4.14.3. Step Into ═══ Button: Shortcut key: [I] Menu: Run->Step into (from Source window) The Step Into command executes the current line in the program. If the current line is a call, and debug information is available for any function called before the return to the current function, execution halts at the first statement for which debug information is available. If no debug information is available, execution halts after the call. For example, if A calls B and A is compiled without debug information, while B is compiled with debug information, after a Step Into command from a call to A, execution will stop at the first executable statement of B. C++ only: If the current line contains a complex call (for example p->memberFunc1()->memberFunc2().memberFunc3(func1(), func2())), the debugger examines each call (and any calls beneath it) for functions containing debug information, and steps into the first such function. The order in which it examines the calls is based on the order of the calls in the assembly code, which is not necessarily the order in which the calls appear in the source code. ═══ 4.14.4. Step Over ═══ Button: Shortcut key: [O] Menu: Run->Step over (from Source window) The Step Over command executes the current line in the program. If the current line is a call, execution stops at the line following the call. If you step over a function that contains a breakpoint, execution stops at the breakpoint. ═══ 4.14.5. Step Return ═══ Button: Shortcut key: [T] Menu: Run->Step return (from Source window) The Step Return command executes the code up to and including the return statement of the current function. Execution halts at the line following the call to the current function. ═══ 4.14.6. Run ═══ Button: Shortcut key: [R] from Source/Session Control windows, [Ctrl+R] from other windows Menu: Run->Run (from Source/Session Control windows) Run executes the program. The debugger starts executing where it last stopped (for example, at a breakpoint) or, if you have not yet run the program in this session, at the beginning of the program. When you select Run, execution continues until one of the following occurs:  The debugger encounters a breakpoint  An exception is encountered that is not handled  The program terminates  You close the debugger Related Information Procedures Run a Program ═══ 4.14.7. Halt ═══ Button: Shortcut key: [SysRq] Menu: Run->Halt (from Source/Session Control windows) Halt, which is available only while the program is running, stops execution immediately. The Source window is updated with the current line set to the next line to be executed. ═══ 4.14.8. Jump to Location ═══ Shortcut key: [N] Menu: Run->Jump to location (from Source/Session Control windows) Jump to location makes the currently highlighted line in the Source window the current line, without executing any code. You can view an example in C++ or COBOL to see how Jump to location works. Caution: When you jump to a location, you may alter the flow of your program in ways that make it difficult to continue debugging later in the same session:  The stack can become corrupted if you jump to a location outside the current function.  Some compilers optimize register usage in ways that can corrupt variables or program flow when you use Jump to Location. For example, if the compiler keeps track of register contents and can determine that a register contains the value 1 at the start of a statement that initializes an integer variable to 1, it may simply copy that register's contents to the variable. If you step over the statement that involved setting the register to 1, the variable may not contain the expected contents. ═══ 4.14.9. Run to Location ═══ Shortcut key: [L] Menu: Run->Run to location (from Source/Session Control windows) Run to location executes the program up to the currently highlighted line in the Source window. The debugger starts executing where it last stopped (for example, after a breakpoint) or, if you have not yet run the program in this session, at the beginning of the program. When you select Run to location, execution continues until one of the following occurs:  Execution reaches the location (the line) you selected in the Source window  The debugger encounters a breakpoint  An exception is encountered that is not handled  The program terminates  You close the debugger ═══ 4.14.10. Session Control ═══ Button: Menu: Windows->Session Control Keystroke: Control-B Use this button, menu selection, or shortcut key to raise the Session Control window. ═══ 4.14.11. Local Variables ═══ Menu: Monitors->Local variables Keystroke: Ctrl+V Opens or raises a Local Variables window, which displays the names and contents of variables that are in scope within the current thread or function. ═══ 4.14.12. Delete ═══ Select Edit->Delete from a Local Variables monitor, or Delete from a monitor popup menu, to delete the selected expressions from the monitor. To delete all expressions, select Edit->Select all, then Edit->Delete. ═══ Run ═══ ═══ Session Control Button ═══ ═══ Delete Button ═══ ═══ Delete All Button ═══ ═══ Session Control Window ═══ ═══ File Menu ═══ ═══ Open New Source ═══ ═══ Where is Execution Point ═══ ═══ Close Debugger ═══ ═══ Find Function Dialog ═══ ═══ Breakpoints Menu ═══ ═══ Set Line ═══ ═══ Set Function ═══ ═══ Set Storage Change ═══ ═══ Set Load Occurrence ═══ ═══ Breakpoints Menu ═══ ═══ Delete all ═══ ═══ Monitors Menu ═══ ═══ Call Stack Window ═══ ═══ Registers Monitor ═══ ═══ Storage Monitor ═══ ═══ Local Variables Monitor ═══ ═══ Run Menu ═══ ═══ Run ═══ ═══ Halt ═══ ═══ Hide Debugger on Run ═══ ═══ Thread Enabled ═══ ═══ Options Menu ═══ ═══ Window Settings ═══ ═══ Window Settings ═══ ═══ Window Settings ═══ ═══ Window Settings ═══ ═══ Debugger Settings ═══ ═══ Debugger Properties Dialog ═══ ═══ Monitor Properties Dialog ═══ ═══ Default Data Representation ═══ ═══ Exception Filtering ═══ ═══ Save Debugger Window Positions ═══ ═══ Global Font Change ═══ ═══ Enable Window Cascading ═══ ═══ Program Profiles ═══ ═══ Program Profiles ═══ ═══ Program Profiles ═══ ═══ Program Profiles ═══ ═══ Windows Menu ═══ ═══ Help ═══ ═══ Help ═══ ═══ Help ═══ ═══ Help ═══ ═══ Help ═══ ═══ Help ═══ ═══ Threads/Components Popup Menu ═══ ═══ Threads/Components Popup Menu ═══ ═══ Threads/Components Popup Menu ═══ ═══ Threads/Components Popup Menu ═══ ═══ Threads/Components Popup Menu ═══ ═══ Threads/Components Popup Menu ═══ ═══ Threads/Components Popup Menu ═══ ═══ Threads/Components Popup Menu ═══ ═══ Threads/Components Popup Menu ═══ ═══ Source Window ═══ ═══ File Menu ═══ ═══ Open New Source ═══ ═══ Where is Execution Point ═══ ═══ Close Debugger ═══ ═══ Find Function Dialog ═══ ═══ View Menu ═══ ═══ Find ═══ ═══ Find Next ═══ ═══ Scroll to Line Number ═══ ═══ Select Include ═══ ═══ Change Text File ═══ ═══ Breakpoints Menu ═══ ═══ Set Line ═══ ═══ Set Function ═══ ═══ Set Storage Change ═══ ═══ Set Load Occurrence ═══ ═══ Breakpoints Menu ═══ ═══ Toggle at Current Line ═══ ═══ Delete all ═══ ═══ Prefix Area Popup Menu ═══ ═══ Prefix Area Popup Menu ═══ ═══ Monitors Menu ═══ ═══ Monitor Expression Dialog ═══ ═══ Call Stack Window ═══ ═══ Registers Monitor ═══ ═══ Storage Monitor ═══ ═══ Local Variables Monitor ═══ ═══ Run Menu ═══ ═══ Step Over ═══ ═══ Step Into ═══ ═══ Step Return ═══ ═══ Run ═══ ═══ Halt ═══ ═══ Run to Location ═══ ═══ Jump to Location ═══ ═══ Hide Debugger on Run ═══ ═══ Thread Enabled ═══ ═══ Options Menu ═══ ═══ Window Settings ═══ ═══ Window Settings ═══ ═══ Window Settings ═══ ═══ Window Settings ═══ ═══ Window Settings ═══ ═══ Debugger Settings ═══ ═══ Debugger Properties Dialog ═══ ═══ Monitor Properties Dialog ═══ ═══ Default Data Representation ═══ ═══ Exception Filtering ═══ ═══ Save Debugger Window Positions ═══ ═══ Global Font Change ═══ ═══ Enable Window Cascading ═══ ═══ Program Profiles ═══ ═══ Program Profiles ═══ ═══ Program Profiles ═══ ═══ Program Profiles ═══ ═══ Windows Menu ═══ ═══ Help ═══ ═══ Help ═══ ═══ Help ═══ ═══ Help ═══ ═══ Help ═══ ═══ Help ═══ ═══ Prefix Area Popup Menu ═══ ═══ Prefix Area Popup Menu ═══ ═══ Code Area Popup Menu ═══ ═══ Code Area Popup Menu ═══ ═══ Code Area Popup Menu ═══ ═══ Code Area Popup Menu ═══ ═══ Code Area Popup Menu ═══ ═══ Code Area Popup Menu ═══ ═══ Code Area Popup Menu ═══ ═══ Code Area Popup Menu ═══ ═══ Breakpoints List Window ═══ ═══ File Menu ═══ ═══ Close Debugger ═══ ═══ Edit Menu ═══ ═══ Delete ═══ ═══ Disable ═══ ═══ Modify ═══ ═══ Delete all ═══ ═══ Disable All ═══ ═══ Enable All ═══ ═══ Set Menu ═══ ═══ Set Line ═══ ═══ Set Function ═══ ═══ Set Storage Change ═══ ═══ Set Load Occurrence ═══ ═══ Options Menu ═══ ═══ Options Menu ═══ ═══ Display Style ═══ ═══ Sort ═══ ═══ Options Menu ═══ ═══ Windows Menu ═══ ═══ Help ═══ ═══ Help ═══ ═══ Help ═══ ═══ Help ═══ ═══ Help ═══ ═══ Help ═══ ═══ View ═══ ═══ Delete ═══ ═══ Modify ═══ ═══ Delete all ═══ ═══ Call Stack Window ═══ ═══ File Menu ═══ ═══ Close Debugger ═══ ═══ Options Menu ═══ ═══ Options Menu ═══ ═══ Display Style ═══ ═══ Options Menu ═══ ═══ Windows Menu ═══ ═══ Help ═══ ═══ Help ═══ ═══ Help ═══ ═══ Help ═══ ═══ Help ═══ ═══ Help ═══ ═══ View Menu ═══ ═══ Private Monitor ═══ ═══ File Menu ═══ ═══ Close Debugger ═══ ═══ Edit Menu ═══ ═══ Delete ═══ ═══ Delete All ═══ ═══ Select All ═══ ═══ Deselect All ═══ ═══ Enable ═══ ═══ Disable ═══ ═══ Other Elements ═══ ═══ Representation, Next Representation ═══ ═══ Representation, Next Representation ═══ ═══ Representation, Next Representation ═══ ═══ Options Menu ═══ ═══ Options Menu ═══ ═══ Options Menu ═══ ═══ Show Context ═══ ═══ Show Enablement ═══ ═══ Help ═══ ═══ Help ═══ ═══ Help ═══ ═══ Help ═══ ═══ Help ═══ ═══ Help ═══ ═══ Program Monitor ═══ ═══ File Menu ═══ ═══ Close Debugger ═══ ═══ Edit Menu ═══ ═══ Delete ═══ ═══ Delete All ═══ ═══ Select All ═══ ═══ Deselect All ═══ ═══ Enable ═══ ═══ Disable ═══ ═══ Other Elements ═══ ═══ Representation, Next Representation ═══ ═══ Options Menu ═══ ═══ Options Menu ═══ ═══ Options Menu ═══ ═══ Show Context ═══ ═══ Show Enablement ═══ ═══ Windows Menu ═══ ═══ Help ═══ ═══ Help ═══ ═══ Help ═══ ═══ Help ═══ ═══ Help ═══ ═══ Help ═══ ═══ Local Variables Monitor ═══ ═══ File Menu ═══ ═══ Close Debugger ═══ ═══ Edit Menu ═══ ═══ Delete ═══ ═══ Select All ═══ ═══ Deselect All ═══ ═══ Other Elements ═══ ═══ Representation, Next Representation ═══ ═══ Options Menu ═══ ═══ Options Menu ═══ ═══ Options Menu ═══ ═══ Show Context ═══ ═══ Show Enablement ═══ ═══ Windows Menu ═══ ═══ Help ═══ ═══ Help ═══ ═══ Help ═══ ═══ Help ═══ ═══ Help ═══ ═══ Help ═══ ═══ Popup Monitor ═══ ═══ Delete ═══ ═══ Disable ═══ ═══ Edit Contents ═══ ═══ Dereference ═══ ═══ Representation, Next Representation ═══ ═══ Other Elements ═══ ═══ Registers Monitor ═══ ═══ File Menu ═══ ═══ Close Debugger ═══ ═══ Options Menu ═══ ═══ Options Menu ═══ ═══ Display Style ═══ ═══ Options Menu ═══ ═══ Windows Menu ═══ ═══ Help ═══ ═══ Help ═══ ═══ Help ═══ ═══ Help ═══ ═══ Help ═══ ═══ Help ═══ ═══ Storage Monitor ═══ ═══ File Menu ═══ ═══ Close Debugger ═══ ═══ Options Menu ═══ ═══ Options Menu ═══ ═══ Display Style ═══ ═══ Monitor Expression in Storage ═══ ═══ Options Menu ═══ ═══ Windows Menu ═══ ═══ Help ═══ ═══ Help ═══ ═══ Help ═══ ═══ Help ═══ ═══ Help ═══ ═══ Help ═══ ═══ Default Data Representation ═══ ═══ Default Data Representation ═══ ═══ Shortcut Keys ═══ ═══ Set Line ═══ ═══ Set Function ═══ ═══ Set Storage Change ═══ ═══ Set Load Occurrence ═══ ═══ Breakpoints Menu ═══ ═══ Display Style ═══ ═══ Default Data Representation ═══ ═══ Display Style ═══ ═══ Exception Filtering Dialog ═══ ═══ Exception Dialog ═══ ═══ Find Function Dialog ═══ ═══ Monitor Expression Dialog ═══ ═══ Monitor Properties Dialog ═══ ═══ Open New Source Dialog ═══ ═══ Overloaded Dialog ═══ ═══ Overloaded Dialog ═══ ═══ Program Profiles ═══ ═══ Program Profiles ═══ ═══ Program Profiles ═══ ═══ Display Style ═══ ═══ Change Text File ═══ ═══ Window Settings ═══ ═══ Source Filename Dialog ═══ ═══ Debugger Properties Dialog ═══ ═══ Scroll to Line Number ═══ ═══ Find ═══ ═══ Select Include ═══ ═══ Monitor Expression in Storage ═══ ═══ Display Style ═══ ═══ Display Style ═══ ═══ Other Elements ═══ ═══ Delete ═══ ═══ Prefix Area Popup Menu ═══ ═══ Prefix Area Popup Menu ═══ ═══ Run ═══ ═══ Step Into ═══ ═══ Step Over ═══ ═══ Step Return ═══ ═══ Call Stack Button ═══ ═══ Registers Button ═══ ═══ Storage Button ═══ ═══ Session Control Button ═══ ═══ Monitor Expression Button ═══ ═══ Breakpoints Button ═══ ═══ Growth Direction Push button ═══ ═══ Delete Button ═══ ═══ Delete all ═══