kdb
ftp://oss.sgi.com/projects/kdb/download/latest
ftp://oss.sgi.com/www/projects/kdb/download/
内核的源代码中就有,用menuconfig重新设置内核选项,在kernel hacking中。
kdb编译,安装,使用完全手册
编译kdb
步骤1:
kdb不是Linux内核的标准配置,需要先到这个网站上去下载一个版本,2个文件
ftp://oss.sgi.com/projects/kdb/download/v4.4/
kdb-v4.4-2.6.15-common-1(kdb-v4.4-2.6.15-common-1.bz2)
kdb-v4.4-2.6.15-i386-1(kdb-v4.4-2.6.15-i386-1.bz2)
步骤2:
下载一个纯的linux内核源码文件。
记住,一定要是纯的linux内核源码,不能是什么redhat等等公司出的版本。否则在pacth时就会出现error了。
比如有一次我把patch打到了/usr/src/redhat/BUILD/kernel-2.6.15/linux-2.6.15.i686里就发生了错误,这个目录是redhat自己改过的源码,不是纯的源码,所以出错。
下载到的源码必须和步骤1的小版本一致。比如我的纯linux内核版本是2.6.15-1***。
把linux纯内核源码文件命名为linux,放到/usr/src中。
步骤3:
把步骤1得到的解压后的2个文件kdb-v4.4-2.6.15-common-1,kdb-v4.4-2.6.15-i386-1放到/usr/src/linux目录里。
这时就会很顺利的patch成功,只要不出现什么reject这样的提示就算成功。
一旦发现出现了reject这样的信息,只有2种可能:
一是你的内核不是真正的内核,是公司改进过的内核;二是kdb版本和源码版本不一致。
步骤4:
该linux配置,在这里千万不要用make menuconfig这样的命令,你可能很奇怪,为什么?我的经验表明,不同的linux/kdb版本menuconfig出来的kdb选项有很大的不同,用语言是无法准确描述,我原来参考很多网上的资料都是根据menuconfig来,造成了描述矛盾,很难搞明白。在这里,我们直接改写文件最为牢靠。
先运行make menuconfig这个命令,不更改任何选项,直接回车,然后选择yes,这样就能生成一个隐藏的文件.config了。
用vi/vim 打开这个文件,
改写如下:
CONFIG_KDB=y
CONFIG_KDB_MODULES=n
CONFIG_KDB_OFF=n
CONFIG_KALLSYMS=y
CONFIG_FRAME_POINTER=y
保存。记住,这样做比在menuconfig菜单选项里选择要安全和清晰的多。
打开kdb/kdb_cmds这个文件,全部注释掉所有:例如:
# Initial commands for kdb, alter to suit your needs.
# These commands are executed in kdb_init() context, no SMP, no
# processes. Commands that require process data (including stack or
# registers) are not reliable this early. set and bp commands should
# be safe. Global breakpoint commands affect each cpu as it is booted.
# Standard debugging information for first level support, just type archkdb
# or archkdbcpu or archkdbshort at the kdb prompt.
defcmd archkdb "" "First line arch debugging"
#set BTSYMARG 1
#set BTARGS 5
#-archkdbcommon
#-bta
endefcmd
defcmd archkdbcpu "" "archkdb with only tasks on cpus"
#set BTSYMARG 1
#set BTARGS 5
#-archkdbcommon
#-btc
endefcmd
defcmd archkdbshort "" "archkdb with less detailed backtrace"
#set BTSYMARG 0
#set BTARGS 0
#-archkdbcommon
#-bta
endefcmd
为什呢,因为大家刚开始接触kdb时,非常不熟悉,如果把全部选项都注释后,kdb就变的比较容易操作,否则重启系统以后,你还以为安装出错呢,不信可以试试,呵呵。等你水平高了以后,在改过来,重新编译系统就可以了。
步骤5:
改写Makefile文件中的EXTRAVERSION,随便取个名字吧。
make all
make bzImage
make modules
make modules_install
make install
有文章说要改写什么lilo文件。
不用改写什么lilo文件,你的系统如果只支持grub,你根本在系统里找不到lilo,改什么改!!!
步骤6:
重启,在系统选项里选择这个新的系统就可以了。
在系统开始引导时,你会在屏幕上看到3-5行关于kdb的信息,其实就是kdb_cmds里的配置,我们已经注释掉了,所以光显示,不会运行(这样最安全,否则如果你对kdb不熟,改kdb_cmds错了,在启动时就会出现什么内核panic的恐怖信息,这就是总是不能启动成功的原因)。
看到其他的启动跟没安装kdb时一样,成功进入提示你输入用户名,密码进入系统时,就表明你的kdb才真正的安装成功了。
启动kdb。
用root权限进入系统。
# echo "1" > /proc/sys/kernel/kdb 回车以后没什么反映,说明启动成功了。
我有个同事运行这个命令以后,提示找不到kdb这个文件,后来我给他调试时发现kdb根本就没安装成功,最后我给他重新安装就没问题了。
按“Pause Break”键,就会出现kdb的使用接口了。如果想退出,就输入go,然后按回车即可。我后来发现通过f1进入系统后,输入go+回车后
怎么也退不出来,在f2进入系统后,输入go+回车后就很顺利的退出了,这个现象非常奇怪,我猜可能跟linux本身有关系。
使用kdb。
谁说kdb不能源码级调试,那时他没真正用过kdb.
其实kdb是可以源码级调试的,在这里的前提是对源码级调试的定义,反正你使用kdb用单步跟踪时是可以看到源码也一行一行的自动走的,对
你怀疑有bug的地方进行查看,非常方便。
关于使用kdb谁说都没用,关键看文档,记住不要看其他任何第三方的文档(有很多误导),就看上面你的Documentation/kdb里的slides等文档,这才是最没有污染和最正宗的文档。
写篇文档给想要使用kgdb调试kernel或者driver module的新手
Who may read this document?
===========================
1. People who familiar with gdb but not never use kgdb
2. People who like to debug kernel or driver module using the gdb way.
Why to Using KGDB
=================
1. Want to debug kernel
2. Want to debug driver module
What’s hardware you needed to use KGDB
=======================================
1. Target system with have serial port
2. Host system with have serial port
3. Serial line
How to Debug Kernel using KGDB
==============================
1. Download kgdb patch for your kernel at
http://kgdb.linsyssoft.com/downloads
2. Host: cd /path/to/kernel/source/
3. Host: patch –p1 –i /path/to/patch/file
4. Host: make menuconfig, to confirm you choose kgdb support in KERNEL_HACKING
5. Host: make dep;make bzImage
6. Copy built bzImage to your target system.
7. Target: boot your target using the built bzImage with gdb gdbttyS=x gdbbaud=38400
you may add these parameters to your grub menu. Here ‘x’ is the index of your serial port used to connect your host such as 0,1 or 2.
8. Host: cd /path/to/kernel/source
9. Host: gdb vmlinux
10. Host gdb: set remotebaud 38400
11. Host gdb: target remote /dev/ttySx. Here ‘x’ is the index of your serial port used to connect your target.
How to Debug Driver Module using KGDB
=====================================
1. Host: build your driver module with –g option.
2. Copy your driver.o to your target system.
3. Reboot target with kernel build in kgdb.
4. Host gdb: Set breakpoint before kernel call module’s initialization function so we can debug module’s initialization function.
Kernel call module’s initialization in kernel/module.c: sys_init_module():mod->init().
5. Target: load your driver module using insmod and will stop at breakpoint set by 4.
6. Host gdb: p/x module_list
7. Host gdb: add-symbol-file /path/to/your/driver/module/sourcecode address
where address is the value of module_list+sizeof(module_list).
This command loads symbol file of your module so you can debug it.
8. As 7 have add the symbol file of your module, so you can set breakpoints to your source code such as module’s init function and enjoy the debugging.
ftp://oss.sgi.com/projects/kdb/download/latest
ftp://oss.sgi.com/www/projects/kdb/download/
内核的源代码中就有,用menuconfig重新设置内核选项,在kernel hacking中。
kdb编译,安装,使用完全手册
编译kdb
步骤1:
kdb不是Linux内核的标准配置,需要先到这个网站上去下载一个版本,2个文件
ftp://oss.sgi.com/projects/kdb/download/v4.4/
kdb-v4.4-2.6.15-common-1(kdb-v4.4-2.6.15-common-1.bz2)
kdb-v4.4-2.6.15-i386-1(kdb-v4.4-2.6.15-i386-1.bz2)
步骤2:
下载一个纯的linux内核源码文件。
记住,一定要是纯的linux内核源码,不能是什么redhat等等公司出的版本。否则在pacth时就会出现error了。
比如有一次我把patch打到了/usr/src/redhat/BUILD/kernel-2.6.15/linux-2.6.15.i686里就发生了错误,这个目录是redhat自己改过的源码,不是纯的源码,所以出错。
下载到的源码必须和步骤1的小版本一致。比如我的纯linux内核版本是2.6.15-1***。
把linux纯内核源码文件命名为linux,放到/usr/src中。
步骤3:
把步骤1得到的解压后的2个文件kdb-v4.4-2.6.15-common-1,kdb-v4.4-2.6.15-i386-1放到/usr/src/linux目录里。
这时就会很顺利的patch成功,只要不出现什么reject这样的提示就算成功。
一旦发现出现了reject这样的信息,只有2种可能:
一是你的内核不是真正的内核,是公司改进过的内核;二是kdb版本和源码版本不一致。
步骤4:
该linux配置,在这里千万不要用make menuconfig这样的命令,你可能很奇怪,为什么?我的经验表明,不同的linux/kdb版本menuconfig出来的kdb选项有很大的不同,用语言是无法准确描述,我原来参考很多网上的资料都是根据menuconfig来,造成了描述矛盾,很难搞明白。在这里,我们直接改写文件最为牢靠。
先运行make menuconfig这个命令,不更改任何选项,直接回车,然后选择yes,这样就能生成一个隐藏的文件.config了。
用vi/vim 打开这个文件,
改写如下:
CONFIG_KDB=y
CONFIG_KDB_MODULES=n
CONFIG_KDB_OFF=n
CONFIG_KALLSYMS=y
CONFIG_FRAME_POINTER=y
保存。记住,这样做比在menuconfig菜单选项里选择要安全和清晰的多。
打开kdb/kdb_cmds这个文件,全部注释掉所有:例如:
# Initial commands for kdb, alter to suit your needs.
# These commands are executed in kdb_init() context, no SMP, no
# processes. Commands that require process data (including stack or
# registers) are not reliable this early. set and bp commands should
# be safe. Global breakpoint commands affect each cpu as it is booted.
# Standard debugging information for first level support, just type archkdb
# or archkdbcpu or archkdbshort at the kdb prompt.
defcmd archkdb "" "First line arch debugging"
#set BTSYMARG 1
#set BTARGS 5
#-archkdbcommon
#-bta
endefcmd
defcmd archkdbcpu "" "archkdb with only tasks on cpus"
#set BTSYMARG 1
#set BTARGS 5
#-archkdbcommon
#-btc
endefcmd
defcmd archkdbshort "" "archkdb with less detailed backtrace"
#set BTSYMARG 0
#set BTARGS 0
#-archkdbcommon
#-bta
endefcmd
为什呢,因为大家刚开始接触kdb时,非常不熟悉,如果把全部选项都注释后,kdb就变的比较容易操作,否则重启系统以后,你还以为安装出错呢,不信可以试试,呵呵。等你水平高了以后,在改过来,重新编译系统就可以了。
步骤5:
改写Makefile文件中的EXTRAVERSION,随便取个名字吧。
make all
make bzImage
make modules
make modules_install
make install
有文章说要改写什么lilo文件。
不用改写什么lilo文件,你的系统如果只支持grub,你根本在系统里找不到lilo,改什么改!!!
步骤6:
重启,在系统选项里选择这个新的系统就可以了。
在系统开始引导时,你会在屏幕上看到3-5行关于kdb的信息,其实就是kdb_cmds里的配置,我们已经注释掉了,所以光显示,不会运行(这样最安全,否则如果你对kdb不熟,改kdb_cmds错了,在启动时就会出现什么内核panic的恐怖信息,这就是总是不能启动成功的原因)。
看到其他的启动跟没安装kdb时一样,成功进入提示你输入用户名,密码进入系统时,就表明你的kdb才真正的安装成功了。
启动kdb。
用root权限进入系统。
# echo "1" > /proc/sys/kernel/kdb 回车以后没什么反映,说明启动成功了。
我有个同事运行这个命令以后,提示找不到kdb这个文件,后来我给他调试时发现kdb根本就没安装成功,最后我给他重新安装就没问题了。
按“Pause Break”键,就会出现kdb的使用接口了。如果想退出,就输入go,然后按回车即可。我后来发现通过f1进入系统后,输入go+回车后
怎么也退不出来,在f2进入系统后,输入go+回车后就很顺利的退出了,这个现象非常奇怪,我猜可能跟linux本身有关系。
使用kdb。
谁说kdb不能源码级调试,那时他没真正用过kdb.
其实kdb是可以源码级调试的,在这里的前提是对源码级调试的定义,反正你使用kdb用单步跟踪时是可以看到源码也一行一行的自动走的,对
你怀疑有bug的地方进行查看,非常方便。
关于使用kdb谁说都没用,关键看文档,记住不要看其他任何第三方的文档(有很多误导),就看上面你的Documentation/kdb里的slides等文档,这才是最没有污染和最正宗的文档。
写篇文档给想要使用kgdb调试kernel或者driver module的新手
Who may read this document?
===========================
1. People who familiar with gdb but not never use kgdb
2. People who like to debug kernel or driver module using the gdb way.
Why to Using KGDB
=================
1. Want to debug kernel
2. Want to debug driver module
What’s hardware you needed to use KGDB
=======================================
1. Target system with have serial port
2. Host system with have serial port
3. Serial line
How to Debug Kernel using KGDB
==============================
1. Download kgdb patch for your kernel at
http://kgdb.linsyssoft.com/downloads
2. Host: cd /path/to/kernel/source/
3. Host: patch –p1 –i /path/to/patch/file
4. Host: make menuconfig, to confirm you choose kgdb support in KERNEL_HACKING
5. Host: make dep;make bzImage
6. Copy built bzImage to your target system.
7. Target: boot your target using the built bzImage with gdb gdbttyS=x gdbbaud=38400
you may add these parameters to your grub menu. Here ‘x’ is the index of your serial port used to connect your host such as 0,1 or 2.
8. Host: cd /path/to/kernel/source
9. Host: gdb vmlinux
10. Host gdb: set remotebaud 38400
11. Host gdb: target remote /dev/ttySx. Here ‘x’ is the index of your serial port used to connect your target.
How to Debug Driver Module using KGDB
=====================================
1. Host: build your driver module with –g option.
2. Copy your driver.o to your target system.
3. Reboot target with kernel build in kgdb.
4. Host gdb: Set breakpoint before kernel call module’s initialization function so we can debug module’s initialization function.
Kernel call module’s initialization in kernel/module.c: sys_init_module():mod->init().
5. Target: load your driver module using insmod and will stop at breakpoint set by 4.
6. Host gdb: p/x module_list
7. Host gdb: add-symbol-file /path/to/your/driver/module/sourcecode address
where address is the value of module_list+sizeof(module_list).
This command loads symbol file of your module so you can debug it.
8. As 7 have add the symbol file of your module, so you can set breakpoints to your source code such as module’s init function and enjoy the debugging.