iT邦幫忙

2021 iThome 鐵人賽

DAY 3
0

中秋月圓人團圓 烤肉越吃臉越圓

中秋節快樂 / 我想吃烤肉

前一章提到了環境的安裝或自行編譯與設定gdb

但如果不知道調試技巧 後續遇到問題也只剩愣在電腦前面

於是

今天就來談談我自己常用的gdb指令

當然 gdb 內有help指令告訴你有哪些可用的指令

  1. 首先如果有執行檔沒拔symbol的話 可以在一開始就載入後續可以直接trace C code.
file xxx.elf
  1. 因為後續會使用qemu模擬, 所以我們會利用遠程調試來解決bug
target remote [target]:[port]


這時我們就可以知道我們接上target的程序了

  1. 接著如果單使用這個視窗很難知道我們接下來的指令會是什麼 所以我們把asm的視窗叫出來
layout asm

這時我們就知道這幾行的指令是什麼
xzr為zero register, 特殊寄存器的一種, 目的也是為了清空資料
經過閱讀過後就可以知道x1,x2,x3的寄存器都被清空後, 把0x20的資料載進x4裡面, 接著進行跳轉

當然在這裡如果已經開始困惑, 可以先嘗試閱讀arm的官方文件, 內部都有表明不同的架構底下有哪些寄存器.

  1. 再來因為我們的main是用C寫的, 並且編譯完成後並沒有拔掉symbol, 所以在這裡可以利用src的視窗看到source code
layout src

這邊就可以看到目前正進入一個while loop, 並且嘗試抓取一個char

  1. 當然一些基本的操作
si # 單步執行(會進入function)
ni # 單步執行(直接執行完function跳出)
c  # continue, 如果設定好中斷點 直接c下去可以直接撞到你要的點
x/10i $address # 查看 address 的位置往下10個instruction. (此指令有非常多用法, 族繁不及備載)
fin # 直接跳開目前的function回到上一層

那gdb真的非常好用, 網上還有很多大神釋出的加強套件, 可以斟酌使用.
如果習慣視窗化的像是x64-debugger可能就要稍微熟悉指令的部分

[參考連結]
https://www.cs.cmu.edu/~gilpin/tutorial/


上一篇
第1砍 - 磨刀霍霍
下一篇
第3砍 - 不亮也光
系列文
砍入式開發學習路線大雜燴8
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言