在输入bochs -f bochsrc后,还有几个选项,只需要输入6然后回车或直接按回车即可启动操作系统,不过它仍然停在那里而不是立刻执行。这时会出现<bochs:1>,等待我们操作。
首先按照书上给的例子模拟一遍过程。
<bochs:1> b 0x7c00 (在程序入口处设置断点)
<bochs:2>c(执行到断点位置,这时虽然Bochs上有内容,但是"Hello, OS world!"还未显示)
<bochs:3>dump_cup(不知道早些的版本是否能执行这个,反正我的Bochs2.6.1中这个命令已经不能用了,会提示:3: syntax error at 'dump_cpu',用info cpu、r、fp、sreg、creg命令来代替。而且我在使用info cpu命令时,会提示The CPU doesn't support AVX state !,从Bochs源码中可以看到如果BX_SUPPORT_AVX值为假,会打印此条语句。相关内容可参考此文章)
<bochs:4>x /64xb 0x7c00 (查看线性地址内容)
<bochs:5>n(单步执行)
<bochs:6>trace-reg on(开启“每执行一条指令就打印CPU信息”选项)
<bochs:7>n(继续单步执行)
<bochs:8>c(继续执行,会发现"Hello, OS world!"显示出来了)
输入help或h,然后回车,Bochs会打印如下内容:
h|help - show list of debugger commands
h|help command - show short command description
-*- Debugger control -*-
help, q|quit|exit, set, instrument, show, trace, trace-reg,
trace-mem, u|disasm, ldsym, slist
-*- Execution control -*-
c|cont|continue, s|step, p|n|next, modebp, vmexitbp
-*- Breakpoint management -*-
vb|vbreak, lb|lbreak, pb|pbreak|b|break, sb, sba, blist,
bpe, bpd, d|del|delete, watch, unwatch
-*- CPU and memory contents -*-
x, xp, setpmem, writemem, crc, info,
r|reg|regs|registers, fp|fpu, mmx, sse, sreg, dreg, creg,
page, set, ptime, print-stack, ?|calc
-*- Working with bochs param tree -*-
show "param", restore
网上有许多讲bochs调试命令的文章,我把书上的内容以及解释列在下面:
行为 | 指令 | 举例 |
---|---|---|
在某物理地址设置断点 | b addr | b 0x30400 |
显示当前所有断点信息 | info break | info break |
继续执行,直到遇上断点 | c | c |
单步执行 | s | s |
单步执行,遇到函数则跳过 | n | n |
查看寄存器信息 | info cpu r fp sreg creg |
info cpu r fp sreg creg |
查看堆栈 | print-stack | print-stack |
查看内存物理地址内容 | xp /nuf addr | xp /40bx 0x9013e |
查看线性地址内容 | x /nuf addr | x /40bx 0x13e |
反汇编一段内存 | u start end | u 0x30400 0x3040D |
反汇编执行的每一条指令 | trace-on | trace-on |
每执行一条指令就打印CPU信息 | trace-reg | trace-reg on |
在xp和x命令中,nuf表示指定打印多少信息。
其实bochs调试跟gdb挺像的~
前两章到此结束,第三章内容好像不少的样子。。去看第三章了~