# Hướng dẫn WinDbg: Phân tích Memory Leak qua Memory Dump

Memory leak là một trong những dạng sự cố **âm thầm nhưng tàn phá nhất** trong hệ thống production. Không crash ngay, không log rõ ràng, không stack trace trực tiếp. Chỉ có một dấu hiệu quen thuộc:\
**RAM tăng dần – rồi hệ thống chết vì kiệt tài nguyên.**

Khi đến giai đoạn này, memory dump thường là **bằng chứng cuối cùng** còn sót lại. Và WinDbg chính là công cụ giúp bạn đọc hiểu bằng chứng đó.

<figure><img src="https://raw.githubusercontent.com/nqdev-storage/s3-001/main/gitbook/blogs/cong-nghe/windbg-page4-001.png" alt="" width="563"><figcaption></figcaption></figure>

***

### 1. Hiểu đúng bản chất memory leak trong dump

Trước khi chạy bất kỳ lệnh nào, cần thống nhất một tư duy quan trọng:

> **Memory leak không phải là “chưa free” – mà là “vẫn còn reference”.**

Trong dump, bạn **không tìm “chỗ bị leak”**, mà tìm:

* Ai đang giữ memory
* Vì sao nó không được giải phóng
* Và nó thuộc vòng đời logic nào của hệ thống

Dump cho bạn **trạng thái tĩnh**, còn leak là **câu chuyện xảy ra theo thời gian**. Nhiệm vụ của bạn là suy ngược lại câu chuyện đó.

***

### 2. Bước đầu: xác định kiểu dump và phạm vi phân tích

Không phải dump nào cũng dùng được cho leak analysis.

#### Dump phù hợp:

* Full dump
* User-mode dump có heap
* Crash dump kèm memory snapshot

📌 **Mini dump thường không đủ dữ liệu** để phân tích memory leak nghiêm túc.

***

### 3. Tổng quan bộ nhớ tiến trình

Sau khi load dump và setup symbol:

```
.symfix
.reload
```

Bắt đầu bằng cái nhìn toàn cảnh:

```
!address -summary
```

Lệnh này cho bạn:

* Tổng virtual memory
* Private bytes
* Reserved vs Committed
* Phân bố vùng nhớ bất thường

📌 **Tư duy phân tích**

* Leak thường nằm ở **Private Memory**
* Không phải module nào dùng nhiều RAM nhất cũng là thủ phạm

***

### 4. Phân tích Heap – “kho chứa” leak phổ biến nhất

#### Liệt kê heap

```
!heap
```

Hoặc chi tiết hơn:

```
!heap -s
```

Bạn cần chú ý:

* Heap nào có size tăng bất thường
* Heap có nhiều allocation nhỏ nhưng không giảm

📌 **Dấu hiệu điển hình**

* Một heap chiếm phần lớn memory
* Allocation count cao, nhưng free gần như bằng 0

***

### 5. Tìm allocation lớn và nghi vấn

#### Liệt kê các block lớn trong heap

```
!heap -flt s 100000
```

(Lọc các allocation > 100KB)

Hoặc:

```
!heap -stat
```

Xem thống kê theo size class.

📌 **Chiến lược thực tế**

* Leak thường đến từ **rất nhiều allocation vừa & nhỏ**, không phải một block khổng lồ
* Nhưng block lớn giúp bạn **xác định loại object** nhanh hơn

***

### 6. Truy vết nguồn gốc allocation (Allocation Stack Trace)

Đây là bước quan trọng nhất, nhưng cũng là nơi nhiều người bỏ cuộc.

#### Với heap có stack trace:

```
!heap -p -a ADDRESS
```

Bạn sẽ thấy:

* Call stack tại thời điểm allocation
* Hàm cấp phát
* Module liên quan

📌 **Nếu heap không có stack trace**

* Có thể dump được tạo khi không bật heap tracking
* Đây là **bài học kiến trúc**, không phải lỗi công cụ

***

### 7. Kết nối allocation với logic hệ thống

Đến bước này, WinDbg **không thể làm thay bạn**.

Bạn cần tự hỏi:

* Object này đại diện cho cái gì?
* Vòng đời logic của nó là bao lâu?
* Điều kiện nào khiến nó đáng ra phải được giải phóng?

Ví dụ:

* Request context không được cleanup
* Cache không có eviction
* Observer/event handler không unsubscribe
* Thread-local storage bị giữ quá lâu

📌 **Memory leak hiếm khi là bug “malloc/free”**\
Nó gần như luôn là **bug thiết kế vòng đời**.

***

### 8. So sánh dump theo thời gian (nếu có)

Nếu bạn có nhiều dump ở các thời điểm khác nhau:

* So sánh heap size
* So sánh allocation count
* So sánh loại object tăng dần

Đây là lúc leak **hiện hình rõ ràng nhất**.

***

### 9. Khi nào kết luận “đây là memory leak thật sự”?

Chỉ nên kết luận khi hội đủ:

* Memory tăng theo thời gian
* Allocation không giảm dù workload kết thúc
* Có reference logic hợp lý giữ object
* Không phải cache hợp lệ hoặc warm-up

📌 **Đừng nhầm lẫn**

* Cache ≠ leak
* Pool reuse ≠ leak
* Lazy allocation ≠ leak

***

### Kết luận: Phân tích memory leak là bài toán tư duy, không phải cú pháp

WinDbg cung cấp cho bạn:

* Sự thật về trạng thái bộ nhớ
* Bằng chứng không thể chối cãi

Nhưng **chỉ tư duy hệ thống** mới giúp bạn:

* Kết nối dữ kiện
* Hiểu vòng đời logic
* Và sửa leak tận gốc

Đó cũng là triết lý mà **Cẩm nang NQDEV** và **NQDEV Platform** theo đuổi:

> *Debug không phải để chữa cháy – mà để hiểu hệ thống sâu hơn sau mỗi sự cố.*

👉 Theo dõi thêm các bài phân tích thực chiến tại:\
🔗 [**https://blogs.nhquydev.net/**](https://blogs.nhquydev.net/)
