g++compiler and the
gdbdebugger. Both of these tools are run through
emacs, which provides much support for their convenient usage.
Both tools provide good support for an essential programming task: debugging. The compiler itself helps you find compile-time errors, which are typically syntactic in nature, by (hopefully) pointing you to the offending line in the source code. The debugger helps you with what is often a more difficult task: finding run-time errors, which are typically errors in your programming logic.
We are providing two auxilliary documents which you should read while doing this lab:
mc38directory and copy the lab files to a subdirectory
mkdir gdb cp ~mc38/labs/compile-debug/stats.cc gdb
emacsand load the program file
stats.cc. Recall that you can invoke the emacs command
C-x C-f. Alternatively, you can load the file while invoking emacs by typing
emacs stats.cc &assuming you are in the directory containing stats.cc.
stats.cc is a simple program which finds the mean,
median and mode of an unsorted array. It almost works, but needs your
help in fixing it.
M-x compileThe default command emacs offers to execute for compilation is
make -k. This assumes the existence of a makefile which we do not have for this lab. You need to replace this with the appropriate call to
g++. Using the online notes on Using g++ in the course homepage, figure out the one call to
g++which will compile the file into an executable program, give all possible warnings, generate information for
gdb(the debugger), and name the executable file
g++cannot compile the program. The code contains a few syntax errors which you are quite likely to make when you write programs. Use the control sequence C-x <backquote> to jump directly to errors found by
g++. (The <backquote> key is the opposite of <apostrphe> and is usually in the upper left corner of the keyboard.) Find all the errors and correct them (there are six syntax errors altogether).
You will find it useful to recompile after correcting a few errors as g++'s messages can change significantly after some corrections.
You may also find it useful to use Emacs color highlighting as a guide to spotting syntax errors. Hitting C-l will update the colors to match the changes you've made.
Emacs, leaving the
*compilation*buffers on your screen. Ask to be checked off for this part.
g++is able to compile the code, you should get an executable file for output. Using either emacs's shell or the actual shell window, execute this file by simply typing:
./statsCan you tell there is something wrong? This type of error, which occurs at run-time, tends to be significantly more tricky to correct than compile-time errors. It is for this type of error that the debugger
gdbis particularly helpful.
gdbwithin emacs using
M-x gdbThis command will ask for an argument: the name of the executable we are going to debug. In this case, it is
Before actually starting the debugging process, you should get a basic
understanding of what can
gdb can do by reading through
the online documentation Using
gdb in the course homepage. Additional documentation can be
found through emac's Info system (
At this point, you should examine the program, and experiment with
gdb to isolate the error (which function is likely to be
responsible?). In particular, you will need to set breakpoints (either use
C-x SPC in the code, or tell it to break at a given
procedure), examine the contents of variables, and step through
program statements. We find it especially useful to display the
display instead of
display will display the specified variables each
time you step through the program.
Do not forget to execute the program within
run), otherwise nothing will happen. Also, a plain
run thereafter will restart your program from the top.
We reassure you that the error can be corrected by changing only one line.
When you think you have found the error: correct it, save the file, recompile and execute to see if the problem is solved.
gdbon your corrected version and find the values of
a[j+1]at the test statement on the third pass of both the outer and inner loops (i.e. pass = 3 and j = 2) of the bubbleSort function.