Phát hiện Memory Leak bằng CRT library: P1

Memory leak có thể coi là một trong những lỗi kinh điển và nhức đầu nhất mà C/C++ developer nào cũng sẽ gặp phải trong quá trình làm việc của mình. Khi làm việc với C/C++ thì bạn không có cách nào để tránh khỏi cái bug quái quỷ này. Chắc hẳn lúc bạn mới học C/C++ hoặc là đang nghiên cứu về chủ đề này, bạn đều thầm nghĩ “Ùi dzồi chỉ cần nhớ delete những chỗ nào đã new là xong chứ gì!? Dễ như ăn kẹo sao ra bug được!? “. Than ôi, cuộc đời này nó mà đơn giản như thế thì chắc developer chỉ cần ngồi mát ăn bát vàng mất.

Trong bài viết này tôi sẽ giới thiệu cho các bạn một thư viện có sẵn của Visual Studio là
C Run-Time (CRT) libraries dùng để debug memory leak. Vì bài viết hơn dài nên tôi quyết định chia bài viết làm 2 phần. Phần một là giới thiệu sơ về các dùng của CRT libraries. Phần 2 là đào sâu vô hơn một số example để cho thấy việc phát hiện memory leak bằng mắt là khó như nào và sự hiệu quả của tool

Kích Hoạt Tính Năng Phát Hiện Memory Leak

Những công cụ cơ bản để phát hiện memory leak chính là debugger và CRT debug heap functions. Trước hết để kích hoạt được tính năng phát hiện leak, chúng ta phải #include một số header (thứ tự include rất quan trọng, bạn phải include theo đúng thứ tự bên dưới thì debugger mới hoạt động đúng)

Bạn có thể nhúng đoạn code trên vô file .cpp chứa hàm main hoặc tạo 1 file header, sau đó include vô file .cpp nào mà bạn muốn debug. Lưu ý rằng để debug output hiển thị đầy đủ thông tin, bạn phải build và chạy chương trình với mode DEBUG.

Thêm một điểm lưu ý nữa là libraries này chỉ hoạt động với CRT malloc function, nếu bạn muốn debug chương trình viết bằng C++ với hàm new thì bạn phải redefine lại

Sau khi thêm header và redefine lại hàm new (nếu cần), chúng ta phải thêm đoạn code sau, trước khi chương trình exit để nó in ra output cho bạn

Nếu chương trình của bạn có nhiều chỗ exit hoặc bạn không biết phải thêm _CrtDumpMemoryLeaks() ở chỗ nào thì chỉ cần set đoạn code dưới đây ở đầu chương trình, nó sẽ in ra output cho bạn mỗi khi chương trình exit

Có thể bạn vẫn còn hơi mơ hồ về việc debugger bằng cách này, chúng ta hãy cùng xem một ví dụ cụ thể dưới đây để dễ hình dung hơn.

Ex#1: Debugging với một chương trình đơn giản

Trước hết chúng ta hãy thực hành với một chương trình siêu đơn giản trước để bạn có thể hình dung việc nhúng những đoạn code ở trên vô ở đâu cũng như cách chúng hoạt động với nhau như thế nào. Chúng ta có đoạn chương trình như bên dưới

Ở đây chúng ta có một chương trình đơn giản, tôi khởi tạo với new nhưng không delete dẫn đến leak. Bây giờ tôi sẽ thêm những đoạn code đã nói ở trên và thử run chương trình coi output in ra thế nào

Chạy thử chương trình trên với Visual Studio, và dưới đây là kết quả

Các bạn thấy đấy, khi chương trình chạy xong, nó sẽ output ra đúng file nào + vị trí code gây ra memory leak.

Xem thêm

Finding Memory Leaks Using the CRT Library