首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> 關於C++

呼叫堆疊基礎:結構佈局與 WinDbg 實戰觀察 (一)

     編輯:關於C++

呼叫堆疊核心結構與 WinDbg 手動觀察實戰

呼叫堆疊是程式執行時期儲存函數呼叫資訊的動態資料結構,包含返回位址、參數、區域變數、呼叫者框架指標。

堆疊框架佈局 (x86, EBP 基址)


高位址
+----------------+
|  呼叫者參數    |  ← EBP + 8, +C, ...
+----------------+
|  返回位址      |  ← EBP + 4
+----------------+
|  舊 EBP (Caller)| ← EBP, [EBP]
+----------------+
|  區域變數      |  ← EBP - 4, -8, ...
+----------------+
低位址

實戰範例程式

int SumFromOne(int d) {
    int sum = 0xABCD;  // 特徵值方便識別
    if (d == 1) sum = 1;
    else sum = d + SumFromOne(d-1);
    return sum;
}
main() { SumFromOne(10); }

WinDbg 觀察步驟

  1. 編譯:cl /Zi test.c (產生 PDB)
  2. 啟動:windbg test.exe
  3. 下斷點:bp test!SumFromOne+0x... (第 4 行)
  4. 執行:g
  5. 查看 EBP:r ebp
  6. 記憶體視窗:Virtual = EBP-10,格式 Long Hex

記憶體視窗關鍵位置對應

位置內容驗證值
EBP+4返回位址0040106B (呼叫後下一指令)
EBP+8參數 d0x0A (10)
EBP-4區域變數 sum0xABCD (初始值)

核心觀念

  • EBP 鏈:每個框架 [EBP] 指向呼叫者 EBP,形成單向鏈表
  • prologue:push ebp; mov ebp, esp 建立框架
  • epilogue:pop ebp; ret 恢復並返回
  • 區域變數分配在 EBP 負偏移,參數在正偏移

下一篇預告

為什麼這些資料在這些位置?→ 呼叫慣例 定義了壓棧順序、清理責任、暫存器分配規則。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved