bochs模擬器:使用命令行調(diào)試程序?qū)嵗?/h1>

前文,我們介紹了如何創(chuàng)建自己的啟動鏡像朋魔,并在屏幕輸出了"Hello bochs!"打印,本文將以這個啟動鏡像為對象站玄,介紹如何使用bochs提供的調(diào)試功能掖举,本文將介紹如何使用命令行調(diào)試功能朗徊。

bochs提供的調(diào)試功能主要分為執(zhí)行控制夷野、斷點功能、內(nèi)存監(jiān)測荣倾、內(nèi)存操作悯搔、信息查詢、CPU寄存器操作舌仍、反匯編妒貌、指令跟蹤等,本文的示例將會介紹最簡單和常用的一些命令功能铸豁,調(diào)試功能的具體命令可以參考這里灌曙,更多細節(jié)請參考官網(wǎng)

跟蹤調(diào)測我們的程序

首先节芥,啟動我們的程序在刺,可以參考創(chuàng)建可使用的鏡像,使用bochs -f bochsrc啟動后如下头镊,選擇6進入調(diào)試界面:

$ bochs -f bochsrc 
========================================================================
                        Bochs x86 Emulator 2.7
              Built from SVN snapshot on August  1, 2021
                Timestamp: Sun Aug  1 10:07:00 CEST 2021
========================================================================
00000000000i[      ] BXSHARE not set. using compile time default '/usr/local/share/bochs'
00000000000i[      ] reading configuration from bochsrc
------------------------------
Bochs Configuration: Main Menu
------------------------------

This is the Bochs Configuration Interface, where you can describe the
machine that you want to simulate.  Bochs has already searched for a
configuration file (typically called bochsrc.txt) and loaded it if it
could be found.  When you are satisfied with the configuration, go
ahead and start the simulation.

You can also start bochs with the -q option to skip these menus.

1. Restore factory default configuration
2. Read options from...
3. Edit options
4. Save options to...
5. Restore the Bochs state from...
6. Begin simulation
7. Quit now

Please choose one: [6] 6 
00000000000i[      ] installing x module as the Bochs GUI
00000000000i[      ] using log file bochsout.txt
Next at t=0
(0) [0x0000fffffff0] f000:fff0 (unk. ctxt): jmpf 0xf000:e05b          ; ea5be000f0
<bochs:1> 

程序此時會停留蚣驼,等待我們進一步的指令,我們來稍微看一下輸出的信息相艇,注意到這樣一行[0x0000fffffff0] f000:fff0 (unk. ctxt): jmpf 0xf000:e05b ; ea5be000f0颖杏,這個也就是BIOS啟動引導分區(qū)過程簡介中提到的,上電后BIOS會加載到0xf000:0xfff0處坛芽,然后處理器跳到CS:IP=0xf000:fff0處執(zhí)行BIOS代碼留储。我們可以使用sreg命令查看一下段寄存器,使用reg查看一下普通寄存器的內(nèi)容咙轩,結(jié)果如下:

Please choose one: [6] 6 
00000000000i[      ] installing x module as the Bochs GUI
00000000000i[      ] using log file bochsout.txt
Next at t=0
(0) [0x0000fffffff0] f000:fff0 (unk. ctxt): jmpf 0xf000:e05b          ; ea5be000f0
<bochs:1> sreg
es:0x0000, dh=0x00009300, dl=0x0000ffff, valid=7
    Data segment, base=0x00000000, limit=0x0000ffff, Read/Write, Accessed
cs:0xf000, dh=0xff0093ff, dl=0x0000ffff, valid=7
    Data segment, base=0xffff0000, limit=0x0000ffff, Read/Write, Accessed
ss:0x0000, dh=0x00009300, dl=0x0000ffff, valid=7
    Data segment, base=0x00000000, limit=0x0000ffff, Read/Write, Accessed
ds:0x0000, dh=0x00009300, dl=0x0000ffff, valid=7
    Data segment, base=0x00000000, limit=0x0000ffff, Read/Write, Accessed
fs:0x0000, dh=0x00009300, dl=0x0000ffff, valid=7
    Data segment, base=0x00000000, limit=0x0000ffff, Read/Write, Accessed
