原始碼級別gdb遠端除錯(實現OS簡單核心)

2021-10-02 18:45:25 字數 2352 閱讀 6127

最近在學著編寫乙個作業系統的簡單核心,需要debug工具,我們這裡使用gdb來進行除錯,由於虛擬機器執行和本機是兩個部分,所以使用 gdb 的遠端除錯技術,這裡對 gdb 常見除錯以及遠端除錯方式做乙個總結。

先對在除錯作業系統核心時用到的命令做乙個說明(這裡省略了一部分makefile的內容):

為了方便除錯,將debug所用到的命令做乙個簡單說明

……

# -s 這個引數指的是啟動時開啟1234埠等待gdb連線

# -s 是指是啟動時不自動開始執行,等待偵錯程式的執行命令

debug: kernel.elf os-image.bin

@echo ???debug???

$ -s -s -fda os-image.bin -boot a &

i386-elf-gdb -q -ex "target remote localhost:1234" -ex "symbol-file kernel.elf"

……

我們在使用 qemu 啟動執行映象檔案時,使用以下引數:

這個時候才開啟了遠端埠以便讓我們後續能夠進行連線到該埠進行除錯

我們需要在編譯源**的時候,加上-g引數,以便能夠將源**資訊編譯到可執行檔案中。

隨後我們使用 gdb 開啟除錯

`symbol-file 可以追蹤到編譯器提供的庫和作業系統本身的**

除錯符號就是這些**內的符號,除錯符號資料庫,

記錄了變數,函式 這一類符號和記憶體定位的關係

從而可以用 位址相關資訊追蹤到變數名,函式名

之後我們就可以使用gdb命令來進行除錯。

命令解釋

示例file

《檔名》

載入被除錯的可執行程式檔案。 因為一般都在被除錯程式所在目錄下執行gdb,因而文字名不需要帶路徑。

(gdb) file gdb-sample

rrun的簡寫,執行被除錯的程式。 如果此前沒有下過斷點,則執行完整個程式;如果有斷點,則程式暫停在第乙個可用斷點處。

(gdb) r

ccontinue的簡寫,繼續執行被除錯程式,直至下乙個斷點或程式結束。

(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

iinfo的簡寫,用於顯示各類資訊,詳情請查閱「help i」。

(gdb) i r

qquit的簡寫,退出gdb除錯環境。

(gdb) q

help [命令名稱]

gdb幫助命令,提供對gdb名種命令的解釋說明。 如果指定了「命令名稱」引數,則顯示該命令的詳細說明;如果沒有指定引數,則分類顯示所有gdb命令,供使用者進一步瀏覽和查詢。

(gdb) help

使用gdb除錯nginx原始碼

葉劍峰 包含鏈結 這裡就不說了,谷歌一搜一堆,這裡推薦一篇文章 gdb 命令詳細解釋 請重點看一下step,run,break,list,info,continue命令 這裡使用nginx 1.0.14 src是源 auto資料夾是configure執行時候的各種命令集合 由於gdb需要gcc的時候...

Linux核心啟動原始碼跟蹤 gdb除錯篇

核心的編譯和環境的搭建過程如圖 分析核心原始碼 include 13 14static struct signal struct init signals init signals init signals 15static struct sighand struct init sighand in...

caffe使用gdb單步除錯及原始碼閱讀

目錄 一caffe單步除錯 二caffe入口函式 三初始化訓練網路 四前向傳播 五反向傳播 本文主要是介紹我在閱讀caffe過程中參考的順序以及 首先閱讀caffe看了知乎上面的這篇文章 深度學習caffe的 怎麼讀?參考的是gein chen 大神的回答 1.先讓程式跑起來,看看結果,這樣就會有直...