CS61C Lab 1 – C Pointers and GDB

$30.00

Category: You will Instantly receive a download link for .zip solution file upon Payment || To Order Original Work Click Custom Order?

Description

5/5 - (4 votes)

Goals
Learn how to compile and run a C program on the EECS instructional computers.
Examine diferent types of control flow in C.
Introduce you to the C debugger gdb (and its cousin, cgdb).
Gain some practical experience using gdb to debug a buggy C program.
Setup
Copy the contents of ~cs61c/labs/01 to a suitable location in your home directory.
$ cp -r ~cs61c/labs/01/ ~/labs/01
Compiling and Running a C Program
In this lab, we will be using the command line program gcc to compile programs in C. The simplest
way to run gcc is as follows.
$ gcc program.c
This compiles program.c into an executable file named a.out. This file can be run with the
following command.
$ ./a.out
gcc has various command line options which you are encouraged to explore. In this lab, however,
we will only be using -o, which is used to specify the name of the executable file that gcc creates.
Using -o, you would use the following commands to compile program.c into a program named
program, and then run it.
$ gcc -o program program.c
$ ./program
Exercise 1: Simple C Program
In this exercise, we will see an example of preprocessor macro definitions. Macros can be a messy
CS61C Summer 2015 Lab 1 1/20/18, 3)12 PM
http://www-inst.eecs.berkeley.edu/~cs61c/su15/labs/01/ Page 2 of 5
topic, but in general the way they work is that before a C file is compiled, all macro constant names
are replaced exactly with the value they refer to.
In the scope of this exercise, we will be using macro definitions exclusively as global constants.
Here we define CONSTANT_NAME to refer to literal_value (an integer literal). Note that there is only
a space separating name from value.
#define CONSTANT_NAME literal_value
Now, look at the code contained in eccentric.c. We see four diferent examples of basic C control
flow. First compile and run the program to see what it does. Play around with the constant values of
the four macro: V0 through V3. See how changing them changes the program output. Modifying
only these four values, make the program produce the following output.
$ gcc -o eccentric eccentric.c
$ ./eccentric
Berkeley eccentrics:
====================
Happy Happy Happy
Yoshua
Go BEARS!
There are actually several diferent combinations of values that can give this output. You should
consider what is the minimum number of diferent values V0 through V3 can have to give this same
output. The maximum is four, when they are all distinct from each other.
Checkof
Explain the changes you made.
Explain the minimum number of diferent values needed for the preprocessor macros.
Exercise 2: Debugger
For this exercise, you will find the GDB reference card useful. Compile hello.c with the “-g” flag:
$ gcc -g -o hello hello.c
This causes gcc to store information in the executable program for gdb to make sense of it. Now
start the debugger, (c)gdb:
CS61C Summer 2015 Lab 1 1/20/18, 3)12 PM
http://www-inst.eecs.berkeley.edu/~cs61c/su15/labs/01/ Page 3 of 5
$ cgdb hello
If cgdb does not work, you can also use gdb to complete the following exercises (start gdb
with gdb hello). The cgdb debugger is only installed on your cs61c-XX accounts. Please use the
hive machines or one of the computers in 271, 273, 275, or 277 soda to run cgdb, since our
version of cgdb was built for Ubuntu.
Step through the whole program by:
1. setting a breakpoint at main
2. giving gdb’s run command
3. using gdb’s single-step command
Type help from within gdb to find out the commands to do these things, or use the reference card.
cgdb vs gdb
In this exercise, we use cgdb to debug our programs. cgdb is identical to gdb, except it provides
some extra nice features that make it more pleasant to use in practice. All of the commands on the
reference sheet work in gdb.
In cgdb, you can press ESC to go to the code window (top) and i to return to the command
window (bottom) — similar to vim. The bottom command window is where you’ll enter your
gdb commands.
More gdb commands
Learning these commands will prove useful for the rest of this lab, and your C programming career
in general. Create a text file containing answers to the following questions:
1. How do you pass command line arguments to a program when using gdb?
2. How do you set a breakpoint which only occurs when a set of conditions is true (e.g. when
certain variables are a certain value)?
3. How do you execute the next line of C code in the program after stopping at a breakpoint?
4. If the next line of code is a function call, you’ll execute the whole function call at once if you
use your answer to #3. How do you tell GDB that you want to debug the code inside the
function instead?
5. How do you resume the program after stopping at a breakpoint?
6. How can you see the value of a variable (or even an expression like 1+2) in gdb?
7. How do you configure gdb so it prints the value of a variable after every step?
8. How do you print a list of all variables and their values in the current function?
9. How do you exit out of gdb?
Checkof
Set the breakpoint at main, and show your TA how you run up to that breakpoint. Show
CS61C Summer 2015 Lab 1 1/20/18, 3)12 PM
http://www-inst.eecs.berkeley.edu/~cs61c/su15/labs/01/ Page 4 of 5
your TA your text document containing the additional gdb commands.
Exercise 3: Debugging a buggy C program
You will now use your newly acquired gdb knowledge to debug a short C program! Consider the
program ll_equal.c. Compile and run the program, and experiment with it. It will give you the
following result:
$ gcc -g -o ll_equal ll_equal.c
$ ./ll_equal
equal test 1 result = 1
Segmentation fault
Now, start gdb on the program, following the instructions in exercise 1. Set a breakpoint in the
ll_equal() function, and run the program. When the debugger returns at the breakpoint, step
through the instructions in the function line by line, and examine the values of the variables. Pay
attention to the pointers a and b in the function. Are they always pointed to the right address? Find
the bug and fix it.
Checkof
Explain the bug and your fix to the function.
Exercise 4: Pointers and Structures in C
Here’s one to help you in your interviews. In ll_cycle.c, complete the function ll_has_cycle() to
implement the following algorithm for checking if a singly-linked list has a cycle.
1. Start with two pointers at the head of the list. We’ll call the first one tortoise and the second
one hare.
2. Advance hare by two nodes. If this is not possible because of a null pointer, we have found
the end of the list, and therefore the list is acyclic.
3. Advance tortoise by one node. (A null pointer check is unnecessary. Why?)
4. If tortoise and hare point to the same node, the list is cyclic. Otherwise, go back to step 2.
After you have correctly implemented ll_has_cycle(), the program you get when you compile
ll_cycle.c will tell you that ll_has_cycle() agrees with what the program expected it to output.
Checkof
CS61C Summer 2015 Lab 1 1/20/18, 3)12 PM
http://www-inst.eecs.berkeley.edu/~cs61c/su15/labs/01/ Page 5 of 5
Show your ll_has_cycle() function to the TA.