Ch

ng Chín - Debug

ươ

i l m c a program mà ta phát hi n khi ch y nó. Debug là công vi c lo i t t c ỗ ầ ạ ấ ả ệ ệ ạ ủ ươ ể ọ ố ả ộ c h t ta ph i tìm hi u lý do khi n nó xu t hi n. M t ệ ể ế ấ Bugs là nh ng l nh ng l ữ Thông th khi đã bi ạ ướ ế c duyên c r i ta s nghĩ ra cách gi i quy t. Nói chung, có hai lo i bugs: ữ i l m trong ch ỗ ầ ườ t đ ế ượ ng trình đ nó ch y êm xuôi trong m i hoàn c nh. ng mu n fix m t cái bug nào tr ộ ớ ồ ả ế ẽ ả ạ

1.

ặ ả ứ ạ ườ ng Ho c là program không làm đúng chuy n c n ph i làm vì programmer hi u l m ể ầ t c n ph i có. Tr ả ề i quy t b ng cách gi m thi u s hi u l m qua s nâng c p kh năng truy n ệ ầ c cho tin t c sai l c, ho c là program b sót chi ti ế ầ ặ ả ấ ể ự ể ầ ượ ế ằ ỏ ự ả ả Specifications hay đ h p n y ta gi ầ ợ thông. 2. ự ư ứ ệ ố ng trình làm m t ngã vì vô tình không vi ng h p n y ta ố ế ậ ườ ợ ộ t l p trình đúng cách. Tr ữ ậ ươ ế ằ ể ả ợ Program không th c hi n đúng nh ý programmer mu n. T c là programmer mu n m t đàng mà b o ch ả gi nh ng quá trình làm vi c có h th ng. ộ ầ i quy t b ng cách dùng nh ng Software Tools (k c ngôn ng l p trình) thích h p, và có ả ữ ữ ệ ố ệ

ệ ế ế ừ Quality Control đ nói đ n vi c ch ra chi c xe không có l ẳ ẩ ế ể i ki m ph m là xác nh n k t qu t ỗ i i ki m ph m mà chính các nhân viên l p ấ ả t ch không ph i ả ố ơ ả ể ạ ể ữ ườ ầ ể ủ ệ ế ậ ớ Trong hãng xe h i ng i ta dùng t ể ườ l m gì c . Đ đ t m c tiêu y, ch ng nh ng c n có ng ườ ấ ụ ầ ráp th n tr ng đ công vi c chính c a ng ẩ tìm l ậ ọ i l m. ỗ ầ

ng đ n ch t l ấ ượ ộ ế ậ ậ ủ ươ ủ ẳ c trong m i giai đo n tri n khai. k tr nh h Có nhi u y u t ưở ề ế ố ả trúc c a các b ph n, k thu t l p trình và ph ủ ỹ ậ ộ cu i c a d án mà tùy thu c r t nhi u vào các y u t ố ủ ự ấ ng c a m t program nh ch c năng c a program, c u ư ứ ng pháp debug. Debug không h n n m ạ giai đo n ằ ở ể ế ố ể ướ ộ ấ ề ạ ọ

Ch c năng c a ch ng trình (Program Specifications) ủ ứ ươ

ậ ỏ ướ ế ỉ ư ế c h t ta ph i xác nh n rõ ràng và t m nó c n ph i làm gì, bao nhiêu ỉ ạ ầ ế ả i dùng, m ng nh th nào, database l n bao nhiêu, ph i ch y nhanh đ n m c nào .v.v.. ề ể ầ ả ị ừ ng trình khách ể ầ ả ứ ề ươ ầ ề ệ ớ ả ỏ ộ ộ ệ ậ ả ằ ể ề ng trình. N u sau n y khách đ i ý, đó là quy n ề ầ ệ ầ ổ D u program l n hay nh , tr ả ớ ầ ng ớ ạ ườ ng trình ph i b thay đ i n a ch ng vì programmers hi u l m đi u khách hàng Có nhi u ch ổ ữ ươ mu n. Kh nh t là lúc g n giao hàng m i khám phá ra có nhi u đi m trong ch ớ ấ ổ ố ỏ mu n m t đàng mà ta làm m t ngã. Do đó trong s liên h v i khách hàng ta c n ph i h i đi, h i ố , tài li u, đ khách xác nh n là ta i, ph n h i v i khách hàng nhi u l n đi u ta hi u b ng th t l ư ừ ồ ớ ạ c khi xúc ti n vi c thi t đúng ý h tr bi ế ế ọ ướ ế c a h , nh ng h ph i tr ti n thay đ i ( ả ả ề ọ ủ ọ ự ề ể t k ch ế ế ươ ổ variation). ư

