Debugging (Part 1) The material for this lecture is drawn, in part, from The Practice of Programming (Kernighan & Pike) Chapter 5

Similar documents
Debugging! The material for this lecture is drawn, in part, from! The Practice of Programming (Kernighan & Pike) Chapter 5!

Debugging! The material for this lecture is drawn, in part, from! The Practice of Programming (Kernighan & Pike) Chapter 5!

Princeton University Computer Science 217: Introduction to Programming Systems. Building Multi-File Programs with the make Tool

Performance improvement techniques & tools. Everything should be built top-down, except the first time. -

Princeton University Computer Science 217: Introduction to Programming Systems Program and Programming Style

Princeton University COS 217: Introduction to Programming Systems GDB Tutorial and Reference

Testing! The material for this lecture is drawn, in part, from! The Practice of Programming (Kernighan & Pike) Chapter 6!

We first learn one useful option of gcc. Copy the following C source file to your

Program Verification! Goals of this Lecture! Words from the Wise! Testing!

Problem Set 1: Unix Commands 1

EL2310 Scientific Programming

Testing! The material for this lecture is drawn, in part, from! The Practice of Programming (Kernighan & Pike) Chapter 6!

COMP s1 Lecture 1

Beyond this course. Machine code. Readings: CP:AMA 2.1, 15.4

CS 261 Fall C Introduction. Variables, Memory Model, Pointers, and Debugging. Mike Lam, Professor

Princeton University COS 217: Introduction to Programming Systems Emacs Reference and Tutorial

Software Development With Emacs: The Edit-Compile-Debug Cycle

Debugging (Part 2) 1

Programming in the Large Steps

Chapter 2. Basics of Program Writing

Class Information ANNOUCEMENTS

Outline. Computer programming. Debugging. What is it. Debugging. Hints. Debugging

Lab 1 Introduction to UNIX and C

C Introduction. Comparison w/ Java, Memory Model, and Pointers

Laboratory 1 Semester 1 11/12

CSE 303 Lecture 8. Intro to C programming

Running a C program Compilation Python and C Variables and types Data and addresses Functions Performance. John Edgar 2

Introduction to C. Robert Escriva. Cornell CS 4411, August 30, Geared toward programmers

Princeton University COS 333: Advanced Programming Techniques A Subset of C90

EE 209: Programming Structures for Electrical Engineering

Goals of this Lecture

Computer Programming: Skills & Concepts (CP) Files in C

Lecture 7: file I/O, more Unix

ECE/ME/EMA/CS 759 High Performance Computing for Engineering Applications

Exercise 1: Basic Tools

Introduction to C. Ayush Dubey. Cornell CS 4411, August 31, Geared toward programmers

Getting started with UNIX/Linux for G51PRG and G51CSA

CSE 374 Programming Concepts & Tools

12. Debugging. Overview. COMP1917: Computing 1. Developing Programs. The Programming Cycle. Programming cycle. Do-it-yourself debugging

Computer Programming: Skills & Concepts (CP1) Files in C. 18th November, 2010

2 Compiling a C program

For Your Amusement. Beware of bugs in the above code; I have only proved it correct, not tried it. Donald Knuth. Program Verification

Lecture 8: Structs & File I/O

Slide Set 8. for ENCM 339 Fall 2017 Section 01. Steve Norman, PhD, PEng

CS 220: Introduction to Parallel Computing. Beginning C. Lecture 2

CSE 374 Programming Concepts & Tools. Brandon Myers Winter 2015 Lecture 11 gdb and Debugging (Thanks to Hal Perkins)

Introduction to the Command line. Introduction to the command line. Introduction to the Command line. GNU/Linux at South Wales

C-Programming. CSC209: Software Tools and Systems Programming. Paul Vrbik. University of Toronto Mississauga

27-Sep CSCI 2132 Software Development Lab 4: Exploring bash and C Compilation. Faculty of Computer Science, Dalhousie University

The Design of C: A Rational Reconstruction: Part 2

EL2310 Scientific Programming

RVDS 3.0 Introductory Tutorial

Introduction to Linux

Laboratory 2: Programming Basics and Variables. Lecture notes: 1. A quick review of hello_comment.c 2. Some useful information

