This assignment is due at 9 PM on Wednesday, October 4th, 2000. The assignment is a written one, and must be submitted as a single file, a README. Refer to the homework policies page for general homework guidelines.
This assignment has only one purpose, which is to familiarize you with interactive debuggers.
assign_05 is a simple file shuffler. It
reads lines from a file (provided on the standard input device,
cin), shuffles them into a random order, and writes them
to its standard output,
cout. Although it is quite
simple, the program can be used to perform relatively complex tasks.
For example, the class summary
schedule was produced by running the CS70 class roster through a
C version of the same program. A random line can be chosen from a file such
/etc/passwd with the command:
./assign_05 < /etc/passwd | head -1
To the best of my knowledge, the program is free of bugs. However, for instructional reasons it is much less efficient than it could be.
For this assignment, you will run the program under an interactive debugger and follow a list of steps. Most steps will require you to record the answer to a question. The final result will be submitted as a README file. Other than a file header (name, date, etc.), the README should not have "documentation" components such as the program purpose or input format. Please number your answers corresponding to the step in which the question is asked, leaving gaps if a step asks no question.
The assignment is written for use with the interactive debugger
ddd on Turing.
It is not possible to do the assignment with a different debugger,
primarily because minor debugger variations make grading impossible.
Also, it is probably not possible to do the assignment by using a
Windows machine to connect to Turing, because ddd expects that you
will be connecting from an X-compatible display, and to the best of my
knowledge Windows machines can't do that securely.
The program for the assignment is implemented using 4 files: a Makefile, a main program (assign_05.cc), and a header file (line.hh) and implementation (line.cc) for a pair of classes that support some simple operations on text lines. There is also a sample input file (hw5-input.txt). As usual, you can download all of the files as a gzipped tar file or a zip archive.
echo $EDITOR". If the response is the name of some other editor, fix it by typing "
setenv EDITOR vi", "
setenv EDITOR pico", or whatever is appropriate to your taste.
ddddebugger from the command line by typing
hw5-input.txtin response to the prompt for arguments. You will see 16 words scroll by in the window at the bottom of the screen. Question: In order, what are they? (You may use cut-and-paste, and you don't have to list them one per line).
File/Open Source...to bring up a list of the source files involved in the program. Most of them are system files that aren't of interest to us, so find
line.ccand open it.
LineGetter::getLine. Select the full name (including the scope qualifier) and click on the stop sign labeled "Break" to set a breakpoint. Run the program again, this time giving the arguments "
-s 0 hw5-input.txt". Question: What happens?
Nextbutton in the pop-up toolbar to step through the program until you reach the first "else if" statement. Rest the mouse on the string "
nextCharacter". Question: What happens?
nextCharacter. Then click
Displayon the main toolbar. Click
Nextrepeatedly until nextCharacter changes. Question: What is it?
line = expand...". Click at the start of the line, and set a breakpoint. Hit the
Cont(continue) button. Question: Where does the program stop?
Contrepeatedly until you reach the breakpoint at the
expandcall. Question: How many times did you hit
Runbutton to run again. This time, type "
continue 2" on your keyboard (the characters will appear in the small gdb window at the bottom). Question: Where does the program stop?
Source/Breakpoints...to disable breakpoint #1 and run the program yet again. Question: What is the value of
Stepbutton. Question: Where are we?
line. Question: What is its hexadecimal value?
Nextbutton. Question: Where are we?
linerepresents the address at which that array of characters is stored. Question: Where is
Source/Breakpointsto delete breakpoint 2 and enable breakpoint 1. Hit the
Finishbutton. Question: Where are we?
Upbutton. Question: Where are we?
whereToPutIt. Select the
...inside the curly braces, and choose
Show/Show All. Question: What is the value of _M_start?
Undisplto un-display what you just saw. Select
_M_startwith a single click, then click and hold on
Displayto pick the get a pop-down menu. Choose
Other.... Put an asterisk at the front of the expression, and "
@5" at the end, and then display. Scroll to the right. Question: What do you see?
Show. Question: Where are the 5 contents variables stored?
next 4to get to the
whileloop quickly; this makes
lengtha valid variable. Click to select
length, and then click
Watchto set a watchpoint that will stop the program whenever
lengthchanges. (Warning: this can make your program run very slowly.) Finally, hit
Cont. Question: Where does the program stop?
length, and then click
Watchto delete the watchpoint. (This also works with breakpoints.) Also delete the breakpoint at the beginning of
getLine. Scroll down to find any constructor for
Line, and select the text
Line::Line(without any parentheses). Click the
Breakbutton. Choose the
alloption in the dialog box. Continue the program. Question: Where does it stop?
Status/Backtrace...to see who called whom. Question: Who called the function that called us?
Killbutton to kill the current program. Make sure you are displaying
assign_05.cc, and hit the
Editbutton to bring up your favorite editor. Find the call to
drand48at the very end of the file (inside the
randomizefunction), and change it to read:
unsigned int j = (unsigned int) lrand48();Exit your editor and hit the
dddto recompile the program. Use
Source/Breakpointsto delete the remaining breakpoint, and run the program again with the arguments "
-s 0 hw5-input.txt". Question: What happens, and where?
source>in the line that refers to
source.lineNumber. Question: What does the status line say?
lineNumberon the left of the assignment statement. Question: What does the popup say?
Display/Convert to Hex. Question: What is the value in hex?
unsigned int j = (unsigned int) (drand48() * array.size());Recompile the program, and run it one last time with the arguments "
-d -n -s 1 hw5-input.txt". Question: What are the 17 lines that are printed?
The only file you need to submit for this assignment is the README.
cs70submit to submit it, rather than
cs70submitall, so that only the README will get picked
up. If you use
cs70submitall, you will merely clutter up
the grader directories.
Don't forget to spell-check your file.
In a couple of places,
assign_05.cc deliberately uses a
very inefficient implementation for illustrative purposes. If you
ever expect to use it in the future, you should change
array argument by reference, and returns
void. Don't worry if you don't know how to do that right
now; we'll cover references in class soon.
This page maintained by Geoff Kuenning.