bochs 中文文档 下载 App

调试器开关与参数——magic break、调试器日志和编译开关

bochsrc 里的调试器关键字

magic_break

magic_break: enabled=1, value=0x8a888a88

magic break 是一个软件触发调试器的机制。当客户机向 I/O 端口 0x8a88 写入指定 value 时(32 位,默认 0x8a888a88),Bochs 会立即停住进入调试器。

OS 开发者常用它在自己的内核代码里加一个调试断点:

// 内核里
void bochs_magic_break(void) {
    asm volatile ("outl %0, $0x8a88" :: "a"(0x8a888a88));
}

内核执行到这行时,模拟会立刻停住,你可以在调试器里检查当前状态——比地址断点更灵活(地址可能随编译变化,但 I/O 端口固定)。

debugger_log

debugger_log: bochsdbg-commands.log

把调试器里输入的所有命令和输出都记录到文件。用于:

编译开关决定调试器能力

Bochs 的调试器不是运行时可选的——编译时决定了就定了。三个核心开关:

--enable-debugger(必须)

编译时必须加这个开关才能得到带调试器的 bochs。Windows 官方二进制自带 bochsdbg.exe,但 Linux/macOS 上如果你用 distro 包管理器装(如 apt install bochs),通常不带调试器——必须自己编译。

验证方法:运行 bochsdbg -q 或 bochs -q,看是否停在 bochs:1> 提示。

--enable-disasm(强烈推荐)

内置反汇编器。没有这个开关,调试器的 u(disassemble)命令会报错"disassembler not available"。

OS 开发时实时看 CPU 在跑什么指令是刚需——这个开关必开。

--enable-readline(推荐)

让调试器命令行支持 GNU readline:

没有 readline 也能跑,但每次打错命令得整行重输,烦死人。

编译前确保系统有 readline 开发库(Debian: libreadline-dev,macOS: brew install readline)。

编译开关示例

./configure \
  --enable-debugger \
  --enable-disasm \
  --enable-x86-64 \
  --enable-readline \
  --disable-plugins

make -j$(nproc)

验证编译结果:

./bochs -q
bochs:1> show feature
feature: debugger, disasm, x86-64
bochs:2> help disassemble
disassemble:  Disassemble the instruction at current EIP...

看到 debugger 和 disasm 在 feature 列表里,help disassemble 能正常输出——编译成功。

bochsrc 里的其他调试相关项

cpu: ... exception_on_unimplemented=1, ignore_bad_msr=0