COS 217: Introduction to Programming Systems

CS 314 Principles of Programming Languages. Lecture 9

Performance Improvement. The material for this lecture is drawn, in part, from The Practice of Programming (Kernighan & Pike) Chapter 7

Introduction to C. Sean Ogden. Cornell CS 4411, August 30, Geared toward programmers

Your code must have been compiled with the -g compiler option. Example:

CS354 gdb Tutorial Written by Chris Feilbach

Module 3: Working with C/C++

EE 209: Programming Structures for Electrical Engineering. (Many Slides Borrowed from Princeton COS 217)

PROGRAMMAZIONE I A.A. 2017/2018

COS 217: Introduction to Programming Systems!

CSE 303: Concepts and Tools for Software Development

File Access. FILE * fopen(const char *name, const char * mode);

Section 1: Tools. Kaifei Chen, Luca Zuccarini. January 23, Make Motivation How... 2

Fall, $ cat welcome.c #include <stdio.h>

Computer Programming: Skills & Concepts (CP) Variables and ints

CS 220: Introduction to Parallel Computing. Input/Output II. Lecture 8

RVDS 4.0 Introductory Tutorial

CSE 374 Programming Concepts & Tools

Introduction: The Unix shell and C programming

Introduction to C. Zhiyuan Teo. Cornell CS 4411, August 26, Geared toward programmers

Decentralized Version Control Systems

EL2310 Scientific Programming

PRINCIPLES OF OPERATING SYSTEMS

Welcome! COMP s1. Programming Fundamentals

Welcome! COMP s1 Lecture 7. COMP s1. Before we begin. Strings. Programming Fundamentals. Overview. Andrew Bennett

Lecture 9: Potpourri: Call by reference vs call by value Enum / struct / union Advanced Unix

CS240: Programming in C

Princeton University Computer Science 217: Introduction to Programming Systems. Data Structures

Princeton University Computer Science 217: Introduction to Programming Systems. Goals of this Lecture. A Taste of C. Agenda.

Princeton University Computer Science 217: Introduction to Programming Systems. A Taste of C

Programming in C and C++

The CS-220 Development Environment

CS102: Standard I/O. %<flag(s)><width><precision><size>conversion-code

Recitation: Cache Lab & C

MPATE-GE 2618: C Programming for Music Technology. Unit 4.1

Berner Fachhochschule Haute cole spcialise bernoise Berne University of Applied Sciences 2

CS Basics 15) Compiling a C prog.

Programming. Dr Ben Dudson University of York

Program Building. Goals for this Lecture. Help you learn about: Program structure. Detecting and reporting failure

Review of Scientific Programming in C and Fortran. Michael McLennan Software Architect HUBzero Platform for Scientific Collaboration

Programming in C week 1 meeting Tiina Niklander

Lecture 07 Debugging Programs with GDB

Computer Labs: Debugging

1. Allowed you to see the value of one or more variables, or 2. Indicated where you were in the execution of a program

Topic 6: A Quick Intro To C

Know your tools. For the GNU/Linux game developer GDB is the BFG. emacs. "a bad workman blames his tools", Cambridge Idioms Dictionary

Transcription:

Debugging (Part 1) The material for this lecture is drawn, in part, from The Practice of Programming (Kernighan & Pike) Chapter 5 1

For Your Amusement When debugging, novices insert corrective code; experts remove defective code. -- Richard Pattis If debugging is the act of removing errors from code, what's programming? -- Tom Gilb Debugging is twice as hard as writing the code in the first place. Therefore, if you write the code as cleverly as possible, you are, by definition, not smart enough to debug it. -- Brian Kernighan 2

For Your Amusement The first computer bug (found in the Harvard Mark II computer) 3

Programming in the Large Steps Design & Implement Program & programming style (done) Common data structures and algorithms Modularity Building techniques & tools (done) Test Testing techniques (done) Debug Debugging techniques & tools <-- we are here Maintain Performance improvement techniques & tools 4

Goals of this Lecture Help you learn about: Strategies and tools for debugging your code Why? Debugging large programs can be difficult A power programmer knows a wide variety of debugging strategies A power programmer knows about tools that facilitate debugging Debuggers Version control systems 5

