Está en la página 1de 11

K thut Debug trong C

i vi lp trnh vin, vic ra tng gii quyt vn l kh khn, nhng vic ci t c tng cng khng n gin. i khi ch v mt du ; hay sai kiu d liu cng c th bin bn ci t tr nn v ngha v khng th hin ng tng ra. Nhng lm sao pht hin ra mt con su (li-bug) trong mt rng lnh? Cu tr li rt n gin nhng kh thc hin : chng ta phi kin nhn vch l tm su ! l l do ti sao chng ta phi nm k thut debug. Bi vit ny nhm hng dn cc bn s dng k thut debug tm li thng qua vic phn tch cc v d, ng thi cng a ra mt s bi tp t d n kh cc bn c th tng bc nm vng k thut debug. Hi vng bi vit ny s gip ch c cho cc bn. Mi thc mc hoc kin ng gp xin gi v a ch mail : nvhoang@fit.hcmuns.edu.vn.

1 Cc loi li trong chng trnh:


Li sai c php: y l nhng li sai xy ra khi bin dch chng trnh (sau khi nhn F9). Khi gp li ny, chng ta nn nhn Ctrl-F1 gi gip hoc xem li ti liu tham kho. y khng cp chi tit n vn ny. 1.1 1.2 Li sai logic:

1.2.1 Khi nim : Cc li sai logic l nhng li khi bin dch, trnh bin dch khng bo li. Nhng li ny nm tim n trong chng trnh v lm cho chng trnh ca chng ta a ra nhng kt qu khng nh mong mun. Cc li sai logic thng xut pht t 2 nguyn nhn : - Do nhm (nhm ch khng sai) c php dn n sai logic. - Do tng gii quyt bi ton sai ngay t u. Loi li ny bnh thng rt kh nhn ra. D nhin, nu tinh i khi chng ta vn c th pht hin ra nhng li ny, nhng vic pht hin ny i hi chng ta phi nm rt vng c php C, cng nh logic ca chng trnh cng thm mt cht kinh nghim. Tuy nhin, trong a s cc trng hp chng ta phi thc hin cng on debug tm ra cc li sai logic ny. 1.2.2 Mt s v d v li sai logic : Sau y l mt s v d v li sai logic:

VD1 : Xt hm hon v 2 s nguyn void HoanVi(int a, int b) { int c = a; a = b; b = c; } Thot nhn, chng ta hm ny khng c vn g c ! Nhng nu tinh mt cht chng ta s thy cch truyn tham s ca hm l sai, y l cch truyn tham tr ch khng phi truyn tham bin, do gi tr ca a, b s khng thay i sau khi hm thc hin xong. Chng ta phi sa li nh sau : void HoanVi(int &a, int &b) { int c = a; a = b; b = c; } VD2 : Xt hm sp xp mng mt chiu cc s nguyn theo th t tng dn /* Hm sp xp mng Tham s vo : n s lng s nguyn a - mng mt chiu cc s nguyn, t a[0]...a[n-1] */ void SapXepMangTangDan(int n, int a[]) { int i, j; for (int i = 0; i < n; i++); for (int j = 0; j < n; j++) if (a[i] > a[j]) HoanVi(a[i], a[j]); } Nu nh chng ta cha tng g on m hm sp xp th c l chng ta kh pht hin ra ch sai. Nhng cho d nh vy chng ta vn c th pht hin ra dng lnh for (int i = 0; i < n; i++); l c vn , ti sao li c du ; cui dng lp for ? Nhng cho d bn c b du ; i th hm ny vn sai. Trong trng hp ny chng ta bt buc phi debug loi i nhng li logic. Cc bn c th tham kho phc lc xem mt s li sai logic thng gp.

2 C ch thc thi chng trnh :


c th thc hin cng vic debug, trc ht chng ta s tm hiu c ch thc thi ca mt chng trnh C. ( cho n gin, ti xin php ch trnh by vic thc thi mc ngn ng C, ch khng trnh by mc ngn ng assembly). C ch chnh thc thi trong chng trnh C l thc thi tng dng lnh t trn xung di, ch khi gp nhng lnh r nhnh (if), nhng lnh lp (for, while), nhng li gi hm, hay lnh nhy (goto) th C s chuyn n thc thi dng lnh c ch nh, ri li tun theo c ch t trn xung di. C lun lun bt u thc thi t hm main(). 2.1 1 2 3 4 5 6 7 8 C ch chnh ca vic thc thi :
Thc thi t trn xung di, bt u t hm main()