gs:0x0000, dh=0x00009300, dl=0x0000ffff, valid=7
    Data segment, base=0x00000000, limit=0x0000ffff, Read/Write, Accessed
ldtr:0x0000, dh=0x00008200, dl=0x0000ffff, valid=1
tr:0x0000, dh=0x00008b00, dl=0x0000ffff, valid=1
gdtr:base=0x00000000, limit=0xffff
idtr:base=0x00000000, limit=0xffff
<bochs:2> reg 
eax: 0x00000000 0
ebx: 0x00000000 0
ecx: 0x00000000 0
edx: 0x00000000 0
esp: 0x00000000 0
ebp: 0x00000000 0
esi: 0x00000000 0
edi: 0x00000000 0
eip: 0x0000fff0
eflags 0x00000002: id vip vif ac vm rf nt IOPL=0 of df if tf sf zf af pf cf
<bochs:3> 

可以看到cs:0xf000获讳,eip: 0x0000fff0,與理論過程完全一致活喊。此時丐膝,還并未執(zhí)行到我們編寫的程序,為了讓程序在進入我們編寫的Hello bochs!(如何編寫參考這里)時停止,我們需要打一個斷點尤误,從BIOS啟動引導分區(qū)過程簡介我們知道,BIOS會把我們編寫的啟動扇區(qū)加載到0x7c00地址處執(zhí)行结缚,因此我們在此處打一個斷點损晤,命令為b 0x7c00,執(zhí)行完后可以使用命令info break查看目前有哪些斷點:

<bochs:3> b 0x7c00
<bochs:4> info break
Num Type           Disp Enb Address
  1 pbreakpoint    keep y   0x000000007c00 
<bochs:5> 

可以看到红竭,成功的在0x7c00處打了斷點尤勋,預期程序會在執(zhí)行到該地址時停止,此時需要我們讓程序繼續(xù)執(zhí)行下去指導斷點停止茵宪,輸入c(意為continue)繼續(xù)執(zhí)行程序直到遇到一個斷點最冰。

<bochs:5> c
(0) Breakpoint 1, 0x00007c00 in ?? ()
Next at t=47628826
(0) [0x000000007c00] 0000:7c00 (unk. ctxt): mov ax, cs                ; 8cc8
<bochs:6> 

如預期,程序在0x7c00處停了下來稀火,說明斷點生效了暖哨,并且可以看到此處的代碼是mov ax, cs,也正是我們編寫的Hello bochs!程序的第一行代碼凰狞∑茫可以執(zhí)行regsreg看一下寄存器的情況,可以看到BIOS執(zhí)行完后赡若,程序跳到了CS:IP=0x0000:0x7c00位置執(zhí)行:

<bochs:6> reg
eax: 0x0000aa55 43605
ebx: 0x00000000 0
ecx: 0x00090000 589824
edx: 0x00000000 0
esp: 0x0000ffd6 65494
ebp: 0x00000000 0
esi: 0x000e0000 917504
edi: 0x0000ffac 65452
eip: 0x00007c00
eflags 0x00000082: id vip vif ac vm rf nt IOPL=0 of df if tf SF zf af pf cf
<bochs:7> sreg
es:0x0000, dh=0x00009300, dl=0x0000ffff, valid=1
    Data segment, base=0x00000000, limit=0x0000ffff, Read/Write, Accessed
cs:0x0000, dh=0x00009300, dl=0x0000ffff, valid=1
    Data segment, base=0x00000000, limit=0x0000ffff, Read/Write, Accessed
ss:0x0000, dh=0x00009300, dl=0x0000ffff, valid=7
    Data segment, base=0x00000000, limit=0x0000ffff, Read/Write, Accessed
ds:0x0000, dh=0x00009300, dl=0x0000ffff, valid=1
    Data segment, base=0x00000000, limit=0x0000ffff, Read/Write, Accessed
fs:0x0000, dh=0x00009300, dl=0x0000ffff, valid=1
    Data segment, base=0x00000000, limit=0x0000ffff, Read/Write, Accessed
gs:0x0000, dh=0x00009300, dl=0x0000ffff, valid=1
    Data segment, base=0x00000000, limit=0x0000ffff, Read/Write, Accessed