Testing vs. Debugging Testing What should I do to try to break my program? Debugging What should I do to try to fix my program? 6

Agenda (1) Understand error messages (2) Think before writing (3) Look for familiar bugs (4) Divide and conquer (5) Add more internal tests (6) Display output (7) Use a debugger (8) Focus on recent changes (Next week: specific to dynamic memory management) 7

Understand Error Messages Debugging at build-time is easier than debugging at runtime, if and only if you Understand the error messages! #include <stdioo.h> /* Print "hello, world" to stdout and return 0. int main(void) { printf("hello, world\n"); return 0; } What are the errors? (No fair looking at the next slide!) 8

Understand Error Messages #include <stdioo.h> /* Print "hello, world" to stdout and return 0. int main(void) { printf("hello, world\n"); return 0; } Which tool (preprocessor, compiler, or linker) reports the error(s)? $ gcc217 hello.c -o hello hello.c:1:20: error: stdioo.h: No such file or directory hello.c:2:1: error: unterminated comment hello.c:7: warning: ISO C forbids an empty translation unit 9

Understand Error Messages #include <stdio.h> /* Print "hello, world" to stdout and return 0. */ int main(void) { printf("hello, world\n") return 0; } What are the errors? (No fair looking at the next slide!) 10

Understand Error Messages #include <stdio.h> /* Print "hello, world" to stdout and return 0. */ int main(void) { printf("hello, world\n") return 0; } Which tool (preprocessor, compiler, or linker) reports the error? $ gcc217 hello.c -o hello hello.c: In function 'main': hello.c:6: error: expected ';' before 'return' 11

Understand Error Messages #include <stdio.h> /* Print "hello, world" to stdout and return 0. */ int main(void) { prinf("hello, world\n"); return 0; } What are the errors? (No fair looking at the next slide!) 12

Understand Error Messages #include <stdio.h> /* Print "hello, world" to stdout and return 0. */ int main(void) { prinf("hello, world\n") return 0; } Which tool (preprocessor, compiler, or linker) reports the error? $ gcc217 hello.c -o hello hello.c: In function 'main': hello.c:5: warning: implicit declaration of function 'prinf' /tmp/cclspmtr.o: In function `main': hello.c:(.text+0x1a): undefined reference to `prinf' collect2: ld returned 1 exit status 13

Understand Error Messages #include <stdio.h> #include <stdlib.h> enum StateType { STATE_REGULAR, STATE_INWORD } int main(void) { printf("just hanging around\n"); return EXIT_SUCCESS; } What are the errors? (No fair looking at the next slide!) 14

Understand Error Messages #include <stdio.h> #include <stdlib.h> enum StateType { STATE_REGULAR, STATE_INWORD } int main(void) { printf("just hanging around\n"); return EXIT_SUCCESS; } What does this error message even mean? $ gcc217 hello.c -o hello hello.c:7: error: two or more data types in declaration specifiers hello.c:7: warning: return type of 'main' is not 'int' 15

Understand Error Messages Caveats concerning error messages Line # in error message may be approximate Error message may seem nonsensical Compiler may not report the real error Tips for eliminating error messages Clarity facilitates debugging Make sure code is indented properly Look for missing semicolons At ends of structure type definitions At ends of function declarations Work incrementally Start at first error message Fix, rebuild, repeat 16

Agenda (1) Understand error messages (2) Think before writing (3) Look for familiar bugs (4) Divide and conquer (5) Add more internal tests (6) Display output (7) Use a debugger (8) Focus on recent changes 17

Think Before Writing Inappropriate changes could make matters worse, so Think before changing your code Explain the code to: Yourself Someone else A Teddy bear? Do experiments But make sure they re disciplined 18

Agenda (1) Understand error messages (2) Think before writing (3) Look for common bugs (4) Divide and conquer (5) Add more internal tests (6) Display output (7) Use a debugger (8) Focus on recent changes 19

Look for Common Bugs Some of our favorites: switch (i) { case 0: break; case 1: case 2: } int i; scanf("%d", i); char c; c = getchar(); while (c = getchar()!= EOF) if (i = 5) if (5 < i < 10) if (i & j) What are the errors? 20