#include <stdio.h> #include <conio.h> void main() { clrscr(); printf(y l chng trnh v d\n); getch(); }

Nh ni trn, C s bt u thc thi chng trnh t hm void main() : dng lnh 4. Sau C s tip tc thc thi t trn xung di. Tc l tip tc thc thi dng lnh 5 : clrscr(), ri n dng lnh 6 : printf , ri n dng lnh 7 : getch(). Sau khi thc thi xong dng lnh 8 : du }, khng cn g thc thi na C s kt thc vic thc thi. 2.2 Cc lnh if...else, while, do..while : Cc lnh ny cc c tham kho l thuyt, xin php khng nu ra y. Tuy nhin, c mt vi lu sau : - Cc lnh lp cng c thc thi theo c ch t trn xung di, nhng khi n cui khi lnh lp, C s quay li u khi thc thi (nu biu thc iu kin trong while tha) - Sau khi thc thi xong cc lnh ny (tc l cc biu thc trong if, while u thc thi xong), C s tip tc thc thi khi lnh ngay tip sau nhng lnh ny. VD : Nhp mt mng cc s nguyn dng A, vic nhp kt thc khi nhp mt s m. Sau kim tra xem dy A c tng hay khng, xut ra mn hnh DY TNG hoc DY KHNG TNG.

#include <stdio.h> #include <conio.h>

