第五周學習總結
輸入的**
使用gcc - g example.c -o example -m32
指令在64位的機器上產生32位彙編
刪除gcc產生**中以"."開頭的編譯器指令,針對每條指令畫出相應棧幀的情況
使用gdb example
指令進入gdb偵錯程式
使用「r」命令執行(run)被除錯檔案,因為尚未設定任何斷點,將直接執行到程式結束:
使用「b」命令在 main 函式開頭設定乙個斷點(breakpoint):
上面最後一行提示已經成功設定斷點,並給出了該斷點資訊:在原始檔 test.c 第13行處設定斷點;這是本程式的第乙個斷點(序號為1);斷點處的**位址為 0x80483f9(此值可能僅在本次除錯過程中有效)。回過頭去看源**,第13行中的**為「return f(8)+1」,恰好是 main 函式中的第乙個可執行語句。
再次使用「r」命令執行(run)被除錯程式:
程式中斷在test.c第13行處,即main函式是第乙個可執行語句處。
上面最後一行資訊為:下一條將要執行的源**為「return f(8)+1;」,它是源**檔案test.c中的第13行。
下面使用「s」命令(step)執行下一行**(即第13行「return f(8)+1;」):
上面的資訊表示已經執行完「return f(8)+1;」,並顯示下一條要執行的**為第8行的「return g(x);」。
使用disassemble
指令獲取彙編**
用i(info) r(registers)指令檢視各暫存器的值:
display /i $pc
在每次執行下一條彙編語句時,都會顯示出當前執行的語句
frame
列印出的資訊:棧的層編號,當前的函式名,函式引數值,函式所在檔案及行號,函式執行到的語句。
使用up
down
,跳轉不同堆疊,查詢其中的堆疊簡要資訊
gdb除錯彙編堆疊過程分析
gdb 除錯 vs除錯
一 先要生成二進位制檔案 g g 1.cpp o 1.out g引數不要省,不然 gdb l 引數用不了 二 引數 設定斷點 設定 函式斷點break func 在某行設定斷點break 7 檢視斷點資訊 info break 刪除斷點 d 刪除所有斷點 d 3 刪除第三個 執行 r 下一步 n 逐...
Linux系統 gdb彙編級除錯C語言程式
彙編級除錯 1.進入gdb gdb progarm 2.對程式打斷點 break main c語言級的斷點,break main 偏移量 彙編級斷點 3.r 執行程式 4.檢視記憶體 x 5xw 0xbffff0a4 檢視五個資料,以十六進製制 x,o,d,s,s為以字串形式顯示 乙個資料長度為四 ...
使用GDB除錯組合語言,檢視plt過程
include int main void 非常簡單的乙個hello world程式,編譯程式之後對程式進行反彙編objdump d main 本文使用gdb的一些操作 ni 跳過當前彙編指令 si 進入彙編指令 x 位址 檢視記憶體位址的值 disassembe 檢視彙編 好了,在進行除錯之前,先...