Look for Common Bugs Some of our favorites: for (i = 0; i < 10; i++) { for (j = 0; j < 10; i++) {... } } for (i = 0; i < 10; i++) { for (j = 10; j >= 0; j++) {... } } What are the errors? 21

Look for Common Bugs Some of our favorites: { int i; i = 5; if (something) { int i; i = 6; } printf("%d\n", i); } What value is written if this statement is present? Absent? 22

Agenda (1) Understand error messages (2) Think before writing (3) Look for common bugs (4) Divide and conquer (5) Add more internal tests (6) Display output (7) Use a debugger (8) Focus on recent changes 23

Divide and Conquer Divide and conquer: To debug a program Incrementally find smallest input file that illustrates the bug Approach 1: Remove input Start with file Incrementally remove lines until bug disappears Examine most-recently-removed lines Approach 2: Add input Start with small subset of file Incrementally add lines until bug appears Examine most-recently-added lines 24

Divide and Conquer Divide and conquer: To debug a module Incrementally find smallest client code subset that illustrates the bug Approach 1: Remove code Start with test client Incrementally remove lines of code until bug disappears Examine most-recently-removed lines Approach 2: Add code Start with minimal client Incrementally add lines of test client until bug appears Examine most-recently-added lines 25

Agenda (1) Understand error messages (2) Think before writing (3) Look for common bugs (4) Divide and conquer (5) Add more internal tests (6) Display output (7) Use a debugger (8) Focus on recent changes 26

Add More Internal Tests (5) Add more internal tests Internal tests help find bugs (see Testing lecture) Internal test also can help eliminate bugs Validating parameters & checking invariants can eliminate some functions from the bug hunt 27

Agenda (1) Understand error messages (2) Think before writing (3) Look for common bugs (4) Divide and conquer (5) Add more internal tests (6) Display output (7) Use a debugger (8) Focus on recent changes 28

Display Output Write values of important variables at critical spots Poor: Maybe better: Better: printf("%d", keyvariable); printf("%d\n", keyvariable); printf("%d", keyvariable); fflush(stdout); stdout is buffered; program may crash before output appears Printing '\n' flushes the stdout buffer, but not if stdout is redirected to a file Call fflush() to flush stdout buffer explicitly 29

Display Output Maybe even better: fprintf(stderr, "%d", keyvariable); Maybe better still: FILE *fp = fopen("logfile", "w"); fprintf(fp, "%d", keyvariable); fflush(fp); Write debugging output to stderr; debugging output can be separated from normal output via redirection Bonus: stderr is unbuffered Write to a log file 30

Agenda (1) Understand error messages (2) Think before writing (3) Look for common bugs (4) Divide and conquer (5) Add more internal tests (6) Display output (7) Use a debugger (8) Focus on recent changes 31

Use a Debugger Use a debugger Alternative to displaying output 32

The GDB Debugger GNU Debugger Part of the GNU development environment Integrated with Emacs editor Allows user to: Run program Set breakpoints Step through code one line at a time Examine values of variables during run Etc. For details see precept tutorial, precept reference sheet, Appendix 1 33

Agenda (1) Understand error messages (2) Think before writing (3) Look for common bugs (4) Divide and conquer (5) Add more internal tests (6) Display output (7) Use a debugger (8) Focus on recent changes 34

Focus on Recent Changes Focus on recent changes Corollary: Debug now, not later Difficult: (1) Compose entire program (2) Test entire program (3) Debug entire program Easier: (1) Compose a little (2) Test a little (3) Debug a little (4) Compose a little (5) Test a little (6) Debug a little 35

Focus on Recent Changes Focus on recent change (cont.) Corollary: Maintain old versions Difficult: (1) Change code (2) Note new bug (3) Try to remember what changed since last version Easier: (1) Backup current version (2) Change code (3) Note new bug (4) Compare code with last version to determine what changed 36

Maintaining Old Versions To maintain old versions Approach 1: Manually copy project directory $ mkdir myproject $ cd myproject Create project files here. $ cd.. $ cp r myproject myprojectdatetime $ cd myproject Continue creating project files here. 37

