源碼級(jí)別gdb遠(yuǎn)程調(diào)試(實(shí)現(xiàn)OS簡(jiǎn)單內(nèi)核)

最近在學(xué)著編寫一個(gè)操作系統(tǒng)的簡(jiǎn)單內(nèi)核,需要debug工具休蟹,我們這里使用gdb來(lái)進(jìn)行調(diào)試者冤,由于虛擬機(jī)運(yùn)行和本機(jī)是兩個(gè)部分,所以使用 gdb 的遠(yuǎn)程調(diào)試技術(shù)徙赢,這里對(duì) gdb 常見調(diào)試以及遠(yuǎn)程調(diào)試方式做一個(gè)總結(jié)字柠。

遠(yuǎn)程調(diào)試

先對(duì)在調(diào)試操作系統(tǒng)內(nèi)核時(shí)用到的命令做一個(gè)說(shuō)明(這里省略了一部分makefile的內(nèi)容):

為了方便調(diào)試,將debug所用到的命令做一個(gè)簡(jiǎn)單說(shuō)明

……
# -s 這個(gè)參數(shù)指的是啟動(dòng)時(shí)開啟1234端口等待gdb連接
# -S 是指是啟動(dòng)時(shí)不自動(dòng)開始運(yùn)行狡赐,等待調(diào)試器的執(zhí)行命令
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"
    
……

我們?cè)谑褂?qemu 啟動(dòng)運(yùn)行鏡像文件時(shí)窑业,使用以下參數(shù):

  • -s 這個(gè)參數(shù)指的是啟動(dòng)時(shí)開啟1234端口等待gdb連接
  • S 是指是啟動(dòng)時(shí)不自動(dòng)開始運(yùn)行,等待調(diào)試器的執(zhí)行命令

這個(gè)時(shí)候才開啟了遠(yuǎn)程端口以便讓我們后續(xù)能夠進(jìn)行連接到該端口進(jìn)行調(diào)試

我們需要在編譯源代碼的時(shí)候枕屉,加上 -g 參數(shù)常柄,以便能夠?qū)⒃创a信息編譯到可執(zhí)行文件中。

隨后我們使用 gdb 開啟調(diào)試

  • target remote localhost:1234 連接到遠(yuǎn)程端口
  • symbol-file kernel.elf 加載具有源代碼信息編譯到可執(zhí)行文件

