kdb调试内核
1.下载kdb补丁
ftp://oss.sgi.com/www/projects/kdb/download/v4.4/
在ustor的os内核2.6.26-2,补丁
kdb-v4.4-2.6.26-x86-2
kdb-v4.4-2.6.26-common-2
2.编译内核
需要修改配置参数
确保.config文件选项有如下:
CONFIG_KDB=y
CONFIG_KDB_MODULES=n
CONFIG_KDB_OFF=n
CONFIG_KDB_CONTINUE_CATASTROPHIC=0
CONFIG_KDB_USB=y
CONFIG_KDB_KDUMP=y
CONFIG_KALLSYMS=y
CONFIG_FRAME_POINTER=y
3.开始kdb功能
要控制KDB,可以通过grub
kdb=on 开启kdb
kdb=off 关闭kdb
kdb=early 刚进入系统时就暂停并进入kdb
kdb=on-nokey 任何键盘按键都不能触发kdb
或者通过proc(注意,要用root 权限)[CONFIG_KDB_OFF有关]
echo '0' > /proc/sys/kernel/kdb 关闭kdb
echo '1' > /proc/sys/kernel/kdb 开启kdb
echo '2' > /proc/sys/kernel/kdb 任何键盘按键都不能触发kdb
4.测试kdb时候开启
cat /proc/sys/kernel/kdb 为1,表示开启
备注:按下 pause键就进入kdb了,OK,我按下pause键, cap lock确实开始狂闪了,然后再按什么键鼠标都没反应了,死机了
5. ustor修改
(1) 修改menu.lst文件,增加一个段
root (hd0,0)
kernel /boot/vmlinuz-2.6.26.2-kdb root=/dev/hda1 kdb=on init=1
initrd /boot/initrd.img
(2)在/etc/rc.d中增加rc1.d目录,以及相应的连接[ustor把单用户裁减了]
(3)修改/etc/inittab
id:1:initdefault:
su:S06:once:/sbin/sulogin
1:12345:respawn:/sbin/agetty tty1 9600
2:12345:respawn:/sbin/agetty tty2 9600
(4)使用root用户登录,然后按pause键进入kdb交互界面
6.命令简介
内存显示和修改
md,mdr,mm 和 mmW
显示内存
md 0x00000000c000000 15
寄存器显示和修改
rd,rm 和 ef
断点
断点命令有 bp 、 bc 、 bd 、 be 和 bl 。
bp 命令以一个地址/符号作为参数,它在地址处应用断点。当遇到该断点时则停止执行并将控制权交予 KDB。该命令有几个有用的变体。
bpa 命令对 SMP 系统中的所有处理器应用断点。 bph 命令强制在支持硬件寄存器的系统上使用它。 bpha 命令类似于 bpa 命令,
差别在于它强制使用硬件寄存器。
bd 命令禁用特殊断点。它接收断点号作为参数。该命令不是从断点表中除去断点,而只是禁用它。断点号从 0 开始,根据可用性顺序分配给断点。
be 命令启用断点。该命令的参数也是断点号。
bl 命令列出当前的断点集。它包含了启用的和禁用的断点。
bc 命令从断点表中除去断点。它以具体的断点号或 * 作为参数,在后一种情况下它将除去所有断点
堆栈跟踪
主要的堆栈跟踪命令有 bt 、 btp 、 btc 和 bta 。
bt 命令设法提供有关当前线程的堆栈的信息。它可以有选择地将堆栈帧地址作为参数。如果没有提供地址,那么它采用当前寄存器来回溯堆栈。
否则,它假定所提供的地址是有效的堆栈帧起始地址并设法进行回溯。如果内核编译期间设置了 CONFIG_FRAME_POINTER 选项,那么就用帧指
针寄存器来维护堆栈,从而就可以正确地执行堆栈回溯。如果没有设置 CONFIG_FRAME_POINTER ,那么 bt 命令可能会产生错误的结果。
btp 命令将进程标识作为参数,并对这个特定进程进行堆栈回溯。
btc 命令对每个活动 CPU 上正在运行的进程执行堆栈回溯。它从第一个活动 CPU 开始执行 bt ,然后切换到下一个活动 CPU,以此类推。
bta 命令对处于某种特定状态的所有进程执行回溯。若不带任何参数,它就对所有进程执行回溯。可以有选择地将各种参数传递给该命令。
将根据参数处理处于特定状态的进程
详情可以参考值:
Documentation/kdb下的文本文件.
阅读(4823) | 评论(0) | 转发(0) |