搭建调试环境

简介: 搭建调试环境

前言

  • 【Welcome to KOS.】中,我们成功的运行了自己编写的主引导程序。但是,我们如何能调试代码呢?
  • 答案就是:Bochs

Bochs

简介

  • 专业模拟 x86 架构的虚拟机
  • 开源且高度可移植,由 C++ 编写而成
  • 支持操作系统开发过程中的断点调试
  • 通过简单的配置就能够运行绝大多数主流的操作系统

安装

  • Bochs 官网:https://sourceforge.net/projects/bochs/
  • 注意下载 linux 版的,要与开发环境一致,我的开发环境是 ubuntu 20.04
  • 将下好的安装包 bochs-xxx.tar.gz 拷贝到 linux 环境下
  • 由于安装包下载速度太慢,还容易失败,于是暂时用从网上非官方网址下了个 2.4.5 版本的安装包
  • 接下来的步骤都是基于 2.4.5 这个版本所遇到的问题,后面我又下载最新版本 2.7 ,发现新版本几乎没遇到啥问题。
  • bochs 2.7 版本遇到的问题看 补充
  • 解压

tar-zxvf xxx.tar.gz

  • 进入源码目录

cd xxx

  • 配置 Bochs(开启调试和反汇编功能)
# 第一个配置会导致后面安装时报错:
# cannot stat './bochsdbg': No such file or directory
# sudo ./configure --enable-debugger --enable-disasm
sudo ./configure --enable-disasm --enable-readline --enable-clgd54xx --enable-debugger --enable-ne2000
  • 出现错误
configure: error: C++ preprocessor "/lib/cpp" fails sanity check
  • 解决办法
sudo apt-get install build-essential
  • 再次配置 Bochs,又出现错误
ERROR: X windows gui was selected, but X windows libraries were not found.
  • 解决办法
sudo apt-get install xorg-dev
  • 再次配置 Bochs,居然又出现错误了
ERROR: pkg-config was not found, or unable to access the gtk+-2.0 package.
  • 解决办法

sudo apt-get install libgtk2.0-dev

  • 再次重新配置 Bochs ,这回终于没有错误了
  • 编译

sudo make

  • 编译也出错啦
/usr/bin/ld: gui/libgui.a(gtk_enh_dbg_osdep.o): undefined reference to symbol 'pthread_create@@GLIBC_2.2.5'
/usr/bin/ld: /lib/x86_64-linux-gnu/libpthread.so.0: error adding symbols: DSO missing from command line
collect2: error: ld returned 1 exit status
make: *** [Makefile:181: bochs] Error 1
  • 解决办法
# 修改 Makefile,编译加 -lpthread 参数
# CC = gcc
CC = gcc -lpthread
# CXX = g++
CXX = g++ -lpthread
  • 再次 make ,由出现新的问题了
openjade:/home/lighthouse/software/bochs-2.4.5/doc/docbook/./documentation/documentation.dbk:10:55:W: cannot generate system identifier for public text "-//OASIS//DTD DocBook V4.1//EN"
openjade:/home/lighthouse/software/bochs-2.4.5/doc/docbook/./documentation/documentation.dbk:16:0:E: reference to entity "BOOK" for which no system identifier could be generated
openjade:/home/lighthouse/software/bochs-2.4.5/doc/docbook/./documentation/documentation.dbk:10:0: entity was defined here
openjade:/home/lighthouse/software/bochs-2.4.5/doc/docbook/./documentation/documentation.dbk:16:0:E: DTD did not contain element declaration for document type name
openjade:/home/lighthouse/software/bochs-2.4.5/doc/docbook/./documentation/documentation.dbk:18:5:E: element "BOOK" undefined
openjade:/home/lighthouse/software/bochs-2.4.5/doc/docbook/./documentation/documentation.dbk:19:9:E: element "BOOKINFO" undefined
openjade:/home/lighthouse/software/bochs-2.4.5/doc/docbook/./documentation/documentation.dbk:20:9:E: element "TITLE" undefined
openjade:/home/lighthouse/software/bochs-2.4.5/doc/docbook/./documentation/documentation.dbk:21:15:E: element "AUTHORGROUP" undefined
...
  • 这个问题网上找了半天都找不到解决办法,只能自己瞎尝试,万幸解决了,只需要把 “openjade” 软件卸载然后重新安装就可以了

sudo apt-get autoremove openjade

sudo apt-get install openjade

  • 这下终于 make 编译成功了,接下来就是 安装了

sudo make install

  • 安装也出问题了,就没有不出问题的步骤