`symbol-file 可以追蹤到編譯器提供的庫(kù)和操作系統(tǒng)本身的代碼
調(diào)試符號(hào)就是這些代碼內(nèi)的符號(hào)搀擂,調(diào)試符號(hào)數(shù)據(jù)庫(kù)拐纱,
記錄了變量,函數(shù) 這一類符號(hào)和內(nèi)存定位的關(guān)系
從而可以用 地址相關(guān)信息追蹤到變量名哥倔,函數(shù)名

之后我們就可以使用gdb命令來(lái)進(jìn)行調(diào)試秸架。

常見命令

命令 解釋 示例
file <文件名> 加載被調(diào)試的可執(zhí)行程序文件。 因?yàn)橐话愣荚诒徽{(diào)試程序所在目錄下執(zhí)行GDB咆蒿,因而文本名不需要帶路徑东抹。 (gdb) file gdb-sample
r Run的簡(jiǎn)寫蚂子,運(yùn)行被調(diào)試的程序。 如果此前沒(méi)有下過(guò)斷點(diǎn)缭黔,則執(zhí)行完整個(gè)程序食茎;如果有斷點(diǎn),則程序暫停在第一個(gè)可用斷點(diǎn)處馏谨。 (gdb) r
c continue的簡(jiǎn)寫别渔,繼續(xù)執(zhí)行被調(diào)試程序,直至下一個(gè)斷點(diǎn)或程序結(jié)束惧互。 (gdb) c
b <行號(hào)> b <函數(shù)名稱> b *<函數(shù)名稱> b *<代碼地址> d [編號(hào)] b: Breakpoint的簡(jiǎn)寫哎媚,設(shè)置斷點(diǎn)。兩可以使用“行號(hào)”“函數(shù)名稱”“執(zhí)行地址”等方式指定斷點(diǎn)位置喊儡。 其中在函數(shù)名稱前面加“*”符號(hào)表示將斷點(diǎn)設(shè)置在“由編譯器生成的prolog代碼處”拨与。如果不了解匯編,可以不予理會(huì)此用法艾猜。 d: Delete breakpoint的簡(jiǎn)寫买喧,刪除指定編號(hào)的某個(gè)斷點(diǎn),或刪除所有斷點(diǎn)匆赃。斷點(diǎn)編號(hào)從1開始遞增淤毛。 (gdb) b 8 (gdb) b main (gdb) b *main (gdb) b *0x804835c (gdb) d
s, n s: 執(zhí)行一行源程序代碼,如果此行代碼中有函數(shù)調(diào)用算柳,則進(jìn)入該函數(shù)低淡; n: 執(zhí)行一行源程序代碼,此行代碼中的函數(shù)調(diào)用也一并執(zhí)行埠居。 s 相當(dāng)于其它調(diào)試器中的“Step Into (單步跟蹤進(jìn)入)”查牌; n 相當(dāng)于其它調(diào)試器中的“Step Over (單步跟蹤)”。 這兩個(gè)命令必須在有源代碼調(diào)試信息的情況下才可以使用(GCC編譯時(shí)使用“-g”參數(shù))滥壕。 (gdb) s (gdb) n
si, ni si命令類似于s命令纸颜,ni命令類似于n命令。所不同的是绎橘,這兩個(gè)命令(si/ni)所針對(duì)的是匯編指令胁孙,而s/n針對(duì)的是源代碼。 (gdb) si (gdb) ni
p <變量名稱> Print的簡(jiǎn)寫称鳞,顯示指定變量(臨時(shí)變量或全局變量)的值涮较。 (gdb) p i (gdb) p nGlobalVar
display ... undisplay <編號(hào)> display,設(shè)置程序中斷后欲顯示的數(shù)據(jù)及其格式冈止。 例如狂票,如果希望每次程序中斷后可以看到即將被執(zhí)行的下一條匯編指令,可以使用命令 “display /i pc” 其中pc 代表當(dāng)前匯編指令熙暴,/i 表示以十六進(jìn)制顯示闺属。當(dāng)需要關(guān)心匯編代碼時(shí)乍楚,此命令相當(dāng)有用团赁。 undispaly征唬,取消先前的display設(shè)置丢烘,編號(hào)從1開始遞增。 (gdb) display /i $pc (gdb) undisplay 1
i info的簡(jiǎn)寫国瓮,用于顯示各類信息灭必,詳情請(qǐng)查閱“help i”。 (gdb) i r
q quit的簡(jiǎn)寫乃摹,退出GDB調(diào)試環(huán)境禁漓。 (gdb) q
help [命令名稱] GDB幫助命令,提供對(duì)GDB名種命令的解釋說(shuō)明峡懈。 如果指定了“命令名稱”參數(shù)璃饱,則顯示該命令的詳細(xì)說(shuō)明与斤;如果沒(méi)有指定參數(shù)肪康,則分類顯示所有GDB命令,供用戶進(jìn)一步瀏覽和查詢撩穿。 (gdb) help

執(zhí)行選項(xiàng)

  • -cd:設(shè)置工作目錄
  • -q:安靜模式磷支,不打印介紹信息和版本信息
  • -d:添加文件查找路徑
  • -x:從指定文件中執(zhí)行GDB指令
  • -s:設(shè)置讀取的符號(hào)表文件

歡迎訪問(wèn)我的博客github!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市食寡,隨后出現(xiàn)的幾起案子雾狈,更是在濱河造成了極大的恐慌,老刑警劉巖抵皱,帶你破解...
    沈念sama閱讀 221,548評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件善榛,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡呻畸,警方通過(guò)查閱死者的電腦和手機(jī)移盆,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,497評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)伤为,“玉大人咒循,你說(shuō)我怎么就攤上這事〗视蓿” “怎么了叙甸?”我有些...
    開封第一講書人閱讀 167,990評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)位衩。 經(jīng)常有香客問(wèn)我裆蒸,道長(zhǎng),這世上最難降的妖魔是什么糖驴? 我笑而不...
    開封第一講書人閱讀 59,618評(píng)論 1 296
  • 正文 為了忘掉前任僚祷,我火速辦了婚禮哪痰,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘久妆。我一直安慰自己晌杰,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,618評(píng)論 6 397
  • 文/花漫 我一把揭開白布筷弦。 她就那樣靜靜地躺著肋演,像睡著了一般。 火紅的嫁衣襯著肌膚如雪烂琴。 梳的紋絲不亂的頭發(fā)上爹殊,一...
    開封第一講書人閱讀 52,246評(píng)論 1 308
  • 那天,我揣著相機(jī)與錄音奸绷,去河邊找鬼梗夸。 笑死,一個(gè)胖子當(dāng)著我的面吹牛号醉,可吹牛的內(nèi)容都是我干的反症。 我是一名探鬼主播,決...
    沈念sama閱讀 40,819評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼畔派,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼铅碍!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起线椰,我...
    開封第一講書人閱讀 39,725評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤胞谈,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后憨愉,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體烦绳,經(jīng)...
    沈念sama閱讀 46,268評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,356評(píng)論 3 340
  • 正文 我和宋清朗相戀三年配紫,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了径密。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,488評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡笨蚁,死狀恐怖睹晒,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情括细,我是刑警寧澤伪很,帶...
    沈念sama閱讀 36,181評(píng)論 5 350
  • 正文 年R本政府宣布,位于F島的核電站奋单,受9級(jí)特大地震影響锉试,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜览濒,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,862評(píng)論 3 333
  • 文/蒙蒙 一呆盖、第九天 我趴在偏房一處隱蔽的房頂上張望拖云。 院中可真熱鬧,春花似錦应又、人聲如沸宙项。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,331評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)尤筐。三九已至,卻和暖如春洞就,著一層夾襖步出監(jiān)牢的瞬間盆繁,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,445評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工旬蟋, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留油昂,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,897評(píng)論 3 376
  • 正文 我出身青樓倾贰,卻偏偏與公主長(zhǎng)得像冕碟,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子躁染,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,500評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容

  • 程序調(diào)試的基本思想是“分析現(xiàn)象->假設(shè)錯(cuò)誤原因->產(chǎn)生新的現(xiàn)象去驗(yàn)證假設(shè)”這樣一個(gè)循環(huán)過(guò)程鸣哀,根據(jù)現(xiàn)象如何假設(shè)錯(cuò)誤原...
    Manfred_Zone閱讀 16,551評(píng)論 0 26
  • 作者: liigo原文鏈接: http://blog.csdn.net/liigo/archive/2006/01...
    wuqingyi閱讀 1,819評(píng)論 0 4
  • 概述 GDB是一個(gè)由GNU開源組織發(fā)布的架忌、UNIX/Linux操作系統(tǒng)下的吞彤、基于命令行的、功能強(qiáng)大的程序調(diào)試工具叹放。...
    咕咕鷄閱讀 20,817評(píng)論 0 8
  • 調(diào)試前準(zhǔn)備 獲取進(jìn)程的內(nèi)核轉(zhuǎn)儲(chǔ)(core dump) why:最大好處是饰恕,其保存了問(wèn)題發(fā)生時(shí)的狀態(tài)。記錄進(jìn)程當(dāng)前狀...
    Gitlusen閱讀 944評(píng)論 0 2
  • 版權(quán)聲明:本文為 cdeveloper 原創(chuàng)文章井仰,可以隨意轉(zhuǎn)載埋嵌,但必須在明確位置注明出處! gdb 簡(jiǎn)介 gdb ...
    登龍zZ閱讀 7,548評(píng)論 1 15