Một vài macro hữu dụng trong C

1133

Thấy mọi người đang thảo luận về Macro trong C. Macro có rất nhiều cách sử dụng “ảo diệu”. Nhưng bài này chỉ nói về một số macro hữu dụng cho cho việc thêm log cho code C/C++.

Có bao giờ bạn debug một code C/C++ bằng một loạt các lệnh printf không?

Rồi đến khi fix xong ta lại đi xóa đóng code rác đó vì nếu không xóa đi, khách hàng có thể hỏi :”Dòng đó để làm gì, tại sao lại in ra trị ở đây?”

Có khi nào log của của trình C/C++ nào khiến bạn quá khó để theo dõi vì chúng chẳng được canh lề gì cả. Hoặc có in ra log đấy nhưng quên không in ra thông tin về dòng nào ?

Hoặc bạn đã in quá nhiều log phải tắt một số log đi.

Dưới đây là một số macro dùng cho việc in log, vì cách gọi giống hệt cách gọi các hàm trong C/C++ nên dù có log thì code vẫn không quá khó nhìn.

Link tham khảo:

  1. http://stackoverflow.com/questions/1644868/c-define-macro-for-debug-printing
  2. http://c.learncodethehardway.org/book/ex20.html

Ta sẽ có một file chứa vài macro sẽ nói đến ở đây:

debug_macro.h

Các sử dụng mấy macro trên khá đơn giản, vì hàm trên được khai báo sử dụng với tham số thay đổi được.

Nên ta sử dụng giống hệt với các hàm printf mà ta vẫn biết.

Ví dụ

Môt ví dụ sử dụng

Định viết lại “Hello World” kinh điển nhưng thấy nó cũ quá. Và mình thấy giờ thấy đề bài sau chắc cũng sắp thành kinh điển rồi.

Yêu cầu : Viết chương trình mô tả luồng công việc của một programmer.

Mã giả:

  1. Vận công nghĩ keyword
  2. Tìm kiếm keyword trên google
  3. Xem link 1, xem có code sample không? Nếu có đến step 4, nếu không xem link tiếp theo.
  4. Chạy thử code sample, nếu chạy đúng, thì kết thúc, nếu chạy sai thì trở về step 3 xem link tiếp.
  5. Xem hết link mà không có kết quả, thì quay lại step 1 nghĩ từ khóa khác.

Các file source code cho chương trình trên như sau:

resultLinks.txt

program.c

Build xong và chạy.

Kết quả sau khi thực hiện sẽ như thế này:

Ta thấy log được hiển thị theo các TAG, các thông tin debug cũng được in ra.

Ta có thể dùng các tool view log để phân tích những file log dài một cách dễ dàng hơn. Ví dụ glogg chẳng hạn, ta gán màu cho từng loại TAG (ERROR, DEBUG) thì việc phân tích log sẽ trở nên dễ hiểu hơn.

Tắt việc hiển thị log

Đơn giản ta comment out lại một dòng ở file debug_macro.h, sẽ không có gì hiện ra nữa.

Thêm thông tin vào nội dung log

Log ở trên chứa các thông tin về tên file, hàm, dòng code cũng tương đối đủ để trace lỗi.

Nhưng trong một số trường hợp, nhất là với các ứng dụng nhiều thread chẳng hạn, ta muốn thêm giá trị về thời gian nữa.

Ta có thể tùy biết các macro ở trong file debug_macro.h, có nhiều cách tùy múc đích của việc in log:

Đây là một cách trong đó:

debug_macro.h

Kết quả chạy sẽ như sau:

Trong file mới, thay vì gọi các hàm fprintf thì ta gọi đến một hàm khác là time_printf để in log và có cả thơi gian nữa.

Trên đây là tất cả những gì mình có nhớ được. Mình cũng từng thấy người ta tùy biến việc xuất log theo một số cách khác phức tạp hơn như theo level (cái này giống thư viện log4j, log4net của Apache Team).

Trong một số thiết bị nhúng, nơi mà stdin không phải bàn phím, stdout không phải màn hình.

Khi ấy có thể, người ta phải viết code cho hàm *fprintf để xuất log ra đâu đó như serial chẳng hạn, etc.

Phùng Văn Tú

Techtalk via Kipalog

 

CHIA SẺ