-
10-11-2008, 07:08 PM #1Junior Member
- Ngày tham gia
- Sep 2015
- Bài viết
- 0
Nghệ thuật Traps Code trong Visual C++
I. MỞ ĐẦU
Traps Code là gì vậy? Nói nôn na đó là 1 kỹ thuật Debug bằng cách đặt bẫy trên những đoạn code.
Dĩ nhiên bất kỳ ai trong chúng ta học lập trình cũng đều biết Debug. Nhưng có bao giờ bạn rơi vào trường hợp phải khóc vì Debug chưa? Ví dụ như là Debug trong MultiThread hay trong Đệ Quy chẳn hạn.
Thậm chí có lúc bạn phải lập trình mà ko cần Debug. Ví dụ như lập trình PHP chẳn hạn. Các trình dịch GCC thì Debug lại khó khăn hơn VC++ rất nhiều.
Do đó hầu như trình biên dịch nào cũng hộ trợ một số function giúp bạn làm việc này tốt hơn.
Mình sẽ mở đầu đề tài này bằng 1 đoạn code tương đối kỳ cục như sau:
Mã:int _tmain(int argc, _TCHAR* argv[]){ { int i = 100; printf("%d ",i); } { int i = 100; printf("%d ",i); } return 0;}
Trình biên dịch hỗ trợ điều này để giúp ta viết MACRO. Ta sẽ viết đoạn code trên bằng macro DUMP như sau:
Mã:#define DUMP() \ {\ int i = 100;\ printf("%d ",i);\ } int _tmain(int argc, _TCHAR* argv[]){ DUMP(); DUMP(); DUMP(); return 0;}
Tiếp tục 1 lần nữa nhé:
Mã:#define DUMP_INT(VAL) {printf("%s = %d ",#VAL,VAL);} int _tmain(int argc, _TCHAR* argv[]){ int a = 100; int b = 200; int c = 300; DUMP_INT(a); DUMP_INT(b); DUMP_INT(c); return 0;}
Gửi bởi Kết quả output:
Mình sẽ tiếp tục bài viết này sau...View more random threads:
- HOOK và những gì liên quan đến DLL
- Sử dụng SEH để bắt lỗi hệ thống
- Screen Reader Visual C++ | Đọc nội dung trên màn hình viết bằng VC++
- Chỗ Cài Phần Mềm Cad Tận Nơi Chuyên Nghiệp Q 6
- Tìm hiểu về từ khóa const - const với nhiều ý nghĩa
- Mix code giữa .NET và WINAPI
- Detect Windows Vista/7 bằng sử dụng GetVersionEx API
- Ở Đâu Sửa Laptop Tại Chỗ Q 5 Chất Lượng
- [API] WM_QUIT, WM_CLOSE và WM_DESTROY
- Hỏi về hướng lập trình c++
-
11-11-2008, 06:07 PM #2Junior Member
- Ngày tham gia
- Sep 2015
- Bài viết
- 0
II. BUG FILE & LINE CODE
Bây giờ code tiếp 1 đoạn đơn giản thôi:
Mã:int main(){ printf("%s - %d ", __FILE__, __LINE__);}
Gửi bởi Output
__FILE__: Trả về tên code file (.c hay .cpp) đang thực thi hành
__LINE__: Trả về dòng đang thi hành.
Kết quả in ra như vậy vì hàm printf của mình nằm ở dòng thứ 97.
Chúng ta sẽ lợi dùng 2 macro này để hỗ trợ đánh dấu BUG.
-
11-11-2008, 06:29 PM #3Junior Member
- Ngày tham gia
- Sep 2015
- Bài viết
- 0
III. TRACE
Trong các trường hợp trên mình đều in kết quả ra màn hình Console nhưng không hẳn trong mọi chương trình của sổ console luôn xuất hiện.
Chúng ta cũng có thể chọn giải pháp in bug ra file. Và kiểm soát lỗi trên file LOG này.
Tuy nhiên mình sẽ bug ra 1 của sổ tương đối khá đặc biệt. Đó chính là cửa sổ Ouput của trình biên dịch.
Ta sẽ làm quen với hàm: OutputDebugStringA. Hàm này của WINAPI (windows.h). Hầu như mọi trình biên dịch đều hỗ trợ nó.
Mã:#include <windows.h>int main(){ char lpStringDebug[100]; sprintf(lpStringDebug,"MY DEBUG: %s - %d ", __FILE__, __LINE__); OutputDebugStringA(lpStringDebug);}
Output của trình biên dịch là một cửa sổ khá lý tưởng để DEBUG. Tuy nhiên đoạn code Debug trên làm mình mất hết 3 dòng CODE và rất lằng nhằng nữa. Hình sẽ cải tiến nó thành 1 Macro như sau.
Mã:#define ZDEBUG_TRACE(FORMAT,...) \ { \ char debugString[200]; \ sprintf(debugString,FORMAT, __VA_ARGS__); \ OutputDebugStringA(debugString); \ }
Mã:int main(){ ZDEBUG_TRACE("MY DEBUG: %s - %d ", __FILE__, __LINE__);}
-
12-11-2008, 04:56 PM #4Junior Member
- Ngày tham gia
- Sep 2015
- Bài viết
- 0
Uổng công tớ viết phần "mở đầu". Chắc tớ viết khó hiểu quá hả?
Mã:#define PI 3.14 void main(){ printf("%f", PI);}
Macro là một sự thay thế. Nó được trình biên dịch dịch trước khi chương trình bạn chạy.
Bạn có thể hiểu như là 1 cách viết tắt.
Ví dụ ta thường viết tắt là "TP HCM" nhưng khi đọc thì sẽ là "Thành Phố Hồ Chí Minh".
Mình lấy lại ví dụ DUMP ban đầu.
Mã:#define DUMP() \ {\ int i = 100;\ printf("%d ",i);\ } int _tmain(int argc, _TCHAR* argv[]){ DUMP(); DUMP(); DUMP(); return 0;}
Lúc này đoạn code trên thực sự là như thế này:
Mã:int _tmain(int argc, _TCHAR* argv[]){ // DUMP sẽ thay thế thành { int i = 100; printf("%d ",i); } // DUMP sẽ thay thế thành { int i = 100; printf("%d ",i); } // DUMP sẽ thay thế thành { int i = 100; printf("%d ",i); }}
-
12-11-2008, 05:08 PM #5Junior Member
- Ngày tham gia
- Sep 2015
- Bài viết
- 0
Bài viết của anh Z hay quá [IMG]images/smilies/biggrin.png[/IMG]
em thấy lão X code chuyên xài Macro, nhiều cái đọc không tài nào hiểu nổi -_-;;
Tiếp tục kĩ thuật trap đi anh Z. Thêm nữa, nếu anh có thể thì truyền bá kĩ thuật trap trên Linux luôn nhé. Vì linux không có mấy API của Windows
-
12-11-2008, 05:25 PM #6Junior Member
- Ngày tham gia
- Sep 2015
- Bài viết
- 0
Xin cảm ơn bạn!
III. TRACE (tiếp)
Bây giờ mình sẽ hoàn chỉnh hơn lệnh TRACE
Mã:#include <stdio.h>#include <string.h>#include <stdlib.h> // Nếu chạy ở chế độ DEBUG (F5)#ifdef _DEBUG #define ZDEBUG_TRACE(FORMAT,...) \ { \ char debugString[200]; \ sprintf(debugString,FORMAT, __VA_ARGS__); \ OutputDebugStringA(debugString); \ } // Nếu chạy ở mode Release (Ctrl + F5) -> Macro không giá trị!#else #define ZDEBUG_TRACE(FORMAT,...)#endif double giaithua(int k){ ZDEBUG_TRACE("Module: giaithua(%d) ",k); if (k == 1) { ZDEBUG_TRACE("Result Module: giaithua(1) return 1 "); return 1; } double r = k*giaithua(k-1); ZDEBUG_TRACE("Result Module: giaithua(%d) return %f ",k,r); return r;} int _tmain(int argc, _TCHAR* argv[]){ double f = giaithua(10); printf("%f ", f); return 1;}
Kết quả không có gì đặc biệt từ của sổ Console:
3628800.000000
Press any key to continue . . .
Màn hình output này chỉ chạy khi bạn bấm F5 (Còn chạy bằng Ctrl+F5 hay .exe từ file thì sẽ không hiển thị).
Bởi vì mình chỉ định nghĩa Macro ZDEBUG_TRACE chạy ở mode _DEBUG
Hy vọng sẽ giúp cho các bạn một chút kiến thức gì đó.
Còn tiếp... mình sẽ cập nhật sau.
-
12-11-2008, 06:50 PM #7Junior Member
- Ngày tham gia
- Sep 2015
- Bài viết
- 0
Tớ hỏi chút: macro là gì? Viết macro là như thế nào?
-
13-11-2008, 11:35 AM #8Junior Member
- Ngày tham gia
- Sep 2015
- Bài viết
- 0
tại sao tớ chạy mấy chương trình của bạn thì báo lỗi ở cái biến: _TCHAR* nó chưa được định nghĩa! ?
-
13-11-2008, 11:57 AM #9Junior Member
- Ngày tham gia
- Sep 2015
- Bài viết
- 0
Gửi bởi hahonga3
Cho nên nếu cậu chưa vững những điều cơ bản như: hàm nào thuộc thư viện nào, sử dụng các hàm đơn giản thế nào, nhìn vào định nghĩa có thể hiểu cách sử dụng...
thì thread này cậu chưa nên đọc vội
Mã:#include <tchar.h>
-
13-11-2008, 12:01 PM #10Junior Member
- Ngày tham gia
- Sep 2015
- Bài viết
- 0
cảm ơn nhé. Tớ vốn vội vàng. Nhưng nhờ hỏi câu ngớ ngẩn này mà tớ học được một vài điều rồi đó!
Pallet nhựa Lâm Đồng giải pháp hoàn hảo cho nhà kho Pallet nhựa Lâm Đồng là một giải pháp đa năng và hiệu quả trong việc vận chuyển và lưu trữ hàng hóa. Trong đó, pallet nhựa Lâm Đồng không chỉ đáp...
Pallet nhựa Lâm Đồng giải pháp...