Debugging

In this lab, you will learn how to use the debugger along with a bit about reference variables and parameter passing.

Debugging
To Get Started ...

Download the jar file: Debug.jar to your csci/201 directory, unjar the file (Help), create a new NetBeans project called Debug, and mount the Debug directory created when you unjarred the archive file (Help). Your directory structure should look something like the picture below:
After the jar

Wouldn't it be helpful to see the Java code being executed one line at a time? This is something we can do with the debugger.

A debugger can step through your program code while you examine the values of your program variables. You can also set a breakpoint on a line of code of your program. Your program executes normally until it reaches the breakpoint at which point the program is halted so that you can examine its variables.

Setting a breakpoint

Let's start by setting a breakpoint in the DebugExample class. Do this by placing your cursor anywhere within the line that says:


      rating = PromptIO.ReadInteger("Enter a teacher rating... ", 0) ;

Next right click while the cursor remains on the line of Java code. You should see a new pulldown menu. Select Toggle Breakpoint from the menu. A pink rectangle should now surround the selected line.
Selected line for debugging

Starting the debugger

You can start debugging from the Project pull-down menu by selecting Debug Project. or you can just select the Run in Debugger button, Run in debugger icon.

Your program starts, screen flash, and soon you should see that the line with the breakpoint now has a green background and is the target of a little green arrow. Your breakpoint has been reached.
At the breakpoint

The debugger window

Be sure that the left panel is displaying the Debugger Window. If not, select the Debugging tab.

At the top of the Debugger Window is a line of nine icons. Start by turning off all of these nine selections, so that your icons display as below. These icons control your view of your program and its variables. We're going to experiement with these controls. In the following few paragraphs turn on and off each icon to see its effect. By the way, it is possible to have several icons selected simultaneously.
Debugger windows selections

Debugger view controls

Sessions The first icon shows the status of your debugging sessions. It should show that your DebugExample session has been stopped on a breakpoint. It is unlikely that you will ever intentionally have more than one active debugging session while a student in this course.

Threads The second icon shows the status of your program's threads. It is possible to have more than one Java interpreter simultaneously executing the methods of your program. In fact, multi-threaded applications are required for interesting multi-media applications and you have undoubtedly encountered many on the web. Right now, your application may appear to have only one thread, but push down on those expanders, and you'll see more.
Threads in debug window

Call Stack The third icon shows your call stack. This can be used to determine the series of method calls that were made to reach the breakpoint.

Local Variables The fourth icon displays the local variables of a active method invocation. It is possible, though rarely advisable, to change the value of a variable in this display. Because an object may be passed between method, it may appear in many different method invocations.

All in One The debugger may be working on several sessions. Each session may be executed by several threads, each with its own call stack. Each call stack may have several method invocations, each with its own set of local variables. The fifth icon, called All in One, puts this entire hierarchy into a single display. Press the expanders in the All in One window to descend to the depths of your Java program.
All in One window

Watches The sixth icon controls watches. A watch is a variable the debugger is actively tracking. This used with a programmer thinks a particular variable is causing problems and requires special attention. The value of that variable is displayed in the watch list.

Classes The seventh icon allows you to lists the fields, constructors, and methods of your active classes. Many classes are within packages and you must descent through the class hierarchy to uncover them. Press the Classes icon. Notice that the class Teacher is not displayed. That's because your program has yet to instantiate an object of class Teacher.

Breakpoints The eighth icon provides a quick list of breakpoints.

Properties The ninth icon is for properties, a mechanism for internationalizing the text displayed by a Java application. You won't use them here.

Stepping through the code

When you reach a breakpoint, you can start stepping through the code. For each line of code, you can either:

Stepping through the DebugExample

Presumably your debugger is still waiting at the breakpoint. Go into the Local Variables view where you should see nothing put a single variable args.

Now lets do some debugging. Use the Step Over button, or F8 key, to execute the current line of code and advance to the next. Notice the prompt for input in the output window. Notice also that you can't advance until you provide that input. Enter a value for rating and see its value in the local variables display.

Contine to step over lines of code until the first call to the zeroRating() method is highlighted. By now, you should have a teacher reference variable in the local variables display. Click the expander to teacher to view its instance variables.
Expanding local variables
Note that some of the instance variables are also references to objects that can be viewed. Explore all reference variables and make sure that you understand what you see.

Now use the Step Into button, or the F7 key, to step into the zeroRating() method. Display both the call stack and local variables windows and switch between the two sets of local variables by choosing between the two frames of the call stack. You choose a frame by double-clicking on that frame in the call stack.
zeroRating stack frame zeroRating stack frame

Instructor Checkoff ...

Advance to the "}" marking the end of the zeroRating() method.

Show your lab instructor the variables in both zeroRating() and main(). Explain why the value of rating in main() is not changed by the call to zeroRating().

Instructor Checkoff ...

Advance until the second call to zeroRating() is highlighted, and then step in to zeroRating(). Again, observe the call stack and local variables display. Click the expander to view the object referenced by the argument inputTeacher. Advance to the "}" marking the end of this zeroRating() method.

Show your lab instructor the variables in both zeroRating() and main(). Explain why the Teacher object created in main() is changed by the call to zeroRating().