1 void main() 2 { 3 int a[100]; // mang cac so nguyen duong 4 int n; // so luong phan tu 5 int x; 6 int daytang; 7 clrscr(); 8 9 // nhap 10 n = 0; 11 do 12 { 13 printf("nhap a[%d] : ", n); 14 scanf("%d", &x); 15 if (x >= 0) 16 { 17 a[n] = x; 18 n++; 19 } 20 } 21 while (x >= 0); 22 // xu ly 23 daytang = 1; // gia su day tang 24 for (int i = 0; i < n-1; i++) 25 if (a[i] > a[i+1]) // kiem tra tinh tang 26 daytang = 0; 27 // xuat 28 if (daytang) 29 printf("DAY TANG\n"); 30 else 31 printf("DAY KHONG TANG\n"); 32 33 getch(); 34 } u tin C s bt u thc hin t hm main() (dng 1). Xt khi C thc hin ti vng lp do...while (dng 11). C s ln lt thc hin cc dng lnh 12, 13, 14. n dng 15 l dng lnh if, C s tnh ton xem (x >= 0) hay khng, nu x >= 0 C s tip tc thc thi dng lnh 17, 18, 19, ri sang dng 20, cn nu x < 0 th C s chuyn sang thc thi dng 20 (xin lu dng 20 chnh l lnh tip sau lnh if). Khi C thc hin ti dng 21, chnh l cui khi lnh do..while, C s kim tra biu thc iu kin trong while (x >= 0), nu biu thc ny tha C s quay li lnh 11, nu khng C s thc hin lnh 23. Khi C thc hin ti dng 24 : lnh lp for. u tin C s thc hin int i = 0. Sau kim tra i < n-1, nu ng th qua dng 25, nu khng th kt thc dng for (dng 28).

Khi n dng 25 : lnh r nhnh if, C s kim tra iu kin (a[i] > a[i+1]) nu ng th qua dng 26 ri kt thc lnh if, cn nu sai th cng thc lnh if. Nhng do lnh if nm trong for cho nn C s tip tc thc thi dng for, tc l quay li dng 24. Cc on sau tng t nh trn. 2.3 Lnh gi hm : Khi gp mt lnh gi hm f, C s thc thi nh sau : u tin C s di chuyn n u hm f v thc thi t trn xung di hm ny. Sau khi thc thi xong hm, C s quay tr li thc thi lnh ngay sau lnh gi hm. Qui trnh c din t trong s sau : .... void f() { } .... void main() { 1 .... f(); lnh; ... }

3 Cch s dng debug trong Borland C++ 3.1 :


y l cc chc nng dng debug trong BC3.1 Phm tt Chc nng ngha F7 Trace into D tng dng lnh mt. Nu gp hm th s d vo trong hm. F8 Step over Tng t Trace into, nhng khng d vo trong hm. F4 Go to cursor Yu cu C thc thi cho n khi gp dng lnh ngay ti v tr con tr th ngng d vt. Ctrl-F8 Breakpoint t nhng im dng tng t nh F4. Ctrl-F2 Program reset Dng vic debug. y l bng cc chc nng xem gi tr trong khi debug. Phm tt Chc nng ngha Ctrl-F4 Evaluate/Modify Xem gi tr ca mt biu thc c cc bin hin thi hoc sa gi tr ca mt bin Ctrl-F7 Watch a mt bin/biu thc vo ca s watch theo di khi debug.

4 Cc phm chc nng thng s dng cho thao tc Debug tng ng trong VC 6.0 (ch c tc dng khi chy bng F5)
Visual C++ F7 F4 CTRL + F5 F5 F9 F10 F11 Ctrl + F10 M ca s Watch (Menu View Debug Watch) G tn bin cn xem Hoc: nh du bin cn bit gi tr, dng chut ko v ca s ny Hoc: a con tr chut vo v tr c tn bin, gi tr ca bin s hin ra SHIFT + F5 CTRL + TAB Borland C++ F9 Alt + F8 CTRL+ F9 ngha Dch chng trnh Di chuyn n v tr li khi dch Thc thi chng trnh Chy chng trnh ch debug t breakpoint Step over Step into Goto Xem gi tr 1 bin

F8 F7 F4 Ctrl + F7

CTRL + F2 F6

Kt thc debug Chuyn i ca s

5 Chin thut d tm li theo vng:


Mc ch chnh ca debug l tm ra c nhng li sai logic t c bin php gii quyt thch hp. Tuy nhin, trong mt chng trnh ln vic tm ra mt li l khng d. Do vic tm li i hi phi c mt chin thut thch hp. Mi ngi c th c mt cch tm li khc nhau, nhng y chng ta ch s kho st chin thut tm li theo vng. 5.1 tng chnh tng chnh ca chin thut ny l kim tra li trong tng vng mt, t trn xung di, vng no kim tra ri s khng quay li kim tra na. 5.2 p dng : Thng thng thn mt chng trnh c dng sau : void main() {

Nhap(); Xuly(); Xuat(); } Gi s vi b kim tra T no , chng trnh ny cho kt qu khng nh mong mun. Nh vy, mt trong 3 phn ny s c mt s sai st no , vn l chng ta phi khoanh vng pht hin li. - Bt u t phn nhp, di chuyn con tr n u phn x l (tc l cui phn nhp), ri nhn F4 C thc thi phn nhp : Nhp ng nhng gi tr ca b kim tra T. Sau khi C thc thi xong, nhn phm Ctrl-F4, ri kim tra ln lt tng thnh phn (cc bin) va nhp (hoc c th dng Watch Window theo di), nu tt c cc thnh phn nhp u ng, chng t phn nhp ng vi b kim tra T v nh vy phn nhp coi nh kim tra xong. Nu c mt thnh phn sai, chng t phn nhp c li, khi chng ta li p dng ng chin thut ny i vi phn nhp, khoanh vng hp dn cho n khi ch cn mt hay mt vi lnh m bo m c li. Lc ny, chng ta s kim tra c php, logic ca tng lnh mt trong vng cho n khi pht hin li. Sau khi pht hin li v sa li, chng ta kim tra li ln na xem phn nhp cn li no khc hay khng, cho n khi chc chn rng phn nhp ng vi b d liu T. - Sau khi kim tra xong phn nhp vi b d liu T, tip tc kim tra cc thnh phn cn li. Nu sau khi kim tra k tt c cc phn m kt qu vn sai, iu ny chng t tng ban u gii quyt bi ton sai. Nu bi ton ng vi b kim tra T, chng ta phi tip tc kim tra vi cc b T1, T2... kim tra ton b cc kha cnh ca chng trnh.

6 Mt s v d minh ha :
Sau y l mt s v d minh ha, xin lu cc chng trnh trong v d u c t nht mt li. Chng ta s p dng k thut debug v chin thut tm li theo vng pht hin ra li. 6.1 Gii phng trnh bc nht

6.1.1 M t chng trnh : y l chng trnh gii phng trnh bc nht. Chng trnh yu cu nhp vo 2 h s a, b thc ri in kt qu ra mn hnh. T chc chng trnh nh sau : - hm nhap() Nhp 2 h s a, b. - Hm giaiptbn() a vo h s a, b. Hm s tr v gi tr VONGHIEM nu phng trnh v nghim; VOSONGHIEM nu phng trnh v s nghim; CONGHIEM nu phng trnh c nghim, trong trng hp ny gi tr nghim c lu trong bin x. - Hm xuat() a vo s nghim, v nghim, hm s xut ra mn hnh cc cu tng ng.

6.1.2 Hng dn debug : - u tin nhn Ctrl-F9 thc thi ton b chng trnh. - Chng trnh yu cu nhp hai h s a, b. Nhp 1 1 ri ENTER. Chng trnh xut ra cu Phuong trinh vo so nghiem. R rng y l kt qu sai, vi h s 1 1 th nghim phi l x = -1. Nhn Enter quay tr li mn hnh son tho d tm li. Kim tra phn nhp. - Di chuyn con tr n dng 54 (tc l ngay sau li gi hm nhap()), nhn phm F4. - Chng trnh yu cu nhp hai h s a, b. Nhp li 1 1 ri ENTER. - Trong mn hnh son tho, nhn phm Ctrl-F4, trong nhp Expression nhp a ri ENTER. Trong Result l gi tr hin thi ca bin a, gi tr l 0.0. - Lm tng t vi bin b, ta cng c kt qu tng t b = 0.0. Nhn ESC thot khi hp thoi tnh gi tr. Hai gi tr a, b khng ng vi gi tr nhp, chng t hm nhap() c li. - Nhn Ctrl-F2 bt u li vic thc thi. Kim tra hm nhap(). - Di chuyn con tr n dng 53 (ngay ti li gi hm nhap()), nhn F4. Ri nhn F7 thc hin li gi hm. Dng xanh c di chuyn n dng 12). - Nhn F7, dng xanh di chuyn n dng 14 : lnh printf. - Nhn F7, C va thc thi xong lnh printf. Nhn Alt-F5 xem mn hnh thc thi. Trn mn hnh s c cu Nhap 2 he so a, b : - Nhn ESC quay tr li mn hnh son tho. - Nhn F7, C thi hnh lnh scanf. Mn hnh c chuyn sang mn hnh thc thi, nhp 1 1 ri ENTER. - Trong mn hnh son tho, nhn Ctrl-F4, ri xem 2 gi tr a, b nh lm trn. Gi tr a = 1.0 v b = 1.0, hm scanf thc hin ng chc nng. Nhng ti sao sau khi ra hm nhp a, b li c gi tr 0 ? Lc ny chng ta s xem xt k tng dng lnh ca hm v pht hin ra rng hm nhap() truyn tham s sai, phi l nhap(float &a, float &b) bi v chng ta mun thay i gi tr 2 bin a, b truyn vo. - Sa hm void nhap(float a, float b) thnh nhap(float &a, float &b). - Nhn Ctrl-F2 thc thi li t u. - Kim tra li hm nhp xem gi tr ca a, b c ng hay khng nh lm trn. Chng ta thy rng hm nhp ng. - Nhn Ctrl-F9 ri nhp 1 1 ENTER. Chng trnh cho kt qu l Phuong trinh co nghiem la x = 0. Nh vy kt qu vn sai. Kim tra hm giaiptbn(). - Di chuyn n dng 55, nhn F4. Nhp 1 1 ri ENTER. - Nhn Ctrl-F4 xem gi tr a, b, x, kq. Ta s c a = 1.0, b = 1.0, x = -1.0, kq = 1. Nhn Ctrl-F2. Nh vy gi tr x =-1.0 l ng trong trng hp ny. nn chng ta b qua hm giaiptbn(). Kh nng gy li l hm xuat(). Kim tra hm xuat() - Di chuyn n dng 55, nhn F4. Nhp 1 1 ri ENTER. - Khi vo mn hnh son tho, nhn F7 vo hm xuat(). - Nhn F7 bt u thc thi dng if th 1.

