Visual Studio 的 Memory 視窗 是檢視任意記憶體位址內容的利器,補足 Watch 視窗只能觀察固定變數的限制。本文詳細說明 Memory 視窗的開啟方式、顯示模式、位址輸入技巧與實戰除錯場景。
Debug → Windows → Memory → Memory 1/2/3/4Alt + 6 (Memory 1)
┌─────────────────────────────────────────────────────┐
│ Address: 0x0012FF44 ▼ │ Display: 1-byte Hex ▼ │
├─────────────────────────────────────────────────────┤
│ 0x0012FF44: 7B 00 00 00 44 00 00 00 01 00 00 00 │ { . . . D . . . . . . .
│ 0x0012FF54: 00 00 00 00 00 00 00 00 00 00 00 00 │ . . . . . . . . . . . .
├─────────────────────────────────────────────────────┤
│ Column: 16 │ Format: Hex / Decimal / Float / ASCII │
└─────────────────────────────────────────────────────┘
&var、ptr+4、0x12345678)在 Watch 視窗右鍵變數 → Copy Address → 貼上 Memory Address 欄,或直接拖曳變數到 Memory 視窗,即可檢視該變數及其周圍記憶體佈局。
struct Node { int id; Node* next; char name[16]; };
Node nodes[3] = { {1, &nodes[1], "First"}, {2, &nodes[2], "Second"}, {3, nullptr, "Third"} };
在 Memory 視窗輸入 &nodes[0],以 4-byte Hex 檢視:
0x0012FF00: 01 00 00 00 10 FF 12 00 46 69 72 73 74 00 00 00 │ id=1, ptr=0x0012FF10, "First" 0x0012FF10: 02 00 00 00 20 FF 12 00 53 65 63 6F 6E 64 00 00 │ id=2, ptr=0x0012FF20, "Second" 0x0012FF20: 03 00 00 00 00 00 00 00 54 68 69 72 64 00 00 00 │ id=3, ptr=null, "Third"
觀察關鍵資料結構前後的「金絲雀值」或邊界標記:
char buffer[100];
uint32_t guard1 = 0xDEADBEEF;
char buffer[100];
uint32_t guard2 = 0xFEEDFACE;
在 Memory 視窗監控 &guard1、&guard2,若數值變更即表示緩衝區溢位。
接收 recvbuf 後,在 Memory 視窗輸入 recvbuf,切換 1-byte Hex 對照協定定義逐位元組解析:
0x0012F000: FF FF FF FF 00 00 00 2A 01 02 03 04 ...
│ 同步頭 │ 長度=42 │ 版本=1 │ ...
&localVar 觀察堆疊框架mallocPtr 或 newPtr 觀察堆積區塊*(void**)objPtr 查看 vtable 位址| 模式 | 適用場景 |
|---|---|
| 1-byte Hex | 位元組流、字串、原始緩衝區 |
| 4-byte Hex | int、指標、handle、RVA |
| 8-byte Hex | int64、double、指標 |
| Float/Double | 科學計算、座標、矩陣 |
| Instruction | 反組譯、Shellcode 分析、JIT 程式碼 |
void BuggyFunc(char* dst, const char* src) {
strcpy(dst, src); // 忘記檢查 dst 大小
}
int main() {
char smallBuf[8];
BuggyFunc(smallBuf, "This string is too long!");
return 0;
}
Memory 視窗診斷:
strcpy 後&smallBufsmallBuf 後方變數被覆寫,甚至破壞堆疊框架的 EBP/回傳位址Memory 視窗是「記憶體級 X 光機」,能看見 Watch 視窗看不見的:記憶體佈局、緩衝區邊界、堆疊框架、原始位元組流。熟練掌握 Address 運算式輸入、Display 模式切換、拖曳變數 三大核心技巧,將大幅提升 C/C++ 底層除錯效率。