最近在學著撰寫一個作業系統的簡單內核,需要debug工具,我們這里使用gdb來進行除錯,由于虛擬機運行和本機是兩個部分,所以使用 gdb 的遠程除錯技術,這里對 gdb 常見除錯以及遠程除錯方式做一個總結,
遠程除錯
先對在除錯作業系統內核時用到的命令做一個說明(這里省略了一部分makefile的內容):
為了方便除錯,將debug所用到的命令做一個簡單說明
……
# -s 這個引數指的是啟動時開啟1234埠等待gdb連接
# -S 是指是啟動時不自動開始運行,等待除錯器的執行命令
debug: kernel.elf os-image.bin
@echo ??????debug??????
${QEMU} -S -s -fda os-image.bin -boot a &
i386-elf-gdb -q -ex "target remote localhost:1234" -ex "symbol-file kernel.elf"
……
我們在使用 qemu 啟動運行鏡像檔案時,使用以下引數:
- -s 這個引數指的是啟動時開啟1234埠等待gdb連接
- S 是指是啟動時不自動開始運行,等待除錯器的執行命令
這個時候才開啟了遠程埠以便讓我們后續能夠進行連接到該埠進行除錯
我們需要在編譯源代碼的時候,加上 -g 引數,以便能夠將源代碼資訊編譯到可執行檔案中,
隨后我們使用 gdb 開啟除錯
target remote localhost:1234連接到遠程埠symbol-file kernel.elf加載具有源代碼資訊編譯到可執行檔案
`symbol-file 可以追蹤到編譯器提供的庫和作業系統本身的代碼
除錯符號就是這些代碼內的符號,除錯符號資料庫,
記錄了變數,函式 這一類符號和記憶體定位的關系
從而可以用 地址相關資訊追蹤到變數名,函式名
之后我們就可以使用gdb命令來進行除錯,
常見命令
| 命令 | 解釋 | 示例 |
|---|---|---|
| file <檔案名> | 加載被除錯的可執行程式檔案, 因為一般都在被除錯程式所在目錄下執行GDB,因而文本名不需要帶路徑, | (gdb) file gdb-sample |
| r | Run的簡寫,運行被除錯的程式, 如果此前沒有下過斷點,則執行完整個程式;如果有斷點,則程式暫停在第一個可用斷點處, | (gdb) r |
| c | continue的簡寫,繼續執行被除錯程式,直至下一個斷點或程式結束, | (gdb) c |
| b <行號> b <函式名稱> b *<函式名稱> b *<代碼地址> d [編號] | b: Breakpoint的簡寫,設定斷點,兩可以使用“行號”“函式名稱”“執行地址”等方式指定斷點位置, 其中在函式名稱前面加“*”符號表示將斷點設定在“由編譯器生成的prolog代碼處”,如果不了解匯編,可以不予理會此用法, d: Delete breakpoint的簡寫,洗掉指定編號的某個斷點,或洗掉所有斷點,斷點編號從1開始遞增, | (gdb) b 8 (gdb) b main (gdb) b *main (gdb) b *0x804835c (gdb) d |
| s, n | s: 執行一行源程式代碼,如果此行代碼中有函式呼叫,則進入該函式; n: 執行一行源程式代碼,此行代碼中的函式呼叫也一并執行, s 相當于其它除錯器中的“Step Into (單步跟蹤進入)”; n 相當于其它除錯器中的“Step Over (單步跟蹤)”, 這兩個命令必須在有源代碼除錯資訊的情況下才可以使用(GCC編譯時使用“-g”引數), | (gdb) s (gdb) n |
| si, ni | si命令類似于s命令,ni命令類似于n命令,所不同的是,這兩個命令(si/ni)所針對的是匯編指令,而s/n針對的是源代碼, | (gdb) si (gdb) ni |
| p <變數名稱> | Print的簡寫,顯示指定變數(臨時變數或全域變數)的值, | (gdb) p i (gdb) p nGlobalVar |
| display ... undisplay <編號> | display,設定程式中斷后欲顯示的資料及其格式, 例如,如果希望每次程式中斷后可以看到即將被執行的下一潭訓編指令,可以使用命令 “display /i $pc” 其中 $pc 代表當前匯編指令,/i 表示以十六進制顯示,當需要關心匯編代碼時,此命令相當有用, undispaly,取消先前的display設定,編號從1開始遞增, | (gdb) display /i $pc (gdb) undisplay 1 |
| i | info的簡寫,用于顯示各類資訊,詳情請查閱“help i”, | (gdb) i r |
| q | quit的簡寫,退出GDB除錯環境, | (gdb) q |
| help [命令名稱] | GDB幫助命令,提供對GDB名種命令的解釋說明, 如果指定了“命令名稱”引數,則顯示該命令的詳細說明;如果沒有指定引數,則分類顯示所有GDB命令,供用戶進一步瀏覽和查詢, | (gdb) help |
執行選項
- -cd:設定作業目錄
- -q:安靜模式,不列印介紹資訊和版本資訊
- -d:添加檔案查找路徑
- -x:從指定檔案中執行GDB指令
- -s:設定讀取的符號表檔案
歡迎訪問我的博客和github!
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/64995.html
標籤:C++
下一篇:cow bowling