Nhn F7, biu thc iu kin kq == VONGHIEM c gi tr sai nn C s b qua dng if th 1. - Nhn F7, biu thc iu kin kq == VOSONGHIEM c gi tr sai nn C s b qua dng if th 2. - Nhn F7, biu thc iu kin ng, dng xanh di chuyn n dng 44 : lnh printf. - Nhn F7, ri nhn Alt-F5 xem mn hnh thc thi. Kh nng gy li ch cn c th l dng lnh printf(). Kim tra tht k li c php, chng ta s thy lnh printf l sai : x l bin kiu s thc nhng li dng ch th xut l %d. - Sa dng lnh printf : %d thnh %f. - Nhn Ctrl-F9, ri nhp 1 1 ENTER. Kt qu ng Phuong trinh co nghiem x = -1.000000 - Chy th b 1 2, kt qu vn ng. - Chy th b 2 3, kt qu x = -1.000000. y l kt qu sai ! (kt qu ng l x=1.5) Nh vy chng trnh vn cn li. Chng ta li tip tc debug, nhng xin dnh cng vic ny cho cc bn. Xin gi l li nm trong hm giaiptbn(), p n c cho phn 7.

6.2

Sp xp mng tng dn:

6.2.1 M t chng trnh : y l chng trnh sp xp mng tng dn. Chng trnh yu cu nhp mng mt chiu cc s nguyn. Chng trnh s sp xp li theo th t tng dn, ri xut kt qu ra mn hnh. 6.2.2 Hng dn debug : Phn ny khng hng dn chi tit nh trn, m ch a ra nhng hng debug. - u tin, nhn Ctrl-F9 thc thi ton b chng trnh. - Chng tnh yu cu nhp n. Nhp 3 ri ENTER. - Chng trnh yu cu nhp a[3]. Nhp 3 ri ENTER. - Chng trnh xut ra s 0. Nhn ENTER kt thc. R rng chng trnh khng cho ra mt kt qu no c v l ng n. Nu chu kh , chng ta s thy sau khi nhp n = 3, chng trnh yu cu nhp a[3], nh vy d dng thy d on rng phn nhp c vn , c th hn s l vng lp nhp mng c li. Sau khi xem k li hm nhp mng, chng ta s pht hin ra li ; cui dng for. - Sa li dng for trong hm nhp : b i du ; cui dng for. Kim tra cc hm cn li xem c b li tng t hay khng. D thy cc hm sapxepmang() v xuatmang() cng b li tng t. - Sa cc li ; cc hm sapxepmang() v xuatmang() - Nhn Ctrl-F9 thc thi ln na. - Chng tnh yu cu nhp n. Nhp 3 ri ENTER.