Maintaining Old Versions Approach 2: Use the Revision Control System (RCS) A simple version control system Provided with many Linux distributions Available on nobel Allows programmer to: Check-in source code files from working copy to repository RCS saves old versions Check-out source code files from repository to working copy Can retrieve old versions Appropriate for one-developer projects Not required for COS 217, but good to know! See Appendix 2 for details 38

Maintaining Old Versions Approach 3: Use CVS, Subversion, Git, High-powered version control systems Appropriate for multi-developer projects Allow repositories to be shared Beyond our scope, but good to know! 39

Summary General debugging strategies and tools: (1) Understand error messages (2) Think before writing (3) Look for common bugs (4) Divide and conquer (5) Add more internal tests (6) Display output (7) Use a debugger Use GDB!!! (8) Focus on recent changes Consider using RCS, etc. Debugging Part 2 (next week): specific to dynamic memory management 40

Appendix 1: Using GDB An example program File testintmath.c: #include <stdio.h> int gcd(int i, int j) { int temp; while (j!= 0) { temp = i % j; i = j; j = temp; } return i; } int lcm(int i, int j) { return (i / gcd(i, j)) * j; } Euclid s algorithm; Don t be concerned with details int main(void) { int igcd; int ilcm; igcd = gcd(8, 12); ilcm = lcm(8, 12); printf("%d %d\n", igcd, ilcm); return 0; } The program is correct But let s pretend it has a runtime error in gcd() 41

Appendix 1: Using GDB General GDB strategy: Execute the program to the point of interest Use breakpoints and stepping to do that Examine the values of variables at that point 42

Appendix 1: Using GDB Typical steps for using GDB: (a) Build with g gcc217 g testintmath.c o testintmath Adds extra information to executable file that GDB uses (b) Run Emacs, with no arguments emacs (c) Run GDB on executable file from within Emacs <Esc key> x gdb <Enter key> testintmath <Enter key> (d) Set breakpoints, as desired break main GDB sets a breakpoint at the first executable line of main() break gcd GDB sets a breakpoint at the first executable line of gcd() 43

Appendix 1: Using GDB Typical steps for using GDB (cont.): (e) Run the program run GDB stops at the breakpoint in main() Emacs opens window showing source code Emacs highlights line that is to be executed next continue GDB stops at the breakpoint in gcd() Emacs highlights line that is to be executed next (f) Step through the program, as desired step (repeatedly) GDB executes the next line (repeatedly) Note: When next line is a call of one of your functions: step command steps into the function next command steps over the function, that is, executes the next line without stepping into the function 44

Appendix 1: Using GDB Typical steps for using GDB (cont.): (g) Examine variables, as desired print i print j print temp GDB prints the value of each variable (h) Examine the function call stack, if desired where GBB prints the function call stack Useful for diagnosing crash in large program (i) Exit gdb quit (j) Exit Emacs <Ctrl-x key> <Ctrl-c key> 45

Appendix 1: Using GDB GDB can do much more: Handle command-line arguments run arg1 arg2 Handle redirection of stdin, stdout, stderr run < somefile > someotherfile Print values of expressions Break conditionally Etc. 46

Appendix 2: Using RCS Typical steps for using RCS: (a) Create project directory, as usual mkdir helloproj cd helloproj (b) Create RCS directory in project directory mkdir RCS RCS will store its repository in that directory (c) Create source code files in project directory emacs hello.c (d) Check in ci hello.c Adds file to RCS repository Deletes local copy (don t panic!) Can provide description of file (1 st time) Can provide log message, typically describing changes 47

Appendix 2: Using RCS Typical steps for using RCS (cont.): (e) Check out most recent version for reading co hello.c Copies file from repository to project directory File in project directory has read-only permissions (f) Check out most recent version for reading/writing co l hello.c Copies file from repository to project directory File in project directory has read/write permissions (g) List versions in repository rlog hello.c Shows versions of file, by number (1.1, 1.2, etc.), with descriptions (h) Check out a specified version co l rversionnumber hello.c 48

Appendix 2: Using RCS RCS can do much more: Merge versions of files Maintain distinct development branches Place descriptions in code as comments Assign symbolic names to versions Etc. Recommendation: Use RCS ci and co can become automatic! 49