k, kb, kp)
#include <stdio.h>
int SumToOne(int d, int sum) {
sum += d;
if (d != 1) sum = SumToOne(d-1, sum);
else sum = sum; // 斷點設置處
return sum;
}
void main() {
int sum = SumToOne(10, 0);
printf("sum=%d", sum);
}
在 sum = sum; 處下斷點,調用棧深度 11 幀 (main + 10 次遞歸)。
.printf "Dump %d frames\n", ${$arg1}
r $t1 = @ebp; // 初始化幀指針
.for (r $t0 = 1; $t0 <= ${$arg1}; r $t0 = $t0 + 1) {
.printf "frame %d, d=%d sum=%d\n", $t0, poi($t1+8), poi($t1+0xC);
r $t1 = poi($t1); // 移動到上一幀 ebp
}
0:000> $$>a< "DumpStack.txt" a
Dump 10 frames
frame 1, d=10 sum=10
frame 2, d=9 sum=19
frame 3, d=8 sum=27
...
frame 10, d=1 sum=55
| 語法 | 含義 |
|---|---|
$$>a< "file" args | 帶參數執行腳本文件 (a 表示傳參) |
${$arg1} | 引用第 1 個傳入參數 (十六進制,a=10) |
r $t1 = expr | 賦值給偽寄存器/別名 (類比 C 宏) |
poi(addr) | 解引用內存地址 (等價 C *addr),MASM 語法 |
.for (init; cond; step) { } | 循環控制結構 |
.printf "fmt", args | 格式化輸出 |
@ebp 指向當前幀基址ebp+8 = 第 1 參數 d,ebp+0xC = 第 2 參數 sum[ebp] 保存調用者 ebp,poi(@ebp) 即上一幀基址arg1 次,逐幀輸出參數poi($t1+4) 獲取 eip,配合 ln 顯示函數名.if/@$csp 實現條件斷點自動導出棧狀態掌握 DScript,可將重複性調試任務自動化,構建專屬診斷工具庫,大幅提升疑難崩潰分析效率。