Dùng Visual Studio để phát hiện memory leak

Bài trước mình đã bàn sơ qua về vấn đề memory leak trong lập trình, nhất là C++. Lần này, mình sẽ giới thiệu một cách để debug memory leak rất hiệu quả bằng
Performance Profiler của Visual Studio, cụ thể là debug Semantic Leak

Ở bài viết này tôi dùng Visual Studio Community 2019 để debug. Chúng ta có một ví dụ đơn giản để debug như sau:

Giải thích chương trình

Hàm doingSomething(), nexSteps() đơn giản giả lập chương trình cần sử lý một thứ gì đó, tôi ví dụ nó sẽ xử lý hết khoảng vài giây, để tiện cho việc debug (nếu không thì chương trình sẽ thoát ngay lập tức và ta rất khó để debug).

Chương trình trên có một biến là buffer với kiểu vector<string> dùng để lưu trữ dữ liệu cần thiết cho một việc gì đó. Tôi giả sử lúc chạy buffer sẽ liên tục được lưu vô và khoảng 1.000.000 phần tử. Sau đó chúng ta sử dụng buffer đó, tuy nhiên vì một số lý do nào đó lại quên xóa phần tử đó đi => Semantic Leak xảy ra ở đây.

Các bước debug memory leak với Visual Studio

Tạo project mới với VS, chọn mode Debug

Chọn Debug -> Perfomace profiler

Cửa sổ Perfomance profiler hiện ra, đây là một tool dùng để debug rất mạnh của VS, nó có dùng để debug CPU, GPU, Memory Usage, etc. Ở đây vì muốn debug memory nên mình sẽ chọn Memory Usage, sau đó nhấn Start

Sau khi bấm Start chúng ta sẽ thấy một đồ thị hiện ra, thể hiện mức độ sử dụng memory của chương trình. Chúng ta tiếp tục nhấn vô Take snapshot lần thứ nhất, để làm dấu mốc, đợi chương trình chạy một chút, sau khi thấy memory đã tăng lên (nhìn vô đồ thị), chúng ta tiếp tục nhấp Take snapshot lần thứ hai.

Sau khi nhấn snapshot lần thứ hai, chúng ta phải Stop debug lại để VS bắt đầu tính toán sự khác biệt giữa 2 lần snapshot, bạn sẽ phải chờ một khoảng thời gian, nhanh hay mau sẽ tùy thuộc vô độ lớn và phức tạp của chương trình, hãy kiên nhẫn. Hình bên dưới là sau khi đã bấm Stop.

Ở lần snapshot#2, chúng ta có thể thấy memory đã tăng lên khoảng 50MB và có 700k allocations, click chuột vô +54.31 MB, VS sẽ mở ra một tab mới

Chúng ta click lần lượt vô từng phần tử một để dò từ từ (click vô phần nào có cột Size Diff lớn nhất). Như hình bên trên, sau khi dò xuống dưới, chúng ta sẽ ra được đoạn chương trình sử dụng nhiều memory

KẾT

Perfomance profiler của VS là một tool rất hiệu quả để debug memory, nhất là đối với những chương trình lớn và phức tạp. Chỉ với vài bước đơn giản là bạn đã có thể biết được đoạn code nào tiêu tốn nhiều bộ nhớ, tiết kiệm rất nhiều thời gian. Nếu các bạn có cách nào/tool nào hay nữa có thể comment bên dưới để chia sẻ với mọi người nhé!

Đọc thêm: Quickstart: First look at profiling tools