我嘗試了解有關 stackpointer、basepointer .. 它是如何作業的 .. 由于大多數教材沒有結合實際示例,我嘗試復制:https ://en.wikibooks.org/wiki/ X86_Disassembly/Functions_and_Stack_Frames
按照我非常簡單的代碼:
#include <stdio.h>
int main()
{
function1(1, 2);
}
int function1(int a, int b)
{
int c = a b;
return c;
}
我使用 WinDbg 執行程式并設定斷點bm CallStackPractice!function1并鍵入g以命中斷點并單p步執行函式。
我們應該得到ebp 8第一個引數。我在 WinDbg 中做到了:
0:000> ? poi(ebp 8)
Evaluate expression: 1 = 00000001
好的。不,我們想要我們的第二個引數應該是ebp 12.
0:000> ? poi(ebp 12)
Evaluate expression: 270729434 = 102300da
我們不明白2 = 00000002。我在 WinDbg 中打開了記憶體視窗,它顯示了正確的值,但為什么我的命令不起作用?
謝謝!
更新:為了更好地理解螢屏截圖:

uj5u.com熱心網友回復:
這是一個常見的錯誤。12意味著0x12默認。
如果您想要一個十進制數 12,請使用或0n12更改默認數字格式0xC(實際上我不知道有人這樣做)。n 10
0:000> ? 12
Evaluate expression: 18 = 00000000`00000012
0:000> n 10
base is 10
0:000> ? 12
Evaluate expression: 12 = 00000000`0000000c
回到16號基地:
1:005:x86> n 16
base is 16
1:005:x86> ? poi(ebp 8)
Evaluate expression: 1 = 00000001
1:005:x86> ? poi(ebp c)
Evaluate expression: 2 = 00000002
如果您遇到奇怪的錯誤,例如
1:005:x86> ?poi(ebp c)
Memory access error at ')'
那是因為你仍然在 10 進制。
您可能還想查看堆疊,dps如下所示:
1:005:x86> dps ebp-c L7
008ff60c cccccccc <-- magic number (4x INT 3 breakpoint)
008ff610 00000003
008ff614 cccccccc
008ff618 008ff6f4
008ff61c 00fb189a DebugESPEBP!main 0x2a [C:\...\DebugESPEBP.cpp @ 13]
008ff620 00000001 <-- a
008ff624 00000002 <-- b
如您所見,dps將給您回傳地址作為帶有行號的符號。您會看到除錯模式下的記憶體布局包含有助于除錯的幻數
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/504944.html
標籤:Intel Collective C 调试 x86 风吧
