Khóa Hàm Thụ Visual Basic 6.0 Chương Chín - Debug Bugs lỗi lầm program mà ta phát chạy Debug công việc loại tất lỗi lầm chương trình để chạy êm xuôi hoàn cảnh.Thông thường muốn fix bug trước hết ta phải tìm hiểu lý khiến xuất Một biết duyên cớ ta nghĩ cách giải Nói chung, có hai loại bugs: Hoặc program không làm chuyện cần phải làm programmer hiểu lầm Specifications hay cho tin tức sai lạc, program bỏ sót chi tiết cần phải có Trường hợp nầy ta giải cách giảm thiểu hiểu lầm qua nâng cấp khả truyền thông Program không thực ý programmer muốn Tức programmer muốn đàng mà bảo chương trình làm ngã vô tình không viết lập trình cách Trường hợp nầy ta giải cách dùng Software Tools (kể ngôn ngữ lập trình) thích hợp, có trình làm việc có hệ thống Trong hãng xe người ta dùng từ Quality Control để nói đến việc chế xe lỗi lầm Để đạt mục tiêu ấy, cần có người kiểm phẩm mà nhân viên lấp ráp thận trọng để công việc người kiểm phẩm xác nhận kết tốt tìm lỗi lầm.Có nhiều yếu tố ảnh hưởng đến chất lượng program chức program, cấu trúc phận, kỹ thuật lập trình phương pháp debug Debug không hẳn nằm giai đoạn cuối dự án mà tùy thuộc nhiều vào yếu tố kể trước giai đoạn triển khai Chức chương trình (Program Specifications) Dầu program lớn hay nhỏ, trước hết ta phải xác nhận rõ ràng tỉ mỉ cần phải làm gì, người dùng, mạng nào, database lớn bao nhiêu, phải chạy nhanh đến mức v.v Có nhiều chương trình phải bị thay đổi chừng programmers hiểu lầm điều khách hàng muốn Khổ lúc gần giao hàng khám phá có nhiều điểm chương trình khách muốn đàng mà ta làm ngã Do liên hệ với khách hàng ta cần phải hỏi đi, hỏi lại, phản hồi với khách hàng nhiều lần điều ta hiểu thư từ, tài liệu, để khách xác nhận ta biết ý họ trước xúc tiến việc thiết kế chương trình Nếu sau nầy khách đổi ý, quyền họ, họ phải trả tiền thay đổi (variation) Cấu trúc phận Program có kiến trúc tương tự nhà Mỗi phận đơn giản tốt cách ráp phận phải để ta dễ thử Trong thiết kế ta phải biết trước yếu điểm phận nằm đâu để ta chuẩn bị cách thử chúng Ta không tin phận hoàn hảo thử nó, dù đơn sơ đến đâu.Nếu ta muốn dùng kỹ thuật hoàn cảnh mà ta chạy không nên thử riêng rẽ trước Phương pháp gọi Prototype Ngoài ra, ta nên kế hoạch cho trường hợp bất ngờ, điển hình bad data - user bấm lung tung hay database chứa rác rến Nếu chương trình chạy real-time (tức data thu nhập qua Serial Comm Port, Data Acquisition Card hay mạng), bạn cần phải lưu ý trường hợp khác tùy theo việc xẩy trước, việc xẩy sau Lúc Logic chương trình tùy thuộc vào trạng thái (State) data Tốt nghĩ đến Scenarios (diễn tiến hoàn cảnh) để thử giai đoạn tình huống.Ngày với kỹ thuật Đối Tượng, giai đoạn thiết kế nầy lúc định Data Structures (tables, records v.v.) số Forms với Classes Nhớ Class gồm có Data Structure Subs/Functions/Properties làm việc (operate) data Data structure phải chứa đầy đủ chi tiết (data fields, variables) ta cần Kế cách chương trình process data Subs/Functions cho bên gọi ta cho Public, Subs/Functions khác hữu để phục vụ bên class ta cho Private Kỹ thuật lập trình Căn programmers thói quen họ quan trọng Nói chung, người hấp tấp, nhảy vào viết chương trình trước suy nghĩ hay cân nhắc chắn sau nầy bugs lòi khắp nơi chuyện tự nhiên Dùng Subs Functions Nếu giai đoạn thiết kế kiến trúc chương trình ta chia Class, lập trình ta lại thiết kế chi tiết Subs, Functions v.v , thứ cần phải thử Nếu ta chia công việc giai đoạn giai đoạn mà call đến Sub Thứ cần phải tính hay lấy từ nơi khác thực Function Thí dụ công việc tiệm giặt ủi gồm có bước sau: Nhận hàng Phân chia loại Tẩy Giặt Ủi Vô bao Tính tiền Giao hàng Trong bước 1,2,6 Subs Còn bước 3,4,5 Functions, thí dụ ta giao cho Function Giặt áo dơ ta lấy lại áo sạch.Nhớ điểm khác biệt Sub Function Function cho ta kết mà không làm thay đổi parameters ta đưa cho Trong đó, dầu Sub không cho ta cách rõ ràng thay đổi trị số (value) parameters ta pass cho ByRef Nhắc lại ta pass parameter ByVal cho Sub giống ta đưa copy (bản sao) variable cho Sub, Sub sữa đổi nó bị bỏ qua, không ảnh hưởng đến original (bản chính) variable.Ngược lại ta pass parameter ByRef cho Sub giống ta đưa variable cho Sub để sữa đổi vậy.Do để tránh trường hợp vô tình làm cho trị số variable bị thay đổi ta dùng Sub/Function bạn nên dùng ByVal pass parameter vào Sub/Function.Thật ra, bạn dùng ByRef cho parameter pass vào Function Trong trường hợp dĩ nhiên variable bị sữa đổi Điều nầy gọi phản ứng phụ (side effect), bình thường làm Do đó, bạn thật muốn vượt qui ước thông thường nên Comment rõ ràng để cảnh cáo người đọc chương trình bạn sau nầy.Ngoài ra, programmer thường có Source Code Library Subs/Functions ưng ý Bạn nên dùng Subs/Functions Library bạn nhiều tốt, chúng thử nghiệm Đừng sợ Error Mỗi chương trình có Error, Compilation Error (vì ta viết code không văn phạm, ngữ vựng), Error chạy chương trình, bạn không nên sợ Hãy bình tĩnh đọc Error Message để xem muốn nói Nếu không hiểu đọc đọc lại vài lần suy nghiệm xem có tìm mách nước không Nghề programming gặp Errors ă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) Lúc viết code nhớ thêm Comment đầy đủ để trở lại đọc đoạn code tương lai bạn không cần phải dựa vào tài liệu khác mà hiểu mục đích Sub/Function hay đoạn code.Như không thiết bạn phải viết nhiều Comment có điểm khác thường, bí hiểm bạn cần thông báo giải thích bạn làm cách Có thể sau nầy ta khám phá đoạn code có bugs; lúc đọc lại ta thấy dầu ý định thiết kế cách lập trình có phần thiếu soát chẳng hạn.Tính trung bình programmer làm việc 18 tháng chỗ Tức là, gần chắn code bạn viết người khác đọc bảo trì ( debug thêm bớt) Do đó, code phải đơn giản, dễ hiểu tốt Đừng lo ngại chương trình chạy chậm hay chiếm nhiều nhớ, ngày computer chạy nhanh nhớ rẻ Khi ta thật cần phải quan tâm vận tốc nhớ điều cần thiết kế cẩn thận dựa vào tiểu xảo lập trình Đặt tên variables có ý nghĩa Khổ làm việc với variables có tên vắn tắt K, L, AA, XY Ta chút ý niệm chúng ai, hữu để làm Thay vào đó, ta đặt tên variables NumberOfItems, PricePerUnit, Discount v.v dễ hiểu hơn.Một bugs khó thấy ta dùng tên cho local variable (variable declared Sub/Function) global variable (variable declared Form hay Basic Module) Local variable che đậy global variable tên, nên bạn muốn nói đến global variable hoàn cảnh bạn dùng lầm local variable Dùng Option Explicit Bạn nên trung tín dùng Option Explicit đầu Form, Class hay Module Nếu có variable đánh vần trật VB6 IDE cho bạn biết Nếu bạn không dùng Option Explicit, variable đánh vần trật xem variable với giá trị hay "" (empty string).Nói chung bạn nên thận trọng assign data type cho variable với data type khác Bạn phải biết rõ bạn làm để khỏi bị phản ứng phụ (side effect) Desk Check Kiểm lại code trước compile Khi ta compile code, error có nghĩa Syntax code đúng, nghĩa logic Do ta cần phải biết code ta viết làm điều ta muốn cách đọc lại code trước compile lần Công việc nầy gọi Desk Check (Kiểm bàn) Một chương trình Desk Checked kỹ cần debug chứa bugs không ngờ trước Lý scenarios tiên liệu chu đáo Soạn Test Plan Test Plan liệt kê tất ta muốn thử cách thử chúng Khi thử theo Test Plan ta khám phá bug tìm cách loại chúng Hồ sơ ghi lại lịch sử Test Plan (trục trặc xẩy ra, bạn dùng biện pháp để giải quyết) bổ ích nhiều phương diện Ta học từ kinh nghiệm Debug biết rõ thứ dự án thử theo cách Xử lý Error lúc Run time Khi EXE chương trình viết VB6 chạy, gặp Error, hiển thị Error Dialog cho biết lý vắn tắc Sau bạn click OK, chương trình ngưng Nếu bạn chạy chương trình VB6 IDE, bạn có dịp bảo program ngừng source code chỗ có Error cách bấm button Debug Error Dialog Tiếp theo bạn tìm hiểu trị số variables để đoán nguyên Error Do đó, bạn bắt đầu cho dùng program bạn viết sở, tiện vài tuần đầu, thay chạy EXE chương trình, bạn chạy source code VB6 IDE Nếu có bug xẩy ra, bạn cho program ngừng source code để debug.Khi bạn dùng statement: On Error Resume Nextthì từ chỗ trở đi, chương trình gặp Error, bỏ qua (ignore) hoàn toàn Điểm nầy tiện chỗ giúp chương trình EXE ta tránh bị té ạch biến mất, "quê" với khách hàng Nhưng bất lợi khách hàng cho hay họ gặp trường hợp lạ, không giải thích (vì Error bị ignored mà không để ý), ta bí luôn, không để debug Do đó, dĩ nhiên lúc debug ta không nên dùng nó, trước giao cho khách hàng bạn nên cân nhắc kỹ trước dùng Dùng Breakpoints Cách hay để theo dõi execution program dùng Breakpoint để làm cho program ngừng lại chỗ ta muốn code, sau ta cho program bước bước Trong dịp nầy ta xem xét trị số variables để coi chúng có dự định không.Bạn đoán trước execution qua chỗ code, chọn chỗ thích hợp click bên trái hàng code, chỗ dấu chấm tròn đỏ hình đây: Nếu bạn click lên dấu chấm tròn đỏ lần hủy bỏ Một cách khác để đặt breakpoint để editor cursor lên hàng code bấm F9 Nếu bạn bấm F9 lần cursor nằm hàng hủy bỏ break point.Lúc program dừng lại, bạn xem trị số variable cách để cursor lên variable ấy, tooltip hiên hình đây: Có số chuyện khác bạn làm lúc nầy Bạn nắm dấu chấm tròn đỏ kéo (drag) ngược lên hay nhiều hàng code để execute trở lại vài hàng code Bạn cho program execute hàng code cách bấm F8 Menu command tương đương với Debug | Step Into Sẽ có lúc bạn không muốn program bước vào bên Sub/Function mà muốn việc execute Sub/Function bước đơn giản Trong trường hợp đó, bạn dùng Menu command Debug | Step Over hay Shift-F8 Nhớ program chạy lại bạn bấm F5, tương đương với Menu command Run | Continue.Có bạn muốn program ngừng For Loop Iterator value có trị số lớn Nếu ta để sẵn breakpoint bấm F5 nhiều lần bất tiện Có mánh lới dùng IF statement để thử Iterator value có trị số ta ngừng breakpoint statement Beep (thay statement Print ICounter) hình đây: Muốn hủy bỏ breakpoints bạn dùng Menu command Debug | Clear All Breakpoints.Để tiện việc debug, bạn dùng Debug Toolbar cách hiển thị với Menu command View | Toolbars | Debug VB6 IDE hiển thị Debug Toolbar sau: Dùng Immediate Window Immediate Window cho phép ta execute VB statement strong program dừng lại Ta dùng Print statement để hiển thị trị số variable hay kết Function, gọi Sub hay thay đổi trị số variable trước tiếp tục cho chương trình chạy lại.Để hiển thị Immediate Window, dùng Menu command View | Immediate Window Thay đánh "Print ICounter" bạn đánh "? ICounter" Nhớ VB Statement bạn đánh Immediate Window executed bạn bấm Enter Bạn dùng lại VB statement Immediate Window, cần bấm Enter cuối hàng Theo dấu chân chương trình (Tracing) Đôi không tiện để ngừng program bạn muốn biết program làm Sub Bạn để code Sub/Function statement giống đây:Debug.Print Format ( Now,"hh:mm:ss ") & "(Sub ProcessInput) Current Status:" & Status để program hiển thị Immediate Window value Status execute bên Sub ProcessInput lúc giờ.Có cách khác thay cho hiển thị Immediate Window bạn cho viết xuống (Log) vào text file Dưới Sub điển hình bạn dùng để Log Event message: Sub LogEvent(ByVal GivenFileName, ByVal Msg As String, HasFolder Boolean, IncludeTimeDate As Integer) ' Append event message Msg to a text Logfile GivenFileName ' If GivenFileName is fullPathName then HasFolder is true As ' IncludeTimeDate = : No Time or Date ' = : Prefix with Time ' = : 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 ' No Time or Date Print #FileNo, Msg Case ' Time only Print #FileNo, Format(Now, "hh:nn:ss ") & Msg Case ' Date & Time Print #FileNo, Format(Now, "dd/mm/yyyy hh:nn:ss ") & Msg End Select Close FileNo End Sub Dùng Watch Window Đôi bạn muốn program ngừng chỗ định, trị số variable hay expression bao nhiêu, bạn variable tự nhiên có trị số Câu hỏi: Ai thủ phạm? Thí dụ bạn muốn program ngừng lại ICounter = 15 Bạn dùng Menu command Debug | Add Watch VB6 IDE hiển thị dialog Bạn đánh ICounter = 15 vào textbox Expression click option box Break When Value Is True hộp Watch Type Làm có nghĩa ta muốn program ngừng ICounter 15 Dùng Phương Pháp Triệt Khai (Elimination Method) Có phương pháp thông dụng debug Comment Out hàng code nghi ngờ để xem bug có biến không Nó gọi Elimination Method Nếu bug biến hàng code comment out thủ phạm Bạn Comment Out số hàng lúc cách highlight hàng click Comment Block Edit ToolBar Khi dùng Elimination Method bạn phải cân nhắc Logic code bạn định Comment Out hàng nào, không, phương pháp nguy hiểm.Ngoài ra, Menu Command View | Locals Window liệt kê cho bạn trị số tất variables Sub/Function View | Call Stack liệt kê thứ bậc Sub gọi từ vào vị trí code ngừng thời Các liên mạng VB khác Những câu hỏi Visual Basic Những mẹo vặt Visual Basic Lập trình với VBA Được cung cấp từ Vivosoft ... Error lúc Run time Khi EXE chương trình viết VB6 chạy, gặp Error, hiển thị Error Dialog cho biết lý vắn tắc Sau bạn click OK, chương trình ngưng Nếu bạn chạy chương trình VB6 IDE, bạn có dịp bảo program... bậc Sub gọi từ vào vị trí code ngừng thời Các liên mạng VB khác Những câu hỏi Visual Basic Những mẹo vặt Visual Basic Lập trình với VBA Được cung cấp từ Vivosoft ... thay chạy EXE chương trình, bạn chạy source code VB6 IDE Nếu có bug xẩy ra, bạn cho program ngừng source code để debug.Khi bạn dùng statement: On Error Resume Nextthì từ chỗ trở đi, chương trình