偵錯的技巧 南台科大 黎靖
偵錯的 鄰近原理 v 語句的鄰近 v 執行順序 的鄰近 v 空間的鄰近
語句的鄰近 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. #include <stdio. h> #include <stdlib. h> int main() { int i ; for (i = 0; i < 5; i++) printf("n. Hellow World") printf("n. Goodbye Worldn"); system("PAUSE"); return 1; } v v 錯誤訊息指出第 8行 expected `; ‘ before “printf” 。 因此實際錯誤是第 7行末尾 忘了加 ‘; ’
執行順序 的鄰近 int main() 2. { … 40. while(k < 7) 41. { 42. dotest(); …. 240. proc 1(); 241. } 242. } 1. v proc 1()執行完後,若 k<7則 執行 dotest() ,所以proc 1() 及 dotest() 為 執行順序 的 鄰近,因此當錯誤訊息指 出第 42行有錯時,實際錯 誤可能在 240行。
空間的鄰近 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. #include <stdio. h> #include <stdlib. h> int main() { int i, j, k ; i = 0; for(j = 0; j < 19; j++) { for(k = 0; k < j; k++) { putchar(' '); } printf("*n"); } printf("%dn", i); system("PAUSE"); return 1; } v 第 6行及第 15行空間的鄰 近,因此找錯誤時,第 6行 及第 15行應同時檢查。
偵錯的方法 v 縮小範圍法 v 程式結構追蹤法 v 資料流程追蹤 法 v 快照 (Snapshots)
縮小範圍法 v 當編譯器無法正確指出錯誤所在時,可以 利用去除部份程式碼的方式,找出錯誤的 可能範圍。
找出下列程式的錯誤 1. 2. 3. #include <stdio. h> #include <stdlib. h> #include <string. h> 24. 25. 26. 27. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. #define HEAD 4 #define LENGTH 24 #define P 0 5 #define WIDTH 95 #define ERROR -1 #define MAXLINES 10 char *lines[MAXLINES]; FILE *fd, *printer; int main() { char buff[80]; int max, j, offset, len, count; if ((fd = fopen("address", "r")) == 0) { / * give the user some lelp. . . * / printf("address file does not exist. n"); exit(ERROR); } printer = fopen("LPT 1", "w"); 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. for (count = 0, max = 0; count < MAXLINES; count++) { if (fgets(buff, 80, fd) == 0) break; else { len = strlen(buff); lines[count] = (char *)malloc(80); if (len > max) max = len; strcpy(lines[count], buff); } } offset = ((WIDTH - max)/2)+P 0; for (j = 0; j < offset; j++) buff[j] = ' '; buff[j] = '