install: cannot stat './bochsdbg': No such file or directory

make: [Makefile:351: install_bin] Error 1 (ignored)

  • 解决办法

# 把 bochs 文件改名为 bochsdbg

cp bochs bochsdbg

  • 你以为这样就结束了? too naive 了。果然再次 make install 安装又有新的问题了

mkdir: cannot create directory ‘/usr/local/share/bochs/keymaps’: File exists

make: [Makefile:367: install_share] Error 1 (ignored)

  • 解决办法

sudo rm usr/local/share/bochs/keymaps -rf

  • 再次重新 make install 安装,这回终于没问题了,至此 bochs 软件终于安装完成了

启动配置文件

  • 前面我们经历了那么多的波折,终于把 Bochs 软件安装完成了,接下了我们尝试启动一下 Bochs 试试
  • Bochs 启动仅需要输入 bochs 命令即可

bochs

  • 输入:6 ,选择 Begin simulation
lighthouse@VM-16-17-ubuntu:~/software/bochs-2.4.5$ bochs
========================================================================
                      Bochs x86 Emulator 2.4.5
              Build from CVS snapshot, on April 25, 2010
========================================================================
00000000000i[     ] reading configuration from .bochsrc
00000000000e[     ] .bochsrc:366: ataX-master/slave CHS set to 0/0/0 - autodetection enabled
------------------------------
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

  • 不出意外的话,肯定会出现意外

  • 原因就是缺少了启动配置文件,或者说是启动配置文件错误导致
  • 启动 bochs 虚拟机有两种方式
  • 显式方式,通过 -f 参数显性的指出配置文件 bochsrc_file

bochs -f bochsrc_file

  • 隐式方式 [在当前路径下依次寻找 .bochsrc bochsrc bochsrc.txt 这三个文件,只要找到了一个,则使用该配置文件,不再管是否有其它配置文件]

bochs

  • 这里提供一个 Bochs 配置文件(2.4.5 版本),适配软盘启动:bochsrc.floppy
  • 这个时候我们再次输入命令 “ bochs -f bochsrc.floppy ”,这回就没有任何错误提示了
  • 上面的执行会用到【Welcome to KOS.】中生成的 a.img ,这个 a.img 是一个虚拟软盘。软盘已经几乎被硬盘淘汰了,下面我们创建一个虚拟硬盘,输入命令:bximage 即可,在创建虚拟盘之前,先提供一个适配硬盘启动的 Bochs 配置文件(2.45 版本):bochsrc.disk
  • 使用 bximage 创建一个虚拟硬盘,直接输入命令 'bximage'
========================================================================
                                bximage
  Disk Image Creation / Conversion / Resize and Commit Tool for Bochs
        $Id: bximage.cc 14091 2021-01-30 17:37:42Z sshwarts $
========================================================================
1. Create new floppy or hard disk image
2. Convert hard disk image to other format (mode)
3. Resize hard disk image
4. Commit 'undoable' redolog to base image
5. Disk image info
0. Quit
Please choose one [0] 1
Create image
Do you want to create a floppy disk image or a hard disk image?
Please type hd or fd. [hd] hd
What kind of image should I create?
Please type flat, sparse, growing, vpc or vmware4. [flat] flat
Choose the size of hard disk sectors.
Please type 512, 1024 or 4096. [512] 512
Enter the hard disk size in megabytes, between 10 and 8257535
[10] 60
What should be the name of the image?
[c.img] a.img
Creating hard disk image 'a.img' with CHS=121/16/63 (sector size = 512)
The following line should appear in your bochsrc:
  ata0-master: type=disk, path="a.img", mode=flat
  • 我们看到最后一行提示信息 “ata0-master: type=disk, path="a.img", mode=flat”,这个在我们的 bochsrc.disk 中可以看到。
  • 使用 dd 命令将编译得到的 boot.bin 写入到硬盘 a.img 中:

dd if=boot.bin of=a.img bs=512 count=1 conv=notrunc

  • 不管是软盘启动还是硬盘启动,我们在执行 “ bochs -f bochsrc_file ” 后选择 “ 6. Begin simulation ” ,然后就是一个黑窗口,啥也没有,不是应该打印 “ Welcome to KOS. ” 提示信息的吗?
  • 哈哈哈,这恰恰是我们的调试环境搭建成功的一种体现,试想一下我们在 windows 中用到的开发工具,我们点击仿真按钮后程序是不是也会停在程序开始处不再运行了,需要手动运行才行,这里也是一样的哦,输入命令“ c ” 或者 “ continue ” ,然后就成功看到了 “ Welcome to KOS. ”
  • 补充
  • bochs 2.7 版本安装后运行遇到的问题

  • 从提示中看出 .bochsrc 文件中 “keyboard_mapping” 应该改成 “keyboard”
  • 改完后这个问题果然就解决了,但是又遇到了新的问题

  • 这个应该是版本迭代的问题,解决办法如下:
