怎么用gdb和bochs调试内核

怎么用gdb和bochs调试内核,第1张

gdbstub可以使得Bochs程序在本地1234网络端口侦听接收gdb的命令,并且向gdb发送命令执行结果。从而我们可以利用gdb对Linux 011内核进行C语言级的调试。当然,Linux 011内核也需要进行使用-g选项重新编译。

14131 编译带gdbstub的Bochs系统{j,

Bochs用户手册中介绍了自行编译Bochs系统的方法。这里我们给出编译带gdbstub的Bochs系统的方法和步骤。首先从下面网站下载最新Bochs系统源代码(例如:bochs-22targz):U

使用tar对软件包解压后会在当前目录中生成一个bochs-22子目录。进入该子目录后带选项“--enable-gdb-stub”运行配置程序configure,然后运行make和make install即可,见如下所示:

[root@plinux bochs-22]# /configure --enable-gdb-stubI0B%

checking build system type i686-pc-linux-gnu7tY

checking host system type i686-pc-linux-gnuQ

checking target system type i686-pc-linux-gnu{

©OldLinux论坛 -- 有关早期Linux内核代码发展的论坛。M

[root@plinux bochs-22]# makeQ

[root@plinux bochs-22]# make installN

©OldLinux论坛 -- 有关早期Linux内核代码发展的论坛。ufVz

若在运行/configure时我们碰到一些问题而不能生成编译使用的Makefile文件,那么这通常是由于没有安装X window开发环境软件或相关库文件造成的。此时我们就必须先安装这些必要的软件。>1z<z

14132 编译带调试信息的Linux 011内核"jmg

通过把Bochs的模拟运行环境与gdb符号调试工具联系起来,我们既可以使用Linux 011系统下编译的带调试信息的内核模块来调试,也可以使用在RedHat 9环境下编译的011内核模块来调试。这两种环境下都需要对011内核源代码目录中所有Makefile文件进行修改,即在其中编译标志行上添加-g标志,并去掉链接标志行上的-s选项:2

LDFLAGS = -M -x // 去掉 -s 标志。XJFU)Y

CFLAGS =-Wall -O -g -fomit-frame-pointer / // 添加 -g 标志。iMN

进入内核源代码目录后,利用find命令我们可以找到以下所有需要修改的Makefile文件:_6

[root@plinux linux-011]# find / -name MakefileSn^

/fs/Makefile-

/kernel/Makefile/"`p%

/kernel/chr_drv/Makefile(pyM

/kernel/math/MakefileV

/kernel/blk_drv/Makefiles/CDu

/lib/Makefile[x~

/Makefile980

/mm/Makefile/zb

[root@plinux linux-011]#S9/Q

另外,由于此时编译出的内核代码模块中含有调试信息,因此system模块大小可能会超过写入内核代码映像文件的默认最大值SYSSIZE = 0x3000(定义在boot/bootsects文件第6行)。我们可以按以下方法修改源代码根目录中的Makefile文件中产生Image文件的规则,即把内核代码模块system中的符号信息去掉后再写入Image文件中,而原始带符号信息的system模块保留用作gdb调试器使用。注意,目标的实现命令需要以一个制表符(TAB)作为一行的开始。pP

Image: boot/bootsect boot/setup tools/system tools/build)=1

cp -f tools/system systemtmp=-&a

strip systemtmphQ6n0S

tools/build boot/bootsect boot/setup systemtmp $(ROOT_DEV) $(SWAP_DEV) > ImageA-)

rm -f systemtmpY3w[/@

sync9=P2n

©OldLinux论坛 -- 有关早期Linux内核代码发展的论坛。KuEo

当然,我们也可以把boot/bootsects和tools/buildc中的SYSSIZE值修改成0x8000来处理这种情况。ag4

14133 调试方法和步骤;M]3!

下面我们根据在现代Linux系统(例如RedHat 9)系统上和运行在Bochs中Linux 011系统上编译出的内核代码分别来说明调试方法和步骤。

1 调试现代Linux系统上编译出的Linux 011内核E

假设我们的Linux 011内核源代码根目录是linux-rh9-gdb/,则我们首先在该目录中按照上面方法修改所有Makefile文件,然后在linux-rh9-gdb/目录下创建一个bochs运行配置文件并下载一个配套使用的根文件系统映像文件。我们可以直接从网站下载已经设置好的如下软件包来做实验:

使用命令“tar zxvf linux-gdb-rh9-050619targz”解开这个软件包后,可以看到其中包含以下几个文件和目录:MX{-

©OldLinux论坛 -- 有关早期Linux内核代码发展的论坛。X

[root@plinux linux-gdb-rh9]# ll'5tfq

total 1600bJT~Q

-rw-r--r-- 1 root root 18055 Jun 18 15:07 bochsrc-fd1-gdbbxrcf%J2s

drwxr-xr-x 10 root root 4096 Jun 18 22:55 linux[dM&

-rw-r--r-- 1 root root 1474560 Jun 18 20:21 rootimage-011-for-orig8EIChk

-rwxr-xr-x 1 root root 35 Jun 18 16:54 run{gj

[root@plinux linux--gdb-rh9]#t|f

这里的bochs配置文件与其他Linux 011配置文件的主要区别是在文件头部添加有以下一行内容,表示当bochs使用这个配置文件运行时将在本地网络端口1234上侦听gdb调试器的命令:NhL

gdbstub: enabled=1, port=1234, text_base=0, data_base=0, bss_base=0J,i/6

运行这个实验的基本步骤如下:@EkQ

(1)启动X window系统后打开两个终端窗口;(mPN

(2)在一个窗口中,把工作目录切换进linux-gdb-rh9/目录中,并运行程序“/run”,此时该窗口中会显示一条等待gdb来连接的信息:“Wait for gdb connection on localhost:1234”,并且系统会创建一个Bochs主窗口(此时无内容);1P=VI<

(3)在另一个窗口中,我们把工作目录切换到内核源代码目录中linux-gdb-rh9/linux/,并运行命令:“gdb tools/system”;iDqm8

(4)在运行gdb的窗口中键入命令“break main”和“target remote localhost:1234”,此时gdb会显示已经连接到Bochs的信息;p

(5)在gdb环境中再执行命令“cont”,稍过一会gdb会显示程序停止在init/mainc的main()函数处。v3L2

下面是运行gdb和在其中执行的一些命令示例。[2;jS

[root@plinux linux]# gdb tools/system hI/

GNU gdb Red Hat Linux (53post-02002112918rh)!mC}

Copyright 2003 Free Software Foundation, Inc|3

GDB is free software, covered by the GNU General Public License, and you areC$NY4

welcome to change it and/or distribute copies of it under certain conditionsboNdAL

Type "show copying" to see the conditions3[nfHW

There is absolutely no warranty for GDB Type "show warranty" for details'1-V

This GDB was configured as "i386-redhat-linux-gnu"Oq&[

(gdb) break main }<;

Breakpoint 1 at 0x6621: file init/mainc, line 110+%!]{

(gdb) target remote localhost:12342 yc

Remote debugging using localhost:1234X6X&7

0x0000fff0 in sys_mkdir (pathname=0x0, mode=0) at nameic:481(

481 nameic: No such file or directory5QU

in nameic&%P'

(gdb) cont Pv'/S$

ContinuingP:O_{

Breakpoint 1, main () at init/mainc:110

110 ROOT_DEV = ORIG_ROOT_DEV;T7PkpD

(gdb) list 5XT

105 { / The startup routine assumes (well, ) this /2L$

106 /_c

107 Interrupts are still disabled Do necessary setups, then)Z0k

108 enable themjZ@+wn

109 /u

110 ROOT_DEV = ORIG_ROOT_DEV;d&!`

111 drive_info = DRIVE_INFO;#yRW,

112 memory_end = (1<<20) + (EXT_MEM_K<<10);9Uaw

113 memory_end &= 0xfffff000;`v8fAR

114 if (memory_end > 1610241024)lA#

(gdb) next DHzM

111 drive_info = DRIVE_INFO;X

(gdb) next +S:q

112 memory_end = (1<<20) + (EXT_MEM_K<<10);iXdDt

(gdb) print /x ROOT_DEV <W<

$3 = 0x21d }{%Q

(gdb) quit |

The program is running Exit anyway (y or n) yt

[root@plinux linux]#lixBs

=====================================================

141 利用bochs调试内核%UU

Bochs具有非常强大的 *** 作系统内核调试功能。这也是本文选择Bochs作为首选实验环境的主要原因之一。有关Bochs调试功能的说明参见前面142节,这里基于Linux 011内核来说明Windows环境下Bochs系统调试 *** 作的基本方法。m[2

1411 运行Bochs调试程序g8O

我们假设Bochs系统已被安装在目录“C:/Program Files/Bochs-211/”中,并且Linux 011系统的Bochs配置文件名称是bochsrc-hdbxrc。现在在包含内核Image文件的目录下建立一个简单的批处理文件runbat,其内容如下:R

"C:/Program Files/Bochs-211/bochsdbg" -q -f bochsrc-hdbxrcjFypV+

其中bochsdbg是Bochs系统的调试执行程序。运行该批处理命令即可进入调试环境。此时Bochs的主显示窗口空白,而控制窗口将显示以下类似内容:D8v~

C:/Documents and Settings/john1/桌面/Linux-011>"C:/Program Files/Bochs-211/boRW6RNY

chsdbg" -q -f bochsrc-hdbxrc2

========================================================================`)2os

Bochs x86 Emulator 2113$O@R

February 08, 2004x2

========================================================================/26c3(

00000000000i[ ] reading configuration from bochsrc-hdbxrcq4

00000000000i[ ] installing win32 module as the Bochs GUI4UW

00000000000i[ ] Warning: no rc file specified1dsv

00000000000i[ ] using log file bochsouttxtmM

Next at t=0

(0) context not implemented because BX_HAVE_HASH_MAP=0c

[0x000ffff0] f000:fff0 (unk ctxt): jmp f000:e05b ; ea5be000f0g$

<bochs:1>i/

此时Bochs调试系统已经准备好开始运行,CPU执行指针已指向ROM BIOS中地址0x000fffff0处的指令处。其中'<bochs:1>'是命令输入提示符,其中的数字表示当前的命令序列号。在命令提示符'<bochs:1>'后面键入'help'命令,可以列出调试系统的基本命令。若要了解某个命令的具体使用方法,可以键入'help'命令并且后面跟随一个用单引号括住的具体命令,例如:“help 'vbreak'”,如下面所示。V7

<bochs:1> help@n{L(

help - show list of debugger commands5&6^

help 'command'- show short command description~B

-- Debugger control --e!/;l

help, q|quit|exit, set, instrument, show, trace-on, trace-off,u7J

record, playback, load-symbols, slistr2:

-- Execution control --pOHjE

c|cont, s|step|stepi, p|n|next, modebpj

-- Breakpoint management --|EQ

v|vbreak, lb|lbreak, pb|pbreak|b|break, sb, sba, blist,dL/rBI

bpe, bpd, d|del|deleteyR%|

-- CPU and memory contents --xsMy

x, xp, u|disas|disassemble, r|reg|registers, setpmem, crc, info, dump_cpu,@|'p

set_cpu, ptime, print-stack, watch, unwatch, |calc7

<bochs:2> help 'vbreak'_t<#o

help vbreak/

vbreak seg:off - set a virtual address instruction breakpoint0

<bochs:3>flx+

为了让Bochs直接模拟执行到Linux的引导启动程序开始处,我们可以先使用断点命令在0x7c00处设置一个断点,然后让系统连续运行到0x7c00处停下来。执行的命令序列如下:Xfk

<bochs:3> vbreak 0x0000:0x7c00hDzuWy

<bochs:4> cfMH/'X

(0) Breakpoint 1, 0x7c00 (0x0:0x7c00))W&

Next at t=4409138<-0m5

(0) [0x00007c00] 0000:7c00 (unk ctxt): mov ax, 0x7c0 ; b8c007b 03

<bochs:5>3R28Q

此时,CPU执行到boots程序开始处的第1条指令处,Bochs主窗口将显示出“Boot From floppy”等一些信息。现在,我们可以利用单步执行命令's'或'n'(不跟踪进入子程序)来跟踪调试程序了。在调试时可以使用Bochs的断点设置命令、反汇编命令、信息显示命令等来辅助我们的调试 *** 作。下面是一些常用命令的示例:J'P

<bochs:8> u /10 # 反汇编从当前地址开始的10条指令。,S/2

00007c00: ( ): mov ax, 0x7c0 ; b8c007Wvl

00007c03: ( ): mov ds, ax ; 8ed8)1f

00007c05: ( ): mov ax, 0x9000 ; b80090WmD1

00007c08: ( ): mov es, ax ; 8ec0(`|

00007c0a: ( ): mov cx, 0x100 ; b90001iW1|1

00007c0d: ( ): sub si, si ; 29f6ze_QZY

00007c0f: ( ): sub di, di ; 29ffZStl

00007c11: ( ): rep movs word ptr [di], word ptr [si] ; f3a5=yF

00007c13: ( ): jmp 9000:0018 ; ea18000090!sPR9

00007c18: ( ): mov ax, cs ; 8cc8(

<bochs:9> info r # 查看当前CPU寄存器的内容aM>/D

eax 0xaa55 436057a@`_

ecx 0x110001 1114113/$3$K"

edx 0x0 00j3G

ebx 0x0 0gE

esp 0xfffe 0xfffee7{

ebp 0x0 0x0]lX

esi 0x0 0m

edi 0xffe4 65508TD}Zo

eip 0x7c00 0x7c00e

eflags 0x282 642Wlg

cs 0x0 0b s=]

ss 0x0 0=Z'

ds 0x0 02R;%

es 0x0 0!

fs 0x0 0BX/

gs 0x0 0D)}n{

有时对电脑使用了优化以后会造成打印后台程序不能运行,请按下法试一下,看看能不能解决: 点击“开始”->“运行”,输入“Servicesmsc”后点击“确定”,打开“服务”对话框,找到print spooler这个项目,看看其状态是不是“已启动”。如果没有“已启动”字样,可用鼠标右键点击该项,再在d出的对话框中点击“启动”即可。另外如果是“手动”再把它改成“自动”,否则即使你安装了打印机驱动也还是不能正常打印。

具体 *** 作步骤:

步骤1:安装模拟器主程序(这个就不用多说了,和普通安卓应用一样)

步骤2:将装有配置文件的sdl文件夹拷贝到机身内存根目录中(没有机身内存的手机请拷贝到sd卡中,不清楚拷贝到哪里的就用re管理器拷贝到手机根目录显示sdcard的文件夹里)

步骤3:将磁盘镜像文件改名为cimg,拷贝到步骤2中的sdl文件夹(要用什么系统就拷贝相应的镜像)

步骤4:运行安装好的模拟器主程序,没有问题的话就会开机运行 *** 作系统了

是不是你的Bochsrc没配置对啊,里面有两个文件

书上的容是:

romiamge:file=/usr/share/BIOS-boschs-latest

vgaromimage:file=/usr/share/vgabiosbin

我的电脑上就是这样的路径的

romiamge:file=/boch2xx//BIOS-boschs-latest

vgaromimage:file=/boch2xx//VGABIOS-lgpl-latest

也不晓得是不是我安装的时候改过参数还是怎么,反正我的路径就和书上的不一样,找到书上提到的那些个文件,BIOS-boschs-latest,vgabiosbin或VGABIOS-lgpl-latest,换过就行了

具体 *** 作步骤:

步骤1:安装模拟器主程序(这个就不用多说了,和普通安卓应用一样)

步骤2:将装有配置文件的SDL文件夹拷贝到机身内存根目录中(没有机身内存的手机请拷贝到SD卡中,不清楚拷贝到哪里的就用RE管理器拷贝到手机根目录显示sdcard的文件夹里)

步骤3:将磁盘镜像文件改名为cimg,拷贝到步骤2中的SDL文件夹(要用什么系统就拷贝相应的镜像)

步骤4:运行安装好的模拟器主程序,没有问题的话就会开机运行 *** 作系统了

以上就是关于怎么用gdb和bochs调试内核全部的内容,包括:怎么用gdb和bochs调试内核、安装好bochsh后怎么运行程序、安卓bochs怎么上网,还有怎么运行exe文件啊等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/zz/10623001.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-10
下一篇2023-05-10

发表评论

登录后才能评论

评论列表(0条)

    保存