- Chng trnh yu cu nhp a[0], a[1], a[2]. Nhp ln lt 2, 1, 3. Chng trnh khng xut ra g c. Chng ta c th d on hm xuatmang() c li. Nhng nu xem xt k, ta thy hm xuatmang() khng c li g c. Nh vy vn cn li ch c th l phn nhapmang() (do nhp mng lin quan n n - nh hng trc tip n dng for). Xem xt k li hm nhp mng, nu vn khng thy vn g th c l bn nn debug. (Xem p n phn 7). - Sau khi sa xong li hm nhp mng. Nhn Ctrl-F9 thc thi chng trnh. - Nhp n = 3 v a = {3, 1, 1}. Kt qu xut ra l 3 2 1. Vn sai ! Chng ta c th d on li ny nm trong hm sapxepmang(). Cc bn t kim tra li hm ny.

7 Bi tp :
Bao gm 4 bi tp c km theo y.

8 p n :
- V d 5.1 : Li nm dng 20 : a, b l s thc nn phi sa li l int giaiptbn(float a, float b, float &x) - V d 5.2 : Li dng 15,25,26,37 : b du ; cui dng for. Li dng 11 : n l bin cc b s khng thay i gi tr ca bin n ton cc. B dng khai lnh bo int n. Li dng 26 : for (int j = i + 1 ...

9 Ph lc
Cc li sai c php dn ti sai logic thng gp : Sau y l danh sch li sai c php dn ti sai logic thng gp trong khi ci t chng trnh. Danh sch ny khng hon ton y : Li Tnh hung minh ha Cch gii quyt Bin ton cc v bin cc b int n; B khai bo cc b int void nhap() n, hoc cho hm nhp { c tham s n. int n; scanf(%d, &n}; } ... Tham tr v tham bin xem v d hon v trn thm du &, * hoc b 2 du ny. Du ; for (int i = 0; i < n; i++); B du ; thch hp. xuly(); hoc if (a > b); xuly(); ...

Nhp, xut sai kiu

Sai ch s mng Du { v } u tin php ton Php ton v kiu d liu

float f; printf(%d, f); hoc scanf(%c, f); ... int a[100]; a[-1] = 0; cc du {, } khng khp nhau. Ckn = gt(n)/gt(k)*gt(n-k). int a, b; float thuong = a/b;

Sa cho ng kiu

sa ch s mng.

Ckn = gt(n)/(gt(k)*gt(nk)); p cho ng kiu. float thuong = (float) a/b;