ldtr:0x0000, dh=0x00008200, dl=0x0000ffff, valid=1
tr:0x0000, dh=0x00008b00, dl=0x0000ffff, valid=1
gdtr:base=0x000f9ad7, limit=0x30
idtr:base=0x00000000, limit=0x3ff
<bochs:8> 

bochs有個細節(jié)做的很好达布,就是每一次暫停程序執(zhí)行等待用戶輸入調(diào)試指令,都會在<bochs: 數(shù)字>提示符中顯示一個遞增的數(shù)字逾冬,表示當前是多少次暫停了黍聂。

使用n(next)可以繼續(xù)執(zhí)行:

<bochs:10> n
Next at t=47628827
(0) [0x000000007c02] 0000:7c02 (unk. ctxt): mov ds, ax                ; 8ed8
<bochs:11>

可以使用xxp來查看對應(yīng)地址(物理地址)的內(nèi)容:

<bochs:15> xp /16bx 0x7c00
[bochs]:
0x00007c00 <bogus+       0>:    0x8c    0xc8    0x8e    0xd8    0x8e    0xc0    0xbd    0x1b
0x00007c08 <bogus+       8>:    0x7c    0xb9    0x0c    0x00    0xb4    0x13    0xb0    0x01
<bochs:16> 

使用exit退出調(diào)試。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者

  • 序言:七十年代末身腻,一起剝皮案震驚了整個濱河市产还,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌嘀趟,老刑警劉巖雕沉,帶你破解...
    沈念sama閱讀 218,755評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異去件,居然都是意外死亡坡椒,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評論 3 395
  • 文/潘曉璐 我一進店門尤溜,熙熙樓的掌柜王于貴愁眉苦臉地迎上來倔叼,“玉大人,你說我怎么就攤上這事宫莱≌稍埽” “怎么了?”我有些...
    開封第一講書人閱讀 165,138評論 0 355
  • 文/不壞的土叔 我叫張陵,是天一觀的道長巡验。 經(jīng)常有香客問我际插,道長,這世上最難降的妖魔是什么显设? 我笑而不...
    開封第一講書人閱讀 58,791評論 1 295
  • 正文 為了忘掉前任框弛,我火速辦了婚禮,結(jié)果婚禮上捕捂,老公的妹妹穿的比我還像新娘瑟枫。我一直安慰自己,他們只是感情好指攒,可當我...
    茶點故事閱讀 67,794評論 6 392
  • 文/花漫 我一把揭開白布慷妙。 她就那樣靜靜地躺著,像睡著了一般允悦。 火紅的嫁衣襯著肌膚如雪膝擂。 梳的紋絲不亂的頭發(fā)上抗碰,一...
    開封第一講書人閱讀 51,631評論 1 305
  • 那天馒闷,我揣著相機與錄音,去河邊找鬼蝶涩。 笑死驶鹉,一個胖子當著我的面吹牛绩蜻,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播室埋,決...
    沈念sama閱讀 40,362評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼办绝,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了姚淆?” 一聲冷哼從身側(cè)響起孕蝉,我...
    開封第一講書人閱讀 39,264評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎腌逢,沒想到半個月后降淮,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,724評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡搏讶,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年佳鳖,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片媒惕。...
    茶點故事閱讀 40,040評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡系吩,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出妒蔚,到底是詐尸還是另有隱情穿挨,我是刑警寧澤月弛,帶...
    沈念sama閱讀 35,742評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站科盛,受9級特大地震影響帽衙,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜贞绵,卻給世界環(huán)境...
    茶點故事閱讀 41,364評論 3 330
  • 文/蒙蒙 一厉萝、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧但壮,春花似錦、人聲如沸常侣。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,944評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽胳施。三九已至溯祸,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間舞肆,已是汗流浹背焦辅。 一陣腳步聲響...
    開封第一講書人閱讀 33,060評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留椿胯,地道東北人筷登。 一個月前我還...
    沈念sama閱讀 48,247評論 3 371
  • 正文 我出身青樓,卻偏偏與公主長得像哩盲,于是被迫代替她去往敵國和親前方。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,979評論 2 355

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