原博客鏈接
補充內容
輸入的代碼

使用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在每次執行下一條匯編語句時,都會顯示出當前執行的語句

call指令將下一條指令的地址入棧

frame 打印出的信息:棧的層編號,當前的函數名,函數參數值,函數所在文件及行號,函數執行到的語句。
info frame 打印出的信息:函數地址,調用函數的地址,被調用函數的地址,目前的函數是由什么樣的程序語言寫成的、函數參數地址及值、局部變量的地址等等。
使用 up down ,跳轉不同堆棧,查詢其中的堆棧簡要信息
剩余內容參考盧肖明同學的博客,內容一樣,就不一一貼圖了,附上盧肖明同學的博客鏈接