# keyboard_mapping: enabled=1, map=/usr/local/share/bochs/keymaps/x11-pc-us.map
keyboard: keymap=/usr/local/share/bochs/keymaps/x11-pc-us.map

常用的调试命令

  • Bochs 中的常用调试命令
命令 功能
s (step) 单步执行命令,用于执行一条指令,然后停下来,显示下一条即将执行的指令
b (break) 断点指令,所谓断点,就是事先设置一个 物理内存地址,当处理器执行到这个地址时,就自动停下来。例如,在主引导程序加载到物理内存地址 0x7c00 处打断点:b 0x7c00
c (continue) 持续执行,该命令要求处理器不间断地持续执行指令,如果设置了断点,会在断点处停下来
r (register) 显示通用寄存器的内容
sreg sreg 命令用来显示段寄存器的内容
xp xp(eXamine memory at Physical address)命令用来显示指定物理内存地址处的内容(xp 命令每次只显示一个双字)。显示一个双字:xp 0xB8000 ;显示两个双字:xp/2 0xB8000 ;显示 n 个双字:xp/n 0xB8000
q (quit) 退出 Bochs 调试过程
n 使用 n 命令,可以让 Bochs 自动完成循环过程,并在循环体外的下一条指令前停住。在执行 rep movsb、rep movsw 和 loop 指令的时候,它们可能会重复执行或循环成千上万次,使用单步调试会很麻烦,也使得我们无法调试循环体后面的程序,这时就可以使用 n 命令来快速结束循环过程,指向循环体外的下一条指令(另一方法,使用 b 命令打断点在循环体外的程序)
u u 命令是反汇编命令(反汇编的意思是根据机器指令代码生成可读的汇编语言指令,正好与汇编过程相反。),u 命令可以使用两个参数:1). 第一个参数是跟在 / 后面的数字,指定反汇编出多少条指令,如:u/2 ;2). 第二个参数用于指定一个内存地址,Bochs 从这里开始反汇编操作 u 命令执行后,会显示反汇编出来的汇编指令以及各自所在的物理地址,这时可以使用 b 命令打断点,然后再用 c 命令来连续执行
info info 命令可以显示多种类型的处理器信息,显示标志寄存器的状态。“info eflags” 可以显示标志寄存器的状态;标志名称为小写,则说明该标志为“0”,标志名称为大写,则说明该标志为“1”,(intel8086 的标志寄存器为 FLAGS,在 32 位处理器上扩展为 EFLAGS)“info gdt” 命令用来查看全局描述符表 GDT 的内容
print-stack 在 Bochs 中 print-stack 是查看栈的命令,它可以带一个参数,用于指定显示多少数据。如果不使用参数,则默认显示当前栈中的 16 个字
creg 命令 creg (control register)可以用来查看控制寄存器的内容
目录
相关文章
|
6月前
|
NoSQL 编译器 开发工具
音视频源码调试前准备vs2019+qt5.15.2搭建可调试环境
音视频源码调试前准备vs2019+qt5.15.2搭建可调试环境
164 0
|
消息中间件 NoSQL 前端开发
应用系统服务安装全过程(从基础搭建框架到部署运行)
应用系统服务安装全过程(从基础搭建框架到部署运行)
226 0
应用系统服务安装全过程(从基础搭建框架到部署运行)
|
Ubuntu Linux iOS开发
搭建Python开发环境详细步骤
搭建Python开发环境详细步骤
374 0
|
前端开发 Java API
如何使用线上环境进行本地代码调试
如何使用线上环境进行本地代码调试
526 0
|
消息中间件 存储 JSON
源码环境调试|学习笔记
快速学习源码环境调试
源码环境调试|学习笔记
|
缓存 小程序 前端开发
小程序云开发和调试 | 学习笔记
快速学习小程序云开发和调试
小程序云开发和调试 | 学习笔记
|
Arthas 监控 IDE
《Arthas系列一》搭建调试环境,千里之行始于足下
《Arthas系列一》最简单的调试环境
375 0
《Arthas系列一》搭建调试环境,千里之行始于足下
|
JSON 前端开发 JavaScript
|
前端开发 IDE 测试技术
|
存储 前端开发 Java