找回密码
 注册
搜索
热搜: 回贴
微赢网络技术论坛 门户 服务器 Linux/BSD 查看内容

怎么用gdb和bochs调试内核

2009-12-20 13:11| 发布者: admin| 查看: 118| 评论: 0|原作者: 江月


OldLinux
»
Linux 0.1X系统的建立和实验
» [求助]怎么用gdb和bochs调试内核啊?真难
2005-10-14 20:15 liudows
[求助]怎么用gdb和bochs调试内核啊?真难
我看了一些帖子,知道要用gdb和bochs调试的话,要将bochs插桩,也就是将bochs和gdbstub一起重新编译一下,也知道要修改configure文件。但是却始终没有成功,编译过程中就报错。
我的问题是编译的时候要将gdb_stub的源文件放在什么地方啊?bochs的文档上之说在configure中加上--enable-gdb-stub就行了。但是gdbstub的源代码放在哪里呢?怎么告诉gcc去找gdbstub的源代码呢?应该不用在Makefile中手工加入吧。
2005-10-15 00:07 lgr
[求助]怎么用gdb和bochs调试内核啊?真难
估计赵博新书出来的时候会有详细的配置说明
2005-10-16 16:50 redgrid
[求助]怎么用gdb和bochs调试内核啊?真难
利用GDB和Bochs调试内核源代码
本节说明如何在现有Linux系统(例如RedHat 9)上使用Bochs模拟运行环境和gdb工具来调试Linux 0.11内核源代码。在使用这个方法之前,你的Linux系统上应该已经安装有X window系统。由于Bochs网站提供的RPM安装包中的Bochs执行程序没有编译进与gdb调试器进行通信的gdbstub模块,因此我们需要下载Bochs源代码来自行编译。
gdbstub可以使得Bochs程序在本地1234网络端口侦听接收gdb的命令,并且向gdb发送命令执行结果。从而我们可以利用gdb对Linux 0.11内核进行C语言级的调试。当然,Linux 0.11内核也需要进行使用-g选项重新编译。
14.13.1 编译带gdbstub的Bochs系统
Bochs用户手册中介绍了自行编译Bochs系统的方法。这里我们给出编译带gdbstub的Bochs系统的方法和步骤。首先从下面网站下载最新Bochs系统源代码(例如:bochs-2.2.tar.gz):
http://sourceforge.net/projects/bochs/
使用tar对软件包解压后会在当前目录中生成一个bochs-2.2子目录。进入该子目录后带选项“--enable-gdb-stub”运行配置程序configure,然后运行make和make install即可,见如下所示:
[root@plinux bochs-2.2]# ./configure --enable-gdb-stub
checking build system type... i686-pc-linux-gnu
checking host system type... i686-pc-linux-gnu
checking target system type... i686-pc-linux-gnu
...
[root@plinux bochs-2.2]# make
[root@plinux bochs-2.2]# make install
若在运行./configure时我们碰到一些问题而不能生成编译使用的Makefile文件,那么这通常是由于没有安装X window开发环境软件或相关库文件造成的。此时我们就必须先安装这些必要的软件。
14.13.2 编译带调试信息的Linux 0.11内核
通过把Bochs的模拟运行环境与gdb符号调试工具联系起来,我们既可以使用Linux 0.11系统下编译的带调试信息的内核模块来调试,也可以使用在RedHat 9环境下编译的0.11内核模块来调试。这两种环境下都需要对0.11内核源代码目录中所有Makefile文件进行修改,即在其中编译标志行上添加-g标志,并去掉链接标志行上的-s选项:
LDFLAGS = -M -x // 去掉 -s 标志。
CFLAGS =-Wall -O -g -fomit-frame-pointer \ // 添加 -g 标志。
进入内核源代码目录后,利用find命令我们可以找到以下所有需要修改的Makefile文件:
[root@plinux linux-0.11]# find ./ -name Makefile
./fs/Makefile
./kernel/Makefile
./kernel/chr_drv/Makefile
./kernel/math/Makefile
./kernel/blk_drv/Makefile
./lib/Makefile
./Makefile
./mm/Makefile
[root@plinux linux-0.11]#
另外,由于此时编译出的内核代码模块中含有调试信息,因此system模块大小可能会超过写入内核代码映像文件的默认最大值SYSSIZE = 0x3000(定义在boot/bootsect.s文件第6行)。我们可以按以下方法修改源代码根目录中的Makefile文件中产生Image文件的规则,即把内核代码模块system中的符号信息去掉后再写入Image文件中,而原始带符号信息的system模块保留用作gdb调试器使用。注意,目标的实现命令需要以一个制表符(TAB)作为一行的开始。
Image: boot/bootsect boot/setup tools/system tools/build
cp -f tools/system system.tmp
strip system.tmp
tools/build boot/bootsect boot/setup system.tmp $(ROOT_DEV) $(SWAP_DEV) > Image
rm -f system.tmp
sync
当然,我们也可以把boot/bootsect.s和tools/build.c中的SYSSIZE值修改成0x8000来处理这种情况。
14.13.3 调试方法和步骤
下面我们根据在现代Linux系统(例如RedHat 9)系统上和运行在Bochs中Linux 0.11系统上编译出的内核代码分别来说明调试方法和步骤。
1 调试现代Linux系统上编译出的Linux 0.11内核
假设我们的Linux 0.11内核源代码根目录是linux-rh9-gdb/,则我们首先在该目录中按照上面方法修改所有Makefile文件,然后在linux-rh9-gdb/目录下创建一个bochs运行配置文件并下载一个配套使用的根文件系统映像文件。我们可以直接从网站下载已经设置好的如下软件包来做实验:
http://oldlinux.org/Linux.old/bo ... b-rh9-050619.tar.gz
使用命令“tar zxvf linux-gdb-rh9-050619.tar.gz”解开这个软件包后,可以看到其中包含以下几个文件和目录:
[root@plinux linux-gdb-rh9]# ll
total 1600
-rw-r--r-- 1 root root 18055 Jun 18 15:07 bochsrc-fd1-gdb.bxrc
drwxr-xr-x 10 root root 4096 Jun 18 22:55 linux
-rw-r--r-- 1 root root 1474560 Jun 18 20:21 rootimage-0.11-for-orig
-rwxr-xr-x 1 root root 35 Jun 18 16:54 run
[root@plinux linux--gdb-rh9]#
这里的bochs配置文件与其他Linux 0.11配置文件的主要区别是在文件头部添加有以下一行内容,表示当bochs使用这个配置文件运行时将在本地网络端口1234上侦听gdb调试器的命令:
gdbstub: enabled=1, port=1234, text_base=0, data_base=0, bss_base=0
运行这个实验的基本步骤如下:
(1).启动X window系统后打开两个终端窗口;
(2).在一个窗口中,把工作目录切换进linux-gdb-rh9/目录中,并运行程序“./run”,此时该窗口中会显示一条等待gdb来连接的信息:“Wait for gdb connection on localhost:1234”,并且系统会创建一个Bochs主窗口(此时无内容);
(3).在另一个窗口中,我们把工作目录切换到内核源代码目录中linux-gdb-rh9/linux/,并运行命令:“gdb tools/system”;
(4).在运行gdb的窗口中键入命令“break main”和“target remote localhost:1234”,此时gdb会显示已经连接到Bochs的信息;
(5).在gdb环境中再执行命令“cont”,稍过一会gdb会显示程序停止在init/main.c的main()函数处。
下面是运行gdb和在其中执行的一些命令示例。
[root@plinux linux]# gdb tools/system
GNU gdb Red Hat Linux (5.3post-0.20021129.18rh)
Copyright 2003 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you are
welcome to change it and/or distribute copies of it under certain conditions.
Type "show copying" to see the conditions.
There is absolutely no warranty for GDB. Type "show warranty" for details.
This GDB was configured as "i386-redhat-linux-gnu"...
(gdb) break main
Breakpoint 1 at 0x6621: file init/main.c, line 110.
(gdb) target remote localhost:1234
Remote debugging using localhost:1234
0x0000fff0 in sys_mkdir (pathname=0x0, mode=0) at namei.c:481
481 namei.c: No such file or directory.
in namei.c
(gdb) cont
Continuing.
Breakpoint 1, main () at init/main.c:110
110 ROOT_DEV = ORIG_ROOT_DEV;
(gdb) list
105 { /* The startup routine assumes (well, ...) this */
106 /*
107 * Interrupts are still disabled. Do necessary setups, then
108 * enable them
109 */
110 ROOT_DEV = ORIG_ROOT_DEV;
111 drive_info = DRIVE_INFO;
112 memory_end = (1 16*1024*1024)
(gdb) next
111 drive_info = DRIVE_INFO;
(gdb) next
112 memory_end = (1
2005-10-16 17:59 liudows
[求助]怎么用gdb和bochs调试内核啊?真难
[这个贴子最后由liudows在 2005/10/16 08:37pm 第 1 次编辑]
太感谢赵博了!但我在做的时候碰到一个问题:g d b 连接到bochs后,执行cont指令,显示一行:
reply contains invalid hex digit 78,也没有源代码的显示,请问这是怎么回事呢?
是bochs编译得有问题吗?我是按照上面说的方法编译的啊.
2005-10-16 21:13 liudows
[求助]怎么用gdb和bochs调试内核啊?真难
现在所有的步骤都正确执行了,gdb能够和bochs连接了,但是linux0.11在运行的时候,却在启动过程中出现页错误,具体信息是:
program received signal 0, Signale 0.
0x0000a0ec in page_fault().
2005-11-18 12:00 liuken
[求助]怎么用gdb和bochs调试内核啊?真难
program received signal 0, Signale 0.
0x0000a0ec in page_fault().
I got the problem too.
2005-12-10 12:33 chlputi
[求助]怎么用gdb和bochs调试内核啊?真难
我在运行的时候也出现了同样的问题,进行不下去了,急切盼望赵博的指导!
另外,我还有两个疑问:
1、为什么是gdb tools/system而不是gdb Image呢?调试system模块的时候,boot和setup模块是否被预先被运行了?
2、调试的时候:
110 ROOT_DEV = ORIG_ROOT_DEV;
111 drive_info = DRIVE_INFO;
112 memory_end = (1 16*1024*1024)
115 memory_end = 16*1024*1024;
这里memory_end我发现并没有获得应有的值,用print memory_end得到的结果是0,难以索解。
盼望赵博给点指导
致谢!
2005-12-10 12:45 chlputi
[求助]怎么用gdb和bochs调试内核啊?真难
第二个问题是我自己看错了,汗
已经可以调试了,不过第一个问题还是不明白,希望给解释一下
2006-2-17 17:10 oldlinuxws
[求助]怎么用gdb和bochs调试内核啊?真难
顶一下
2006-2-22 23:31 lidan1113
[求助]怎么用gdb和bochs调试内核啊?真难
第一个问题是这样的:
gdb tools/system命令的主要目的是装入符号表,而符号信息只存在于system目标文件中,Image文件是内核映像文件,不包含符号信息。
你可以用下面的命令系列来执行,可能更容易理解。
gdb (直接进入gdb)
target remote localhost:1234 (设置远程主机)
symbol-file tools/system (装入符号表信息)
其实代码是在远程主机(bochs)上执行的,在本地主机上运行的gdb,它只需要符号表信息就OK了。
不知道我理解的对不对,呵呵,另外我的问题还请DX帮忙回答一下。
2006-12-26 20:43 washion0058
[求助]怎么用gdb和bochs调试内核啊?真难
有天,我去下了个windows版的bochs,也想用GDB连上去调试,晕菜...里面一大堆错误,改了几个也懒得改了..也去下个LINUX版的来弄..
2007-1-12 13:41 bamu1984
[求助]怎么用gdb和bochs调试内核啊?真难
各位大虾:
program received signal 0, Signale 0.
0x0000a0ec in page_fault().
这个有人解决了吗? 我的gdb随机的在这儿中断了。
2007-4-8 17:31 dingdayong
[求助]怎么用gdb和bochs调试内核啊?真难
缺页中断是正常的处理,狂按enter将对应的数据加载到内存中就过去了。
2007-7-27 13:35 limbo
赵博所说的方法断点是设在main的,有没有可以直接设成 b *0x7c00 来跟踪bootsector.s? I tried but
always was told to stop in the fork.c file ? Why?
2007-7-27 16:35 gohigh
调试bootsect.s 可以直接使用Bochs的调试功能来调试,无须使用gdb。因为本身就是汇编语言。
bochsdbg -q -f bochssrc-hd.bxrc
参见书中第17章(或电子版第14章)“利用bochs调试内核”一节。
2007-8-26 15:40 wutongshu
这个问题有解了吗?期待中...
program received signal 0, Signale 0.
0x0000a0ec in page_fault().
调试停顿
2007-9-30 16:40 hlg
忽略信号-“signal 0”
************************************************
[求助]怎么用gdb和bochs调试内核啊?真难
program received signal 0, Signale 0.
0x0000a0ec in page_fault().
I got the problem too.
************************************************
我在网上看见一个解决方法,用英文写的:
Ignoring signal 0
From: Einar Karttunen
To: gdb at sources dot redhat dot com
Date: Mon, 1 Mar 2004 14:09:01 0200
Subject: Ignoring signal 0
HelloI am debugging a remote target using the bochs gdb stub. It sends signal0s (Program received signal 0, Signal 0.) which I want to ignore. If I try to ignore it normally it fails:(gdb) handle 0 nostop print passOnly signals 1-15 are valid as numeric signals.Use "info signals" for a list of symbolic signals.(gdb) handle all nostop print passdoes not help either...The signal is caused (probably) by a hardware exception in the simulatedhardware (e.g. lock nop) inside bochs and is then sent to gdb. - Einar Karttunen
2008-1-24 14:07 coolwenzi
忽略信号-“signal 0”
我也出现了这样的问题,不过现在解决了。
1)进入linux-gdb-rh9/ ,运行.run
2) 进入linux-gdb-rh9/ ,cd linux 进入linux目录
3)运行 gdb tools/system
错误的原因可能是 gdb tools/system 不是在linux-gdb-rh9目录下。
2008-8-1 11:02 chlputi
请问一下,能否用同样的方法调试高版本的LINUX内核?比如2.4的。
需要做哪些改动?
谢谢回复!
页: [1]
查看完整版本:
[求助]怎么用gdb和bochs调试内核啊?真难
Powered by
Discuz! Archiver
5.5.0 © 2001-2006
Comsenz Inc.





最新评论

QQ|小黑屋|最新主题|手机版|微赢网络技术论坛 ( 苏ICP备08020429号 )

GMT+8, 2024-9-29 13:17 , Processed in 0.237786 second(s), 12 queries , Gzip On, MemCache On.

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

返回顶部