gdb除錯

ly1390811049發表於2020-12-27

·程式碼(實驗樓中的程式碼,改了部分數值)命名為test.c

int g(int x)
{
  return x + 7;
}

int f(int x)
{
  return g(x);
}

int main(void)
{
  return f(3) + 5;
}

·在64位的機器上產生32位彙編(使用指令為:gcc - g test.c -o test -m32),然後使用gdb test指令進入gdb偵錯程式,進入後在main這裡設定一個斷點,然後執行:
gdb除錯
·
·使用指令:disassemble獲取彙編程式碼,指令:info registers檢視各暫存器的值:
gdb除錯

gdb除錯

此時主函式的基址為Ox80483d8

·使用指令:display /i $pc,這樣在每次執行下一條彙編語句時,都會顯示出當前執行的語句
gdb除錯

·call指令將下一條指令的地址入棧:
gdb除錯

·將上一個函式的基址入棧,從當前%esp開始作為新基址:
gdb除錯

·為傳參做準備,然後實參入棧:
gdb除錯

·f函式的彙編程式碼:
gdb除錯

·實參入棧,然後call指令將下一條指令的地址入棧:
gdb除錯

·分配棧空間:
gdb除錯

·將%eax與立即數7相加:
gdb除錯

·在結束前彈棧:
gdb除錯

·結束函式並與立即數相加:
gdb除錯

·leave返回棧然後進入main函式:
gdb除錯

·ret結束main函式:
gdb除錯

相關文章