Top Banner
RAOUL RIVAS PORTLAND STATE UNIVERSITY CS201 – Lecture 2 GDB, The C Library
27

CS201 Lecture 2 GDB, The C Library - Raoul Rivas · CS201 –Lecture 2 GDB, The C Library. Announcements CS201: Computer Science Programming Raoul Rivas (Based on slides from Bryant

May 15, 2020

Download

Documents

dariahiddleston
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: CS201 Lecture 2 GDB, The C Library - Raoul Rivas · CS201 –Lecture 2 GDB, The C Library. Announcements CS201: Computer Science Programming Raoul Rivas (Based on slides from Bryant

RAOUL RIVAS

PORTLAND STATE UNIVERSITY

CS201 – Lecture 2GDB, The C Library

Page 2: CS201 Lecture 2 GDB, The C Library - Raoul Rivas · CS201 –Lecture 2 GDB, The C Library. Announcements CS201: Computer Science Programming Raoul Rivas (Based on slides from Bryant

Announcements

CS201: Computer Science Programming Raoul Rivas (Based on slides from Bryant and O’Hallaron)

2

Page 3: CS201 Lecture 2 GDB, The C Library - Raoul Rivas · CS201 –Lecture 2 GDB, The C Library. Announcements CS201: Computer Science Programming Raoul Rivas (Based on slides from Bryant

Multidimensional Dynamically Allocated Arrays▪ Direct access support.▪ Same as Multidimensional Static Arrays

▪ No direct allocation support▪ Declare a single dimension array of pointers (Rows)

▪ For each row allocate an array (Columns)

CS201: Computer Science Programming Raoul Rivas (Based on slides from Bryant and O’Hallaron)

3

0x100

0x123

0x230

0x510

array

Char** Char*

What’s the value of array[1][2]?

X Y Z

A B C

D E F

G H I

Page 4: CS201 Lecture 2 GDB, The C Library - Raoul Rivas · CS201 –Lecture 2 GDB, The C Library. Announcements CS201: Computer Science Programming Raoul Rivas (Based on slides from Bryant

Multidimensional Dynamically Allocated Arrays

CS201: Computer Science Programming Raoul Rivas (Based on slides from Bryant and O’Hallaron)

4

0x100

0x123

0x230

0x510

array X Y Z

A B C

D E F

G H I

Char** Char*

char** array;int i;

array = (char**)malloc(sizeof(char*)*4);

for(i=0; i < 4; i++){array[i] = (char*)malloc(sizeof(char)*3);

}

array[2][0]=‘D’;

for(i=0; i < 4; i++) {free (array[i]);

}

free(array);

Page 5: CS201 Lecture 2 GDB, The C Library - Raoul Rivas · CS201 –Lecture 2 GDB, The C Library. Announcements CS201: Computer Science Programming Raoul Rivas (Based on slides from Bryant

Alternate Method▪ Store the data in a single dimension array▪ Flatten array into a single dimension

▪ Compute offsets during access

▪ Can’t use multiple subscripts

CS201: Computer Science Programming Raoul Rivas (Based on slides from Bryant and O’Hallaron)

5

array = (char*)malloc(sizeof(char*)*4*3);idx=2*3+1;array[idx]=‘E’; free(array);

X Y ZA B CD E FG H I

X Y Z A B C D E F G H I

array

0 11

Page 6: CS201 Lecture 2 GDB, The C Library - Raoul Rivas · CS201 –Lecture 2 GDB, The C Library. Announcements CS201: Computer Science Programming Raoul Rivas (Based on slides from Bryant

The C Library▪ Standard library available across all C compilers▪ Part of ANSI C

▪ Many implementations▪ Microsoft C Runtime Library

▪ GNU C library

▪ Provides many services▪ File Access

▪ Read and write to console

▪ String Manipulation

▪ Mathematical functions

▪ Time and Date functions

▪ Divided into modules▪ Include header file with definitions before you can use them

CS201: Computer Science Programming Raoul Rivas (Based on slides from Bryant and O’Hallaron)

6

#include <header.h>

Page 7: CS201 Lecture 2 GDB, The C Library - Raoul Rivas · CS201 –Lecture 2 GDB, The C Library. Announcements CS201: Computer Science Programming Raoul Rivas (Based on slides from Bryant

Back to Hello, world

CS201: Computer Science Programming Raoul Rivas (Based on slides from Bryant and O’Hallaron)

7

#include <stdio.h>

main()

{

printf(“hello, world”);

}

Include stdio.h header file (so we can use printf)

Page 8: CS201 Lecture 2 GDB, The C Library - Raoul Rivas · CS201 –Lecture 2 GDB, The C Library. Announcements CS201: Computer Science Programming Raoul Rivas (Based on slides from Bryant

String Manipulation▪ Assumes all strings are C-Strings▪ char arrays with NULL character at the end (‘\0’)

▪ strlen(char *s1)▪ Returns the number of character in the string not including the

NULL character

▪ strncpy(char *dest, char *src, int n)▪ Copies at most n characters of src on top of dest

▪ strncmp(char *s1, char *s2, int n)▪ Compares up to n characters of s1 with s2

▪ Returns 0 if s1== s2. Returns less than 0 if s1 < s2. Returns more than 0 if s1 > s2

▪ strncat(char* s1, char *s2, int n)▪ Appends up to n characters of s2 at the end of s1

CS201: Computer Science Programming Raoul Rivas (Based on slides from Bryant and O’Hallaron)

8

Page 9: CS201 Lecture 2 GDB, The C Library - Raoul Rivas · CS201 –Lecture 2 GDB, The C Library. Announcements CS201: Computer Science Programming Raoul Rivas (Based on slides from Bryant

String Manipulation

CS201: Computer Science Programming Raoul Rivas (Based on slides from Bryant and O’Hallaron)

9

#include <stdio.h>#include <string.h>

int main (){char str1[]= "To be or not to be";char str2[40];char str3[6];

/* copy to sized buffer */strncpy ( str2, str1, sizeof(str2) );

/* partial copy (only 5 chars): */strncpy ( str3, str2, 5 );/* null character manually added */str3[5] = '\0';

return 0;}

Is the manually added NULL

necessary? Why?

Page 10: CS201 Lecture 2 GDB, The C Library - Raoul Rivas · CS201 –Lecture 2 GDB, The C Library. Announcements CS201: Computer Science Programming Raoul Rivas (Based on slides from Bryant

File I/O▪ FILE *fopen(const char *filename, const char *mode);▪ Opens/Creates a file for read or write. Returns a pointer to a FILE structure

▪ Mode: “r” - Read, “w”- Write, “a” - Append, “b” - Binary mode

▪ int fclose(FILE *a_file);▪ Close the file

▪ ASCII Read/Write▪ fprintf(), fscanf(), fgets()

▪ Usually read one line at a time

▪ Good for Text, CSV files and files with line breaks

▪ Binary Read/Write▪ Write of data in binary format

▪ Read/Write M-blocks of N-bytes at a time

▪ Use fwrite() and fread()

CS201: Computer Science Programming Raoul Rivas (Based on slides from Bryant and O’Hallaron)

10

Page 11: CS201 Lecture 2 GDB, The C Library - Raoul Rivas · CS201 –Lecture 2 GDB, The C Library. Announcements CS201: Computer Science Programming Raoul Rivas (Based on slides from Bryant

Console I/O▪ Console I/O is like reading from a file. You can use the same file functions just specify “stdin” and ‘stdout” as the file pointers

▪ There are some specific functions for stdin and stdout are provided in the C library▪ Most used function for console writing is printf

▪ Sometimes the File and Console versions have different behaviors or parameters

▪ fgets() does not behave the same a gets()

▪ Data read from the file/console must be validated▪ fscanf() and scanf() are subject to many attacks

▪ fgets() is the safest way to read from the file/console

▪ Parse the string afterwards and convert to the specific types

CS201: Computer Science Programming Raoul Rivas (Based on slides from Bryant and O’Hallaron)

11

stdin

stdout

Page 12: CS201 Lecture 2 GDB, The C Library - Raoul Rivas · CS201 –Lecture 2 GDB, The C Library. Announcements CS201: Computer Science Programming Raoul Rivas (Based on slides from Bryant

String to Numbers▪ Various functions based on the type▪ strtol, strtoll, stroul, etc

▪ long int strtol (const char* str, char** endptr, int base);▪ Parses a number inside a string and outputs it as a long

▪ str contains the string to parse

▪ endptr is an optional return value to the remaining of the string after the number

▪ base is the Base of the number (hex, octal, decimal, etc). Use zero for autodetect based on the format.

CS201: Computer Science Programming Raoul Rivas (Based on slides from Bryant and O’Hallaron)

12

int main (){char str1[]=“16734893”;long number;

number=strtol(str1, NULL, 10);return 0;

}

Page 13: CS201 Lecture 2 GDB, The C Library - Raoul Rivas · CS201 –Lecture 2 GDB, The C Library. Announcements CS201: Computer Science Programming Raoul Rivas (Based on slides from Bryant

Numbers to Strings▪ Use sprint to create a string with the format you need▪ sprintf(char* str, char *format, …)▪ str contains the destination string. Make sure is pre-allocated to the maximum

possible length.

▪ Limits.h contains macros with the largest and smallest number supported for each type.

▪ log10(𝑀𝑎𝑥𝑁𝑢𝑚) + 1, not counting the sign

▪ Format is the format string used by the printf family of functions

▪ printf, fprintf, sprint

CS201: Computer Science Programming Raoul Rivas (Based on slides from Bryant and O’Hallaron)

13

int main (){char str1[12];int number= 16734893;

sprintf(str1, “%d”, number);return 0;

}

Page 14: CS201 Lecture 2 GDB, The C Library - Raoul Rivas · CS201 –Lecture 2 GDB, The C Library. Announcements CS201: Computer Science Programming Raoul Rivas (Based on slides from Bryant

Assertions▪ Assertions are runtime checks placed on a program that are only checked during development

▪ They are ignored for “production” code.▪ We define the macro NDEBUG to indicate that our code is “production”

code

▪ An Assertion must be true at the time of its execution or the program will stop.

▪ To check an assertion we call the assert() function

▪ Do not use assertions to catch user or runtime errors

CS201: Computer Science Programming Raoul Rivas (Based on slides from Bryant and O’Hallaron)

14

#define NDEBUG

assert(condition);

Page 15: CS201 Lecture 2 GDB, The C Library - Raoul Rivas · CS201 –Lecture 2 GDB, The C Library. Announcements CS201: Computer Science Programming Raoul Rivas (Based on slides from Bryant

Assertions

▪ Not a user or runtime error

▪ Assert Fails and memcpy never executes

CS201: Computer Science Programming Raoul Rivas (Based on slides from Bryant and O’Hallaron)

15

int main(){

int str1[] = {1,2,3,4,5}int str2[3];

assert(sizeof(str1) == sizeof(str2));memcpy(str2, str1, sizeof(str1));

}

Page 16: CS201 Lecture 2 GDB, The C Library - Raoul Rivas · CS201 –Lecture 2 GDB, The C Library. Announcements CS201: Computer Science Programming Raoul Rivas (Based on slides from Bryant

GDB Overview

▪ Inspect program execution and state at any point in time.▪ Set breakpoints▪ Read variable, dump stack

▪ Useful to find a wide range of bugs

▪ Must compile the program to include “Symbols”▪ Use the –g or –ggdb flag▪ If possible use –O0 to disable optimizations

CS201: Computer Science Programming Raoul Rivas (Based on slides from Bryant and O’Hallaron)

16

Page 17: CS201 Lecture 2 GDB, The C Library - Raoul Rivas · CS201 –Lecture 2 GDB, The C Library. Announcements CS201: Computer Science Programming Raoul Rivas (Based on slides from Bryant

GDB Interactive Shell▪ GDB is based on an interactive shell▪ The shell prompt symbol is “(gdb)”

▪ History of past command

▪ TAB for autocompletion

▪ Integrated help▪ Call the help command followed by the name of the command you

need info about

CS201: Computer Science Programming Raoul Rivas (Based on slides from Bryant and O’Hallaron)

17

(gdb) help mycommand

Page 18: CS201 Lecture 2 GDB, The C Library - Raoul Rivas · CS201 –Lecture 2 GDB, The C Library. Announcements CS201: Computer Science Programming Raoul Rivas (Based on slides from Bryant

Using GDB▪ You can specify the program to load in the command line

▪ Or you can load the program using the “file” command in the gdb prompt “(gdb)”

▪ To run your program use the “run” command

▪ If your code crashes you will see additional crash information

CS201: Computer Science Programming Raoul Rivas (Based on slides from Bryant and O’Hallaron)

18

gdb myprogram

(gdb) file myprogram

(gdb) run

Page 19: CS201 Lecture 2 GDB, The C Library - Raoul Rivas · CS201 –Lecture 2 GDB, The C Library. Announcements CS201: Computer Science Programming Raoul Rivas (Based on slides from Bryant

How to debug a program▪ Debugging is a lot like fishing

▪ Stop execution at possible suspecting points or functions

▪ Look for the values of each variable until you can determine the problem

▪ Step through specific functions or loops to find any problems in your code

CS201: Computer Science Programming Raoul Rivas (Based on slides from Bryant and O’Hallaron)

19

Page 20: CS201 Lecture 2 GDB, The C Library - Raoul Rivas · CS201 –Lecture 2 GDB, The C Library. Announcements CS201: Computer Science Programming Raoul Rivas (Based on slides from Bryant

Breakpoints▪ Breakpoints stop execution of a program at a specific point▪ Use the “break” command

▪ Stop at a specific line in a source file

▪ Stop at line 67 of file5.c

▪ Stop at a specific function

▪ Stop at function my_func()

▪ After setting a breakpoint start your program using the “run” command

CS201: Computer Science Programming Raoul Rivas (Based on slides from Bryant and O’Hallaron)

20

(gdb) break file5.c:67

(gdb) break my_func

Page 21: CS201 Lecture 2 GDB, The C Library - Raoul Rivas · CS201 –Lecture 2 GDB, The C Library. Announcements CS201: Computer Science Programming Raoul Rivas (Based on slides from Bryant

Navigating the Code▪ GDB stops the execution of your program at a breakpoint▪ GDB command prompt will appear

▪ To step through the code use the “step” command

▪ Executes one instruction and stops. If the line is a function it will step into your function

▪ Visual Studio calls this “Step Into”

▪ To execute an entire function as if it was a single instruction use the command “next”

▪ Visual Studio calls this “Step Over”

▪ For assembly use stepi and nexti!

CS201: Computer Science Programming Raoul Rivas (Based on slides from Bryant and O’Hallaron)

21

(gdb) step

(gdb) next

Page 22: CS201 Lecture 2 GDB, The C Library - Raoul Rivas · CS201 –Lecture 2 GDB, The C Library. Announcements CS201: Computer Science Programming Raoul Rivas (Based on slides from Bryant

Next vs. Step

CS201: Computer Science Programming Raoul Rivas (Based on slides from Bryant and O’Hallaron)

22

int main(){

int val=5, result;

res=factorial(val);printf(“%d\n”, result);return 0;

}

int factorial(int n){

int i, retv=1;

for(i=1; i<= n; i++) {

retv*= 1; }

return retv;}

Step

Next

Page 23: CS201 Lecture 2 GDB, The C Library - Raoul Rivas · CS201 –Lecture 2 GDB, The C Library. Announcements CS201: Computer Science Programming Raoul Rivas (Based on slides from Bryant

Printing a variable▪ To print a variable use the command “print”

▪ GDB can print variables members of structures

▪ Dereference pointer

▪ Support self-referential structures

CS201: Computer Science Programming Raoul Rivas (Based on slides from Bryant and O’Hallaron)

23

(gdb) print myvar

(gdb) print mystruct.myvar

(gdb) print *myptr

(gdb) print mylist->next->next

Page 24: CS201 Lecture 2 GDB, The C Library - Raoul Rivas · CS201 –Lecture 2 GDB, The C Library. Announcements CS201: Computer Science Programming Raoul Rivas (Based on slides from Bryant

Watchpoint▪ A watchpoint is similar to a breakpoint, except that it stops the execution when the value of a variable change▪ No associated position in the code

▪ Variable is the stopping trigger

▪ Use the “watch” command to set a watchpoint on a variable

▪ Pause execution when the variable myvar changes

CS201: Computer Science Programming Raoul Rivas (Based on slides from Bryant and O’Hallaron)

24

(gdb) watch myvar

int main(){

int val=5, result;result= val + 1;val= 25;

}

When GDB stops if we set a Watchpoint on variable val? Val=25

Page 25: CS201 Lecture 2 GDB, The C Library - Raoul Rivas · CS201 –Lecture 2 GDB, The C Library. Announcements CS201: Computer Science Programming Raoul Rivas (Based on slides from Bryant

Conditional Breakpoints▪ Stop in a breakpoint only if certain condition is met▪ Good to debug array or loop boundaries

▪ Cases where code fails with certain values

▪ Use the following syntax:

▪ Example

▪ Stop at line 6 of file1 if i > ARRAYSIZE

CS201: Computer Science Programming Raoul Rivas (Based on slides from Bryant and O’Hallaron)

25

(gdb) break breakpoint if condition

(gdb) break file1:6 if i > ARRAYSIZE

Page 26: CS201 Lecture 2 GDB, The C Library - Raoul Rivas · CS201 –Lecture 2 GDB, The C Library. Announcements CS201: Computer Science Programming Raoul Rivas (Based on slides from Bryant

Debugging in Windows▪ GDB is the most popular debugger in Linux

▪ In Windows you can use WinDBG or the more user friendly Visual Studio Debugger▪ Breakpoints, Watchpoints, Conditional Breakpoints

▪ Windows keeps Symbols in separate Program Database Files (PDB)

▪ PDB files must be loaded into WinDbg to produce any meaningful information

▪ A PDB file is specific to a particular build!

CS201: Computer Science Programming Raoul Rivas (Based on slides from Bryant and O’Hallaron)

26

Page 27: CS201 Lecture 2 GDB, The C Library - Raoul Rivas · CS201 –Lecture 2 GDB, The C Library. Announcements CS201: Computer Science Programming Raoul Rivas (Based on slides from Bryant

Summary▪ Dynamically allocated multidimensional arrays are usually declared as an array of pointers to one dimension arrays

▪ GDB is the GNU Debugger.▪ Inspect variables, breakpoints, watchpoints, step by step execution

▪ The C library is a standard ANSI library▪ String Manipulations, File Access, Console I/O, Memory Allocation

CS201: Computer Science Programming Raoul Rivas (Based on slides from Bryant and O’Hallaron)

27