C u trúc các b ph n ộ ậ ấ

ng t ộ ỗ ộ ươ ả nh m t căn nhà. M i b ph n càng đ n gi n càng t ậ ự ư ộ ế ế ể ế ả ả ố t c nh ng ữ ậ đâu đ ta chu n b cách th chúng. Ta s không h tin b ph n ộ ơ t tr t k ta ph i bi ế ướ ề ử ể ể ẽ ậ Program nào cũng có m t ki n trúc t và cách ráp các b ph n ph i nh th nào đ ta d th . Trong khi thi ộ ư ế ậ y u đi m c a m i b ph n n m ỗ ộ ằ ở ế nào hoàn h o cho đ n khi đã th nó, dù nó đ n s đ n đâu. ử ế ễ ử ị ẩ ơ ơ ế ủ ả

t ch c nó ch y không ế ả ế ắ ạ N u ta mu n dùng m t k thu t gì trong m t hoàn c nh nào mà ta không bi ố thì nên th riêng r nó tr ng pháp y đ Prototype. ậ c. Ph c g i là ộ ấ ượ ọ ộ ỹ ướ ươ ử ẽ

ữ ế ạ ườ ấ ng h p b t ng , đi n hình là bad data - khi user b m ể ấ ợ ờ Ngoài ra, ta cũng nên k ho ch cho nh ng tr lung tung hay database ch a rác r n. ứ ế

ng trình ch y trong ạ ươ ệ ợ ạ c, vi c gì x y ra sau. Lúc b y gi ẩ ng h p khác nhau tùy theo vi c gì x y State) ứ ả ư ữ Logic c a ch ướ ủ ờ N u ch ế Acquisition Card hay m ng), b n c n ph i l u ý nh ng tr ra tr ươ ẩ c a data. T t nh t là nghĩ đ n nh ng ủ real-time (t c là data thu nh p qua Serial Comm Port, Data ậ ạ ầ ườ ng trình s tùy thu c vào tr ng thái ( ấ ộ ữ Scenarios (di n ti n c a nh ng hoàn c nh) đ có th th ể ử ế ủ ạ ể ẽ ữ ệ ố ễ ế ấ ả

t ng giai đo n và tình hu ng. ừ ạ ố

ng, giai đo n thi ở ậ ạ ố ượ ố t k n y là lúc quy t đ nh các Data Structures ế ị ồ ế ế ầ ớ ằ ớ ộ ứ ầ ủ ỗ ấ ệ ả t (data fields, variables) ta c n. K đó là nh ng cách ch ầ ươ ữ ế ế Public, còn nh ng Subs/Functions khác ng trình process data. ữ ọ Ngày nay v i k thu t Đ i T ớ ỹ (tables, records ..v.v.) và con s Forms v i Classes. Nh r ng m i Class g m có m t Data Structure và nh ng Subs/Functions/Properties làm vi c (operate) trên data y. Data structure ph i ch a đ y đ ữ nh ng chi ti ữ Subs/Functions nào có th cho bên ngoài g i thì ta cho nó ể Private. hi n h u đ ph c v bên trong class thì ta cho nó ệ ữ ể ụ ụ

K thu t l p trình ậ ậ ỹ

ườ ấ i h p ủ ọ ấ ữ c khi suy nghĩ hay cân nh c chính ch n thì sau n y bugs lòi ra ng trình tr ọ ắ ướ ắ ươ nhiên. Căn b n c a programmers và các thói quen c a h r t quan tr ng. Nói chung, nh ng ng ả ủ t p, nh y vào vi t ch ế ầ ả ấ kh p n i là chuy n t ệ ự ơ ắ

Dùng Subs và Functions

t k ki n trúc c a ch ế ế ế ủ ừ t v Subs, Functions .v.v.., m i th s c n ph i th nh th nào. N u ta có th chia ả ươ ỗ ạ ạ ầ ỗ ộ n i khác thì có th đ giai đo n thi ạ i ng trình ta chia ra t ng Class, thì khi l p trình ta l N u ậ ạ ế ở t k chi ti thi ể ế ế ề ế ế ử ư ế công vi c ra t ng giai đo n thì m i giai đo n có th mà m t call đ n m t ả ộ Sub. Th gì c n ph i ứ ế ừ ệ ộ Function. tính ra hay l y t ể ượ ứ ẽ ầ ể c th c hi n b ng m t ệ ấ ừ ơ ự ằ

i có th g m có các b c sau: Thí d nh công vi c trong m t ti m gi ệ ụ ư ộ ệ t ặ ủ ể ồ ướ

ậ ạ

1. 2. 3. 4. 5. 6. 7. 8. Nh n hàng Phân chia t ng lo i ừ T y ẩ Gi t ặ i Ủ Vô bao Tính ti n ề Giao hàng

c 1,2,6 và 8 có th là nh ng Subs. Còn các b ướ c 3,4,5 và 7 nh ng Functions, thí ữ i m t cái áo s ch. Trong đó các b d nh khi ta giao cho ụ ư ể tặ m t cái áo d ta s l y l Function Gi ướ ẽ ấ ạ ữ ộ ơ ạ ộ

ộ ộ ữ ớ ằ ộ ế ả ổ ầ ằ ộ ư ư ổ ị ố ủ ấ ứ ByVal cho m t Sub thì gi ng nh ta đ a m t i là khi ta pass m t parameter ể ộ ư ư ố ẽ ị ỏ ắ ạ ủ ể ữ ổ ộ ư ả ưở ng

ủ ByRef cho m t Sub thì gi ng nh ta đ a b n chính c a c l ượ ạ ư ả ư ộ ộ ố t chính gi a m t Sub và m t Function là Function cho ta m t k t qu mà Nh r ng đi m khác bi ệ ể ữ parameters ta đ a cho nó. Trong khi đó, d u r ng Sub không cho ta gì không làm thay đ i nh ng m t cách rõ ràng nh ng nó có th thay đ i tr s (value) c a b t c parameters nào ta pass cho nó ộ copy ByRef. Nh c l (b n sao) c a variable đó cho Sub, Sub có th s a đ i nó nh ng nó s b b qua, không nh h ả gì đ n ế original (b n chính) variable. ả i khi ta pass m t parameter Ng variable cho Sub đ nó có th s a đ i v y. ể ữ ổ ậ ể

ộ ng h p vô tình làm cho tr s m t variable b thay đ i vì ta dùng nó trong m t ị ố ộ ườ ợ ị Do đó đ tránh tr ể Sub/Function b n nên dùng ByVal khi pass nó nh m t parameter vào m t Sub/Function. ạ ư ộ ổ ộ

ạ ậ ể ộ ườ ộ ề ấ ọ ụ side effect), vì bình th ng h p đó dĩ ợ ườ ng ít ai ng thì nên Comment rõ ràng ả ứ ướ ườ ể ị ữ ổ ạ ế i s đ c ch Th t ra, b n có th dùng ByRef cho m t parameter pass vào m t Function. Trong tr nhiên variable y có th b s a đ i. Đi u n y g i là ph n ng ph ( c thông th làm v y. Do đó, n u b n th t s mu n v ậ đ c nh cáo ng ườ ẽ ọ ể ả ầ t ngoài qui ố ượ ng trình b n sau n y. ạ ậ ự ươ ầ

Ngoài ra, m i programmer th ng có m t ỗ ườ ộ Source Code Library c a nh ng Subs/Functions ng ý. ủ ữ ư

t, vì chúng đã đ c th ạ ủ ạ ề ố ượ ử B n nên dùng các Subs/Functions trong Library c a b n càng nhi u càng t nghi m r i. ệ ồ

Đ ng s Error ợ ừ

ng trình có m t Error, ho c là ộ ế ặ ỗ ạ ươ ữ ự Compilation Error (vì ta vi ạ ặ ợ t code không đúng văn ng trình, thì b n không nên s nó. Hãy bình ầ i vài l n ọ ạ ạ ể ế ọ ố ẽ ặ c nào không. Ngh programming c a chúng ta s g p ướ ủ ề M i khi ch ph m, ng v ng), ho c là Error trong khi ch y ch ươ tĩnh đ c cái Error Message đ xem nó mu n nói gì. N u không hi u ngay thì đ c đi đ c l ọ c mách n và suy nghi m xem có tìm đ ệ Errors nh ăn c m b a, nên b n ph i t p bình tĩnh đ i di n v i chúng. ả ậ ể ượ ạ ư ữ ệ ơ ố ớ

Dùng Comment (Chú thích)

ớ ế ở ạ ọ ấ t code nh thêm ầ Comment đ y đ đ b t c khi nào tr l ầ ủ ể ấ ứ ệ i đ c đo n code y trong t ụ ạ ậ ứ ể ể ủ ả ự ạ t b n ph i vi ườ ề ể ấ ễ i sao b n làm cách y. Có th sau n y ta khám phá ra t r t nhi u Comment nh ng h có đi m nào khác th ư ấ ầ ng, bí ể ậ t k đúng nh ng cách l p ư ế ế ạ i có th ta s th y d u r ng ý đ nh và thi ầ ằ ế ấ ả i thích t ạ ả ẽ ấ ư ế ể ạ ể ị Lúc vi ươ ng lai b n không c n ph i d a vào tài li u nào khác mà có th hi u ngay l p t c m c đích c a m t ộ ạ Sub/Function hay đo n code. Nh th không nh t thi ế ạ hi m thì b n c n thông báo và gi ạ ầ đo n code có bugs; lúc đ c l ọ ạ trình có ph n thi u soát ch ng h n. ẳ ế ầ ạ

ở ỗ ệ ỗ ứ ớ ỉ ọ ả ộ t s đ ế ẽ ượ ố ư ắ ả ộ ả ươ ẽ ạ ế ề ạ c ng ườ t. Đ ng lo ng i là ch ừ ạ ấ ả c thi ớ ấ ẻ ậ ộ ế ế ẩ ầ ượ ữ ề ể ớ ớ ắ m i ch . T c là, g n nh ch c ch n Tính ra trung bình m t programmer ch làm vi c 18 tháng ầ ơ i khác đ c và b o trì ( debug và thêm b t). Do đó, code ph i càng đ n code b n vi ạ ng trình s ch y ch m hay chi m nhi u b nh , vì gi n, d hi u càng t ớ ậ ễ ể ề ậ ngày nay computer ch y r t nhanh và b nh r t r . Khi nào ta th t s c n ph i quan tâm v v n ậ ự ầ t c và b nh thì đi u đó c n đ ề t k c n th n ch không ph i d a vào nh ng ti u x o v ả ả ự ộ ố l p trình. ậ

Đ t tên các variables có ý nghĩa ặ

ấ ắ ắ ư ộ ổ ệ ư ặ Kh nh t là làm vi c v i các variables có tên v n t ệ ớ ni m chúng là ai, hi n h u đ làm gì. Thay vào đó, n u ta đ t các tên variables nh ệ ữ ể NumberOfItems, PricePerUnit, Discount .v.v.. thì s d hi u h n. t nh K, L, AA, XY. Ta không có m t chút ý ế ẽ ễ ể ơ

local variable (variable declared ộ ữ ấ ấ ộ

ế ế ậ ạ ố M t trong nh ng bugs khó th y nh t là ta dùng cùng m t tên cho trong Sub/Function) và global variable (variable declared trong Form hay Basic Module). Local variable s che đ y global variable cùng tên, nên n u b n mu n nói đ n global variable trong hoàn c nh y b n s dùng l m local variable. ả ẽ ạ ẽ ấ ầ

Dùng Option Explicit

ạ ế đ u m i Form, Class hay Module. N u có variable nào ở ầ t ngay. N u b n không dùng Option Explicit, m t variable Option Explicit ế ẽ ạ ộ B n nên trung tín dùng đánh v n tr t VB6 IDE s cho b n bi ậ ầ đánh v n tr t đ ậ ượ ầ ỗ ế c xem nh m t variable m i v i giá tr 0 hay "" (empty string). ớ ớ ạ ư ộ ị

ạ ậ ọ ộ ớ Nói chung b n nên th n tr ng khi assign m t data type cho m t variable v i data type khác. B n ạ ph i bi ả t rõ b n đang làm gì đ kh i b ph n ng ph (side effect). ỏ ị ộ ả ứ ụ ế ể ạ

Desk Check

i code tr ạ ướ ỉ t ch c là code ta vi ả c khi compile nó l n đ u tiên. Công vi c n y g i là i code tr Ki m l ể c a code đúng, không có nghĩa là logic đúng. Do đó ta c n ph i bi ủ đúng đi u ta mu n b ng cách đ c l ố c khi compile. Khi ta compile code, n u không có error ch có nghĩa là Syntax ế t s làm ầ ọ ế ẽ ệ ầ ọ ạ ắ ầ ế ầ ướ ề ằ

ươ ộ c Desk Checked k s c n ít debug và ch a ít ứ ỹ ẽ ầ c tiên li u chu đáo. Desk Check (Ki m trên bàn). M t ch ể bugs không ng tr ờ ướ ng trình đ c. Lý do là m i scenarios đã đ ọ ượ ượ ệ

So n m t Test Plan ộ ạ

t kê t ệ ấ ả ữ ử ử ẽ ố t c nh ng gì ta mu n th và cách th chúng. Khi th theo Test Plan ta s khám ử i l ch s c a Test Plan (tr c tr c gì x y ra, ạ ị ồ ơ ặ i quy t) s b ích trên nhi u ph ng di n. Ta s h c đ ẩ c t ụ ẽ ọ ượ ừ ẽ ổ ệ t rõ nh ng th gì trong d án đã đ c th theo cách nào. Test Plan li phá ra nh ng bug và tìm cách lo i chúng ra. H s ghi l ạ ữ b n đã dùng bi n pháp nào đ gi ể ả ệ ạ kinh nghi m Debug và bi ữ ử ủ ươ ử ề ượ ế ứ ự ệ ế

X lý Error lúc Run time ử

ươ ế ằ ị ộ Error ế ộ t lý do v n t c. Sau khi b n click OK, ch ế ng trình vi ắ ắ t b ng VB6 đang ch y, n u g p Error, nó s hi n th m t ặ ạ ng trình s ng ng. N u b n ch y ẽ ư ạ ươ ạ ả ị ng trình trong VB6 IDE, b n có d p b o program ng ng ấ ạ ươ ừ ở ạ ể ể ẽ ể ạ ế trong source code ch có Error b ng ằ ỗ ể ị ố ế ế ộ ế ắ ầ ủ ươ ệ ạ ạ ạ ầ Khi EXE c a m t ch ủ Dialog cho bi ch cách b m button đoán nguyên do c a Error. Do đó, n u b n b t đ u cho dùng m t program b n vi ạ ti n thì trong vài tu n đ u, thay gì ch y EXE c a ch IDE. N u có bug nào x y ra, b n có th cho program ng ng trong source code đ debug. Debug trong Error Dialog. Ti p theo đó b n có th tìm hi u tr s các variables đ t trong s , n u ở ế ạ ủ ng trình, b n ch y source code trong VB6 ừ ầ ẩ ể ể ế ạ

ế ể ầ ặ ng trình g p Error, nó s b qua (ignore) hoàn toàn. Đi m n y ti n ươ ủ ươ ạ ớ ị i là khi khách hàng cho hay h g p nh ng tr ế ữ ấ ợ ả ợ ạ c (vì Error b ignored mà không ai đ ý), thì ta cũng bí luôn, có th không bi ể ị , không gi đâu đ ể t b t đ u t ế ắ ầ ừ c khi giao cho khách hàng ư c khi dùng. Khi b n dùng statement: On Error Resume Next ệ ở thì t ch đó tr đi, n u ch ẽ ỏ ở ừ ỗ ng trình EXE c a ta tránh b té cái ch r i bi n m t, r t là "quê" v i khách hàng. ch giúp ch ấ ấ ồ ỗ ng h p l i thích Nh ng nó cũng b t l ườ ọ ặ ư đ ể ượ debug. Do đó, dĩ nhiên trong lúc debug ta không nên dùng nó, nh ng tr ướ b n nên cân nh c k tr ạ ắ ỹ ướ

Dùng Breakpoints

trong code, r i sau đó ta cho program b i ừ Breakpoint đ làm cho program ng ng c. Trong d p n y ta s ầ ị ướ ướ ừ ẽ Cách hay nh t đ theo dõi execution c a program là dùng ủ ể l c t ng b ồ ạ ở ộ xem xét tr s c a nh ng variables đ coi chúng có đúng nh d đ nh không. ấ ể m t ch ta mu n ố ở ỗ ữ ị ố ủ ư ự ị ể

ợ ồ ướ ỗ ộ ọ i đây: B n đoán tr ẽ ạ c a hàng code, ch d u ch m tròn đ nh trong hình d ấ ủ c execution s đi qua ch nào trong code, ch n m t ch thích h p r i click bên trái ướ ỗ ỏ ư ỗ ấ

ạ ế ỏ ộ ầ ữ ể ặ ấ ộ ằ ồ ấ F9. N u b n b m F9 l n n a khi cursor n m ủ ỏ ạ ế ầ ữ ể ấ N u b n click lên d u ch m tròn đ m t l n n a thì là h y b nó. M t cách khác đ đ t m t ộ ấ breakpoint là đ editor cursor lên hàng code r i b m trên hàng đó thì là h y b break point. ủ ỏ

i, b n có th xem tr s c a m t variable b ng cách đ cursor lên trên ể ạ ạ ể ằ ộ Lúc program đang d ng l variable y, tooltip s hiên ra nh trong hình d i đây: ừ ẽ ư ấ ị ố ủ ướ

ạ ể ộ ố ầ ạ ấ ấ ỏ ệ c lên m t hay nhi u hàng code đ nó s execute tr l ộ ượ ẽ ề ạ ể ắ ở ạ ấ F8. Menu command t ươ ừ ằ ướ ẽ ố Debug ng đ c vào bên trong m t Sub/Function mà mu n ố ng h p đó, b n dùng Menu c đ n gi n. Trong tr ạ ợ ả ườ ệ ộ Có m t s chuy n khác b n có th làm trong lúc n y. B n có th n m d u ch m tròn đ kéo i vài hàng code. B n cho (drag) nó ng ể program execute t ng hàng code b ng cách b m ng v i nó là ươ ớ | Step Into. S có lúc b n không mu n program b ộ ạ vi c execute m t Sub/Function nh m t b ư ộ ướ ơ command Debug | Step Over hay Shift-F8.

i b n b m ng v i Menu command Run | Continue. ng đ ớ ạ ạ ạ ươ ươ ớ ể ạ ấ F5, t ộ ớ đó r i c b m F5 nhi u l n thì h i b t ti n. Có m t mánh l i là dùng ừ ở ữ ồ ứ ấ ề ầ ể ẵ ở ế gi a m t For Loop khi Iterator value có m t tr s khá l n. N u Beep ộ ị ố ộ breakpoint t ớ i statement ơ ấ ệ ừ ở ể ử ạ ộ Nh là đ cho program ch y l Có khi b n mu n program ng ng ố ta đ s n m t breakpoint ộ m t IF statement đ th khi Iterator value có tr s y thì ta ng ng ị ố ấ (thay gì statement Print ICounter) nh trong hình d i đây: ướ ư

Debug | Clear All Breakpoints. ạ ố ủ ỏ ọ ệ ể ệ ể ạ Debug Toolbar b ng cách hi n th nó v i Menu command ể ớ ị Mu n h y b m i breakpoints b n dùng Menu command Đ ti n vi c debug, b n có th dùng ằ View | Toolbars | Debug

VB6 IDE s hi n th Debug Toolbar nh sau: ẽ ể ư ị

Dùng Immediate Window

ữ ừ ạ ể ể ộ ị i. i. Ta Immediate Window cho phép ta execute nh ng VB statement strong khi program đang d ng l có th dùng m t Print statement đ hi n th tr s c a m t variable hay k t qu c a m t Function, ị ố ủ g i m t Sub hay thay đ i tr s m t variable tr ướ ọ ộ c khi ti p t c cho ch ế ụ ộ ế ả ủ ng trình ch y l ạ ạ ổ ị ố ộ ể ộ ươ

Đ hi n th Immediate Window, dùng Menu command View | Immediate Window. ể ể ị

ể ớ c executed ngay khi b n b m ạ "? ICounter". Nh là m i VB Statement b n ạ ỗ ạ ấ i b t ấ Enter. B n có th dùng l ạ ể cu i hàng y. Thay vì đánh "Print ICounter" b n cũng có th đánh ạ đánh trong Immediate Window s đ ẽ ượ c VB statement nào trong Immediate Window, ch c n b m Enter ứ ỉ ầ ấ ở ố ấ

Theo d u chân ch ng trình (Tracing) ấ ươ

ể ừ ư ệ ế ạ ẫ ố i đây: Đôi khi không ti n đ ng ng program nh ng b n v n mu n bi Sub. B n có th đ gi a code c a m t Sub/Function m t statement gi ng nh d ủ t program đang làm gì trong m t ộ ư ướ ể ể ữ ạ ố ộ ộ

ị Debug.Print Format ( Now,"hh:mm:ss ") & "(Sub ProcessInput) Current Status:" & Status để program hi n th trong Immediate Window value c a Status khi nó execute bên trong Sub ủ ể ProcessInput lúc m y gi . ờ ấ

Log) vào ộ ạ Có m t cách khác là thay vì cho hi n th trong Immediate Window b n cho vi ị trong m t text file. D i đây là m t Sub đi n hình b n có th dùng đ Log m t Event message: t xu ng ( ế ố ộ ể ộ ướ ể ể ể ạ ộ

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

Dùng Watch Window

ố ạ ừ ư ộ m t ch nào nh t đ nh, nh ng khi tr s c a m t nhiên ủ ả ở ộ ể t t ế ạ ộ ộ ộ ị ố ư ậ ỗ ạ ụ ạ ị ố ủ i sao m t variable t ự i khi ủ ạ . Thí d b n mu n program ng ng l ạ ừ ị ẽ ể ể ạ Debug | Add Watch. VB6 IDE s hi n th dialog ICounter = 15 vào textbox Expression và click option box Break When Value i đây. B n đánh ạ ư ậ ừ ố Đôi khi b n mu n program ng ng không ph i ấ ị variable hay c a m t expression là bao nhiêu, có th là b n không bi có m t tr s nh v y. Câu h i: ỏ Ai là th ph m? ố ICounter = 15. B n có th dùng Menu command d ướ Is True trong h p ộ Watch Type. Làm nh v y có nghĩa là ta mu n program ng ng khi ICounter b ng 15. ằ

Dùng Ph ng Pháp Tri t Khai (Elimination Method) ươ ệ

ấ ươ ờ ể ữ Elimination Method. N u bug bi n m t thì nh ng hàng ế ấ ằ c comment out là th ph m. B n có th Comment Out m t s hàng cùng m t lúc b ng ụ c g i là ượ ọ ủ ạ ế ộ ố ữ ộ ể ạ Có m t ph ng pháp r t thông d ng khi debug là Comment Out nh ng hàng code nghi ng đ xem ộ bug có bi n m t không. Nó đ ế ấ code đã đ ượ cách highlight các hàng y r i click Comment Block trên Edit ToolBar. ấ ồ

ế ị ủ ạ ả ạ ng pháp khá nguy hi m. Khi dùng Elimination Method b n ph i cân nh c Logic c a code b n trong khi quy t đ nh Comment Out nh ng hàng nào, n u không, đó là m t ph ế ắ ươ ữ ể ộ

ạ t kê th b c các Sub g i l n l t kê cho b n tr s c a t ị ố ủ ấ ả t t t c variables trong ngoài vào trong cho ệ ọ ầ ượ ừ ệ ứ ậ Ngoài ra, Menu Command View | Locals Window li m t Sub/Function và ộ đ n v trí code đang ng ng hi n th i. ế View | Call Stack li ệ ừ ờ ị