<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<atom:link href="http://gentoo-zh.org/extern.php?action=feed&amp;tid=301&amp;type=rss" rel="self" type="application/rss+xml" />
		<title><![CDATA[Gentoo中文社区 / bochs调试方法与指令详解]]></title>
		<link>http://www.gentoo-zh.org/viewtopic.php?id=301</link>
		<description><![CDATA[bochs调试方法与指令详解 最近发表的帖子。]]></description>
		<lastBuildDate>Fri, 26 Aug 2022 06:02:48 +0000</lastBuildDate>
		<generator>FluxBB</generator>
		<item>
			<title><![CDATA[bochs调试方法与指令详解]]></title>
			<link>http://www.gentoo-zh.org/viewtopic.php?pid=307#p307</link>
			<description><![CDATA[<p>bochs调试FAQ:<br />一 基本调试命令</p><p>1.&#160; &#160; &#160; &#160;Q:如何从引导扇区开始设置断点?</p><p>A: BIOS被载入内存中运行,其引导扇区的地址一般都是在0x7c00,因为在实模式下,逻辑地址和物理地址是一一对应的, 所以我们可以在启动bochs调试的命令行下输入</p><p>&#160; &#160; &#160; &#160; pb 0x7c00 或者 vb 0:0x7c00</p><p>就着输入</p><p>&#160; &#160; &#160; &#160; c</p><p>bochs就会在0x7c00处停下 </p><p>2.&#160; &#160; &#160; &#160;Q: 我想在单步执行(s)后看到寄存器的变化情况, 该怎么设置?</p><p>A: 输入</p><p>&#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160;trace-reg on</p><p>&#160; &#160;后, 再执行单步调试的时候都会显示寄存器的当前状态了.</p><p> </p><p>3.&#160; &#160; &#160; &#160;Q: 在单步调试的时候,遇到一个调用子程序的指令,输入s会把调试跳进子程序中,如何只执行子程序而不要陷进去调试?</p><p>A: 在调试子程序的指令处,不用s改为n或p</p><p>4.&#160; &#160; &#160; &#160;Q: 查看当前堆栈的命令?</p><p>A: print-stack</p><p> Table 1. 部分Bochs调试指令</p><p>行为<br />指令<br />举例<br />在某物理地址设置断点<br />b addr<br />b 0x30400显示当前所有断点信息<br />info break继续执行，直到遇上断点<br />c单步执行<br />s单步执行（遇到函数则跳过）<br />n查看寄存器信息<br />info cpu<br />r<br />fp<br />sreg<br />creg<br />info cpu<br />r<br />fp<br />sreg<br />creg<br />查看堆栈<br />print-stack查看内存物理地址内容<br />xp /nuf addr<br />xp /40bx 0x9013e<br />查看线性地址内容<br />x /nuf addr<br />x /40bx 0x13e<br />反汇编一段内存<br />u start end<br />u 0x30400 0x3040D<br />反汇编执行的每一条指令<br />trace-on每执行一条指令就打印CPU信息<br />trace-reg<br />trace-reg on<br />其中&quot;xp /40bx 0x9013e&quot;这样的格式可能显得有点复杂，读者可以用&quot;help x&quot;这一指令在Bochs中亲自看一下它代表的意义</p><p>二执行控制<br />c|cont 向下执行，相当于WinDBG的“g”。 <br />s|step|stepi [count] 单步执行，相当于WinDBG的“t”，count 默认为 1。 <br />p|n|next 单步执行，类似于WinDBG的“p”。 <br />q|quit|exit 退出调试，同时关闭虚拟机。 <br />Ctrl-C 结束执行状态，返回调试器提示符。 <br />Ctrl-D if at empty line on command line, exit<br />（至少在Windows版本中我没有发现Ctrl-D有什么功能）</p><p> <br />三 执行断点<br />vb|vbreak [seg:off] 在虚拟地址上下断点。 <br />lb|lbreak [addr] 在线性地址上下断点，相当于WinDBG的“bp”。 <br />pb|pbreak|b|break [addr] 在物理地址上下断点。（为了兼容GDB的语法，地址前可以加上一个“*”）。 <br />blist 显示断点状态，相当于WinDBG的“bl”。 <br />bpd|bpe [num] 禁用/启用断点，WinDBG的“be”和“bd”。num是断点号，可以用blist命令查询。 <br />d|del|delete [num] 删除断点，相当于WinDBG的“bc”。mum是断点号，可<br />以用blist命令查询。<br />四 读写断点<br />watch read [addr] 设置读断点。<br />watch write [addr] 设置写断点。<br />unwatch read [addr] 清除读断点。<br />unwatch write [addr] 清除写断点。<br />watch 显示当前所有读写断点。<br />unwatch 清除当前所有读写断点。<br />watch stop|continue 开关选项，设置遇到读写断点时中断下来还是显示出来但是继续运行。<br />五 内存操作 <br />x /nuf [addr] 显示线性地址的内容<br />xp /nuf [addr] 显示物理地址的内容<br />n 显示的单元数<br />u 每个显示单元的大小，u可以是下列之一：<br />b BYTE<br />h WORD<br />w DWORD<br />g DWORD64<br />注意: 这种命名法是按照GDB习惯的，而并不是按照inter的规范。<br />f 显示格式，f可以是下列之一：<br />x 按照十六进制显示<br />d 十进制显示<br />u 按照无符号十进制显示<br />o 按照八进制显示<br />t 按照二进制显示<br />c 按照字符显示<br />n、f、u是可选参数，如果不指定，则u默认是w，f默认是x。如果前面使用过x或<br />者xp命令，会按照上一次的x或者xp命令所使用的值。n默认为1。addr 也是一个<br />可选参数，如果不指定，addr是0，如过前面使用过x或者xp命令，指定了n=i，<br />则再次执行时n默认为i+1。 <br />setpmem [addr] [size] [val] 设置物理内存某地址的内容。 <br />需要注意的是，每次最多只能设置一个DWORD：<br />这样是可以的：<br />&lt;bochs:1&gt; setpmem 0x00000000 0x4 0x11223344<br />&lt;bochs:2&gt; x /4 0x00000000<br />[bochs]:<br />0x00000000 &lt;bogus+ 0&gt;: 0x11223344 0x00000000 0x00000000 0x00000000<br />这样也可以：<br />&lt;bochs:1&gt; setpmem 0x00000000 0x2 0x11223344<br />&lt;bochs:2&gt; x /4 0x00000000<br />[bochs]:<br />0x00000000 &lt;bogus+ 0&gt;: 0x00003344 0x00000000 0x00000000 0x00000000<br />或者：<br />&lt;bochs:1&gt; setpmem 0x00000000 0x1 0x20<br />&lt;bochs:2&gt; x /4 0x00000000<br />[bochs]:<br />0x00000000 &lt;bogus+ 0&gt;: 0x00000020 0x00000000 0x00000000 0x00000000<br />下面的做法都会导致出错：<br />&lt;bochs:1&gt; setpmem 0x00000000 0x3 0x112233<br />Error: setpmem: bad length value = 3<br />&lt;bochs:2&gt; setpmem 0x00000000 0x8 0x11223344<br />Error: setpmem: bad length value = 8 <br />crc [start] [end] 显示物理地址start到end之间数据的CRC。 </p><p> 六 寄存器操作<br />set $reg = val 设置寄存器的值。现在版本可以设置的寄存器包括：<br />eax ecx edx ebx esp ebp esi edi<br />暂时不能设置：<br />eflags cs ss ds es fs gs <br />r|reg|registers reg = val 同上。 <br />dump_cpu 显示完整的CPU信息。 <br />set_cpu 设置CPU状态，这里可以设置dump_cpu所能显示出来的所有CPU状态。 </p><p>七 反汇编命令 <br />u|disas|disassemble [/num] [start] [end]<br />反汇编物理地址start到end 之间的代码，如<br />果不指定参数则反汇编当前EIP指向的代码。<br />num是可选参数，指定处理的代码量。<br />set $disassemble_size = 0|16|32 $disassemble_size变量指定反汇编使用的段大小。 <br />set $auto_disassemble = 0|1 $auto_disassemble决定每次执行中断下来的时候（例如遇到断点、Ctrl-C等）是否反汇编当前指令。</p><p>八 其他命令<br />trace-on|trace-off Tracing开关打开后，每执行一条指令都会将反汇编的结果<br />显示出来。 <br />ptime 显示Bochs自本次运行以来执行的指令条数。 <br />sb [val] 再执行val条指令就中断。val是64-bit整数，以L结尾，形如“1000L” <br />sba [val] 执行到Bochs自本次运行以来的第val条指令就中断。val是64-bit整数，以L结尾，形如“1000L” <br />modebp 设置切换到v86模式时中断。 <br />record [&quot;filename&quot;] 将输入的调试指令记录到文件中。文件名必须包含引号。 <br />playback [&quot;filename&quot;] 回放record的记录文件。文件名必须包含引号。 <br />print-stack [num] 显示堆栈，num默认为16，表示打印的条数。 <br />?|calc 和WinDBG的“?”命令类似，计算表达式的值。 <br />load-symbols [global] filename [offset]<br />载入符号文件。如果设定了“global”关键字，则符号针对所有上下文都有效。offset会默认加到所有的symbol地址上。symbol文件的格式为：&quot;%x %s&quot;。</p><p>九 info命令<br />info program 显示程序执行的情况。<br />info registers|reg|r 显示寄存器的信息。<br />info pb|pbreak|b|break 相当于blist<br />info dirty 显示脏页的页地址。<br />info cpu 显示所有CPU寄存器的值。<br />info fpu 显示所有FPU寄存器的值。<br />info idt 显示IDT。<br />info gdt [num] 显示GDT。<br />info ldt 显示LDT。<br />info tss 显示TSS。<br />info pic 显示PIC。<br />info ivt [num] [num] 显示IVT。<br />info flags 显示状态寄存器。<br />info cr 显示CR系列寄存器。<br />info symbols 显示symbol信息。<br />info ne2k|ne2000 显示虚拟的ne2k网卡信息。</p>]]></description>
			<author><![CDATA[dummy@example.com (batsom)]]></author>
			<pubDate>Fri, 26 Aug 2022 06:02:48 +0000</pubDate>
			<guid>http://www.gentoo-zh.org/viewtopic.php?pid=307#p307</guid>
		</item>
	</channel>
</rss>
