160 likes | 180 Views
Learn key debugging techniques like manual verification, tracing with different inputs, detecting off-by-one loop errors, checking loop boundaries, fixing conditional errors, and spotting common loop mistakes. Discover how to locate runtime errors using print statements and debugger tools efficiently.
E N D
Program Errors and Debugging Week 10, Thursday Lab
Debugging Programs • Manually verify your program first • Trace the program by hand • With the different inputs it can take • Use print statements • Using the debugger
Off-by-One Loop Errors • Executing the loop by one more or one less time than it is supposed to • If a sentinel-controlled while loop performs extra repetition, it may erroneously process the sentinel value along with the regular data • (e.g. when reading from a file, WHILEeof). • Checking Loop Boundaries by hand: • Evaluate initial expression and the final expression • Substitute these values everywhere the counter variable appears in the loop body • Verify that you get the expected results at the boundaries
Conditional Errors • Probably the most common error is not using or misusing BEGIN and END. • IF <condition> THEN <statement>ELSE <statement> • CASE <selector> OF: <label-list> : <statement> …ELSE <statement-list>END SINGLE STATEMENTS orCOMPOUND STATEMENT <statement> ;<statement>;...<statement>;
Conditional Errors • You are not testing all the conditions you should be testing • Some conditions aren’t caught and “fall through” • Your condition expressions are not correct (you have a logical error…)
Common Loop Errors:Off-by-One Loop • Example: Sum of squares of numbers Sum := 0; FOR J := K TO N-K DO Sum := Sum + Sqr(J); • First value of J = K • Last value of J = N-K • The assignment at J = K is Sum := Sqr(K) • The assignment at J = N-K is Sum := Prev.Sum + Sqr(N-K) • At some small value of N=3 & K=1, trace the loop execution (by hand or with the debugger)
Common Loop Errors: Too Narrowly Defined Condition • Example: WHILE Balance <> 0.0 DO Update (Balance) BETTER: WHILE Balance > 0.0 DO Update (Balance) • Don't use inequality for testing conditions, especially with numbers. • If Balance goes from negative to positive value without having 0.0 as a value we will get an infinite loop. • When using sentinel, make sure that its value can't be confused with normal data item.
Common Loop Errors: Not Updating the Loop Control Variable • If a loop body have more than one statement, don't forget the BEGIN-END brackets. • Only REPEAT-UNTIL loop doesn't need a begin-end brackets. • Example: (infinite loop)WHILE Power <= 10000 DO writeln('Next power of N is ', Power :6); Power := Power * N; • Don't use the REPEAT-UNTIL loop if you aren't sure that the loop will have to be executed at least once. • In a FOR loop if the starting value is greater (for TO) or smaller than (for DOWNTO) the statement will not execute.
Common Loop Errors • Counter variable in a FOR loop should not be changed inside the loop body. • Example: what happens if you do(RECTBAD1.PAS) • It is illegal to use the same counter variable in two nested FOR loops. • Example: what happens if you do(RECTBAD2.PAS) • Unfortunately the Turbo Pascal environment doesn’t check for you
Locating Runtime Errors with ‘PRINT’ Statements • Examine program output to determine which part of the program is generating incorrect results • Insert extra debugging statements (‘PRINT’ statements)to display intermediate results at different points in your program • HOW? Insert extra writeln statements to trace the values of certain critical variables during program execution • In order to not add any problems be careful that you insert extra writeln statement check if you need to add BEGIN-END brackets • Focus on statements in that section to determine which are at fault • When you locate the error, enclose the diagnostic statement with comment braces
The Debugger • Helps you execute your program in a controlled fashion to help you find errors: • Stepping through program • Seeing output • Watching the value of variables • Running from breakpoint to breakpoint • Prints diagnostics when run-time error occurs • Indicates the statement that caused the error and displays the values of the selected variables
Stepped Program Execution • Run Menu commands: • F7: Trace into2 • F8: Step over • F4: Go to cursor • Run: to through run to the end • Usually used in conjunction with output or variable watching • NOTE: F7 and F8 are hard to distinguish sometimes
Watching Output During Execution • Output command (Debug Menu): • Opens output window at same time as program window • Allows seeing program running with tracing commands (F4, F7, F8) • Shows output as control moves through program
Watching Variables & Expressions • Watch: • Can select several values whose values will automatically be displayed after each statement execution. • Can type in an expression to be evaluated based on variables in program
Executing with Breakpoints • Causes the program to stop at selected statements • You can set several breakpoints at a program. The program will execute directly from one breakpoint to the next • Good for large programs (when don’t want to use F7, F8 or even F4). • Signaled in Red/Brown – then in blue-green when you get there. • Run from breakpoint to breakpoint
Executing with Breakpoints [cont] • Can add a conditional breakpoint • If you do, make sure you remove unconditional breakpoints at the same place. • Breakpoints : Delete