GDB調試彙編分析

GDB調試彙編分析

代碼

  • 本次實踐我參照了許多先作了的同窗的博客,有盧肖明,高其,張梓靖同窗。代碼借用的是盧肖明同窗的代碼進行調試運行。linux

    GCC編譯

  • 使用gcc -g gdbtest.c -o gdbtest -m32命令在64位的機器上產生32位彙編代碼
  • 在使用gdb進行調試運行時,有cgdb和gdb兩種工具,我建議你們使用張梓靖同窗使用的cgdb工具,由於使用時能夠隨時看到本身的源代碼,看到咱們的斷點在哪裏,每一步返回值到了哪行,更加直觀。編程

分析過程

  • 使用b main指令在main函數處設置斷點,而後,使用r指令運行代碼,使用disassemble指令獲取彙編代碼
    sass

  • 使用display /i $pc(結合display命令和寄存器/pc內部變量)指令進行設置
    函數

  • 可見此時主函數的棧基址爲0xffffd068,用x(examine)指令查看內存地址中的值,但目前%esp所指堆棧內容爲0,%ebp所指內容也爲0
  • 用i r指令查看各寄存器的值
  • 依次以下指令調試彙編代碼,並查看%esp、%ebp和堆棧內容:
  • 一、使用si指令單步跟蹤一條機器指令
  • 二、使用i r指令查看各寄存器的值(在這裏要看%eip、%eax、%esp和%ebp)
  • 三、使用x/na %esp對應的值指令查看堆棧變化

  • 將上一個函數的基址入棧,從當前%esp開始做爲新基址:
    工具

  • call指令將下一條指令的地址入棧,此時%esp,%ebp和堆棧的值爲:
    學習

  • 實參準備入棧:

  • 實參的計算在%eax中進行:

  • 將棧中的數據push

  •   push後寄存器中的值發生轉變。

  • 函數f修改了%esp,用leave指令恢復。
    spa

  • ret結束main函數
    3d

總結反思

  • 此次學習讓我對於gdb有了更加深入地認識,設置斷點是咱們在進行編寫代碼時在總體編譯沒有問題,可是卻沒法獲得咱們想要的結果時所進行分段糾錯步驟,此次的實踐讓我對於堆棧變化了有了更加深入的理解,在使用終端三件工具編程時,沒有編程軟件上自帶寫好咱們拿來就用的斷點設置按鈕,以後如果遇到這樣的問題咱們只能本身動手去作,因此說此次的實踐又是咱們掌握的一件有力的linux中C語言編程工具。

gdb調試分析彙總表


相關文章
相關標籤/搜索