Professional Documents
Culture Documents
9 Chương Chín - Debug
9 Chương Chín - Debug
0
Chng Chn - Debug
1.
Hoc l program khng lm ng chuyn cn phi lm v programmer hiu lm Specifications hay c cho tin tc sai lc, hoc l program b st chi tit cn phi c. Trng hp ny ta gii quyt bng cch gim thiu s hiu lm qua s nng cp kh nng truyn thng. 2. Program khng thc hin ng nh programmer mun. Tc l programmer mun mt ng m bo chng trnh lm mt ng v v tnh khng vit lp trnh ng cch. Trng hp ny ta gii quyt bng cch dng nhng Software Tools (k c ngn ng lp trnh) thch hp, v c nhng qu trnh lm vic c h thng. Trong hng xe hi ngi ta dng t Quality Control ni n vic ch ra chic xe khng c li lm g c. t mc tiu y, chng nhng cn c ngi kim phm m chnh cc nhn vin lp rp thn trng cng vic chnh ca ngi kim phm l xc nhn kt qu tt ch khng phi tm li lm. C nhiu yu t nh hng n cht lng ca mt program nh chc nng ca program, cu trc ca cc b phn, k thut lp trnh v phng php debug. Debug khng hn nm giai on cui ca d n m ty thuc rt nhiu vo cc yu t k trc trong mi giai on trin khai.
trong s lin h vi khch hng ta cn phi hi i, hi li, phn hi vi khch hng nhiu ln iu ta hiu bng th t, ti liu, khch xc nhn l ta bit ng h trc khi xc tin vic thit k chng trnh. Nu sau ny khch i , l quyn ca h, nhng h phi tr tin thay i (variation).
Cu trc cc b phn
Program no cng c mt kin trc tng t nh mt cn nh. Mi b phn cng n gin cng tt v cch rp cc b phn phi nh th no ta d th. Trong khi thit k ta phi bit trc nhng yu im ca mi b phn nm u ta chun b cch th chng. Ta s khng h tin b phn no hon ho cho n khi th n, d n n s n u. Nu ta mun dng mt k thut g trong mt hon cnh no m ta khng bit chc n chy khng th nn th ring r n trc. Phng php y c gi l Prototype. Ngoi ra, ta cng nn k hoch cho nhng trng hp bt ng, in hnh l bad data - khi user bm lung tung hay database cha rc rn. Nu chng trnh chy trong real-time (tc l data thu nhp qua Serial Comm Port, Data Acquisition Card hay mng), bn cn phi lu nhng trng hp khc nhau ty theo vic g xy ra trc, vic g xy ra sau. Lc by gi Logic ca chng trnh s ty thuc vo trng thi (State) ca data. Tt nht l ngh n nhng Scenarios (din tin ca nhng hon cnh) c th th tng giai on v tnh hung. Ngy nay vi k thut i Tng, giai on thit k ny l lc quyt nh cc Data Structures (tables, records ..v.v.) v con s Forms vi Classes. Nh rng mi Class gm c mt Data Structure v nhng Subs/Functions/Properties lm vic (operate) trn data y. Data structure phi cha y nhng chi tit (data fields, variables) ta cn. K l nhng cch chng trnh process data. Subs/Functions no c th cho bn ngoi gi th ta cho n Public, cn nhng Subs/Functions khc hin hu phc v bn trong class th ta cho n Private.
K thut lp trnh
Cn bn ca programmers v cc thi quen ca h rt quan trng. Ni chung, nhng ngi hp tp, nhy vo vit chng trnh trc khi suy ngh hay cn nhc chnh chn th sau ny bugs li ra khp ni l chuyn t nhin.
giai on c th m mt call n mt Sub. Th g cn phi tnh ra hay ly t ni khc th c th c thc hin bng mt Function. Th d nh cng vic trong mt tim git i c th gm c cc bc sau: 1. 2. 3. 4. 5. 6. 7. 8. Nhn hng Phn chia tng loi Ty Git i V bao Tnh tin Giao hng
Trong cc bc 1,2,6 v 8 c th l nhng Subs. Cn cc bc 3,4,5 v 7 nhng Functions, th d nh khi ta giao cho Function Git mt ci o d ta s ly li mt ci o sch. Nh rng im khc bit chnh gia mt Sub v mt Function l Function cho ta mt kt qu m khng lm thay i nhng parameters ta a cho n. Trong khi , du rng Sub khng cho ta g mt cch r rng nhng n c th thay i tr s (value) ca bt c parameters no ta pass cho n ByRef. Nhc li l khi ta pass mt parameter ByVal cho mt Sub th ging nh ta a mt copy (bn sao) ca variable cho Sub, Sub c th sa i n nhng n s b b qua, khng nh hng g n original (bn chnh) variable. Ngc li khi ta pass mt parameter ByRef cho mt Sub th ging nh ta a bn chnh ca variable cho Sub n c th sa i vy. Do trnh trng hp v tnh lm cho tr s mt variable b thay i v ta dng n trong mt Sub/Function bn nn dng ByVal khi pass n nh mt parameter vo mt Sub/Function. Tht ra, bn c th dng ByRef cho mt parameter pass vo mt Function. Trong trng hp d nhin variable y c th b sa i. iu ny gi l phn ng ph (side effect), v bnh thng t ai lm vy. Do , nu bn tht s mun vt ngoi qui c thng thng th nn Comment r rng cnh co ngi s c chng trnh bn sau ny. Ngoi ra, mi programmer thng c mt Source Code Library ca nhng Subs/Functions ng . Bn nn dng cc Subs/Functions trong Library ca bn cng nhiu cng tt, v chng c th nghim ri.
ng s Error
Mi khi chng trnh c mt Error, hoc l Compilation Error (v ta vit code khng ng vn phm, ng vng), hoc l Error trong khi chy chng trnh, th bn khng nn s n. Hy bnh tnh c ci Error Message xem
n mun ni g. Nu khng hiu ngay th c i c li vi ln v suy nghim xem c tm c mch nc no khng. Ngh programming ca chng ta s gp Errors nh n cm ba, nn bn phi tp bnh tnh i din vi chng.
t tn cc variables c ngha
Kh nht l lm vic vi cc variables c tn vn tt nh K, L, AA, XY. Ta khng c mt cht nim chng l ai, hin hu lm g. Thay vo , nu ta t cc tn variables nh NumberOfItems, PricePerUnit, Discount .v.v.. th s d hiu hn. Mt trong nhng bugs kh thy nht l ta dng cng mt tn cho local variable (variable declared trong Sub/Function) v global variable (variable declared trong Form hay Basic Module). Local variable s che y global variable cng tn, nn nu bn mun ni n global variable trong hon cnh y bn s dng lm local variable.
Desk Check
Kim li code trc khi compile. Khi ta compile code, nu khng c error ch c ngha l Syntax ca code ng, khng c ngha l logic ng. Do ta cn phi bit chc l code ta vit s lm ng iu ta mun bng cch c li code trc khi compile n ln u tin. Cng vic ny gi l Desk Check (Kim trn bn). Mt chng trnh c Desk Checked k s cn t debug v cha t bugs khng ng trc. L do l mi scenarios c tin liu chu o.
Dng Breakpoints
Cch hay nht theo di execution ca program l dng Breakpoint lm cho program ngng li mt ch ta mun trong code, ri sau ta cho program bc tng bc. Trong dp ny ta s xem xt tr s ca nhng variables coi chng c ng nh d nh khng.
Bn on trc execution s i qua ch no trong code, chn mt ch thch hp ri click bn tri ca hng code, ch du chm trn nh trong hnh di y:
Nu bn click ln du chm trn mt ln na th l hy b n. Mt cch khc t mt breakpoint l editor cursor ln hng code ri bm F9. Nu bn bm F9 ln na khi cursor nm trn hng th l hy b break point. Lc program ang dng li, bn c th xem tr s ca mt variable bng cch cursor ln trn variable y, tooltip s hin ra nh trong hnh di y:
C mt s chuyn khc bn c th lm trong lc ny. Bn c th nm du chm trn ko (drag) n ngc ln mt hay nhiu hng code n s execute tr li vi hng code. Bn cho program execute tng hng code bng cch bm F8. Menu command tng ng vi n l Debug | Step Into. S c lc bn khng mun program bc vo bn trong mt Sub/Function m mun vic execute mt Sub/Function nh mt bc n gin. Trong trng hp , bn dng Menu command Debug | Step Over hay Shift-F8.
Nh l cho program chy li bn bm F5, tng ng vi Menu command Run | Continue. C khi bn mun program ngng gia mt For Loop khi Iterator value c mt tr s kh ln. Nu ta sn mt breakpoint ri c bm F5 nhiu ln th hi bt tin. C mt mnh li l dng mt IF statement th khi Iterator value c tr s y th ta ngng breakpoint ti statement Beep (thay g statement Print ICounter) nh trong hnh di y:
Mun hy b mi breakpoints bn dng Menu command Debug | Clear All Breakpoints. tin vic debug, bn c th dng Debug Toolbar bng cch hin th n vi Menu command View | Toolbars | Debug
Thay v nh "Print ICounter" bn cng c th nh "? ICounter". Nh l mi VB Statement bn nh trong Immediate Window s c executed ngay khi bn bm Enter. Bn c th dng li bt c VB statement no trong Immediate Window, ch cn bm Enter cui hng y.
C mt cch khc l thay v cho hin th trong Immediate Window bn cho vit xung (Log) vo trong mt text file. Di y l mt Sub in hnh bn c th dng Log mt Event message:
Sub LogEvent(ByVal GivenFileName, ByVal Msg As String, HasFolder As Boolean, IncludeTimeDate As Integer) ' Append event message Msg to a text Logfile GivenFileName ' If GivenFileName is fullPathName then HasFolder is true ' IncludeTimeDate = 0 : No Time or Date ' = 1 : Prefix with Time ' = 2 : Prefix with Time and Date Dim FileNo, LogFileName, theFolder If HasFolder Then LogFileName = GivenFileName Else If Right(App.Path, 1) <> "\" Then theFolder = App.Path & "\" Else theFolder = App.Path End If LogFileName = theFolder & GivenFileName End If FileNo = FreeFile If Dir(LogFileName) <> "" Then Open LogFileName For Append As FileNo Else Open LogFileName For Output As FileNo End If Select Case IncludeTimeDate Case 0 ' No Time or Date Print #FileNo, Msg Case 1 ' Time only Print #FileNo, Format(Now, "hh:nn:ss ") & Msg Case 2 ' Date & Time Print #FileNo, Format(Now, "dd/mm/yyyy hh:nn:ss ") & Msg End Select Close FileNo End Sub
Khi dng Elimination Method bn phi cn nhc Logic ca code bn trong khi quyt nh Comment Out nhng hng no, nu khng, l mt phng php kh nguy him. Ngoi ra, Menu Command View | Locals Window lit k cho bn tr s ca tt c variables trong mt Sub/Function v View | Call Stack lit k th bc cc Sub gi ln lt t ngoi vo trong cho n v tr code ang ngng hin thi.