黑客风云——风云网络
设为首页 加入收藏 我要投稿 网站地图
您现在的位置: 黑客风云 >> 黑客文章 >> 操作系统 >> LINIX UNIX >> 文章正文
[推荐]使用kgdb调试linux内核及内核模块
      ★★★
使用kgdb调试linux内核及内核模块
文章整理发布:黑客风云 文章来源:www.05112.com 更新时间:2006-10-4

  3.2.2 配置

  *在developer机器上

  在内核源码目录下编辑一文件.gdbinit(该文件用以对gdb进行初始化),内容如下:

#vi .gdbinit
define rmt
set remotebaud 115200
target remote /dev/ttyS0
end
#

  以上在.gdbinit中定义了一个宏rmt,该宏主要是设置使用的串口号和速率

  *在target机器上

  编辑/etc/grub.conf文件,加入以下行:

#vi /etc/grub.conf
title Red Hat Linux (2.4.23-kgdb)
    root (hd0,0)
    kernel /boot/vmlinuz-2.4.23-kgdb ro root=/dev/hda1
#

  在root目录下建立一个脚本文件debugkernel,内容如下:

#vi debug
#!/bin/bash
gdbstart -s 115200 -t /dev/ttyS1 <<EOF

EOF
#chmod +x debugkernel

  这个脚本主要是调用gdbstart程序设置target机上使用的串口及其速率,并使内核处于调试状态

  3.3 开始调试

  target上的内核或内核模块处于调试状态时,可以查看其变量、设置断点、查看堆栈等,并且是源码级的调试,和用gdb调试用户程序一样

  3.3.1 内核启动后调试

  *在target机器上

  重启系统,选择以 2.4.23-kgdb内核启动,启动完成后运行debugkenel,这时内核将停止运行,在控制台屏幕上显示信息,并等待来自developer的串口连接

#./debug
About to activate GDB stub in the kernel on /dev/ttyS1
Waiting for connection from remote gdb...

  *在developer机器上

#cd /home/liangjian/linux-2.4.23
# gdb vmlinux
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"...

  执行rmt宏

(gdb) rmt
breakpoint () at kgdbstub.c:1005
1005                    atomic_set(&kgdb_setting_breakpoint, 0);

  这时target上的内核处于调试状态,可以查看其变量、设置断点、查看堆栈等,和用gdb调试用户程序一样

  查看堆栈

(gdb) bt
#0  breakpoint () at kgdbstub.c:1005
#1  0xc0387f48 in init_task_union ()
#2  0xc01bc867 in gdb_interrupt (irq=3, dev_id=0x0, regs=0xc0387f98) at
gdbserial.c:158
#3  0xc010937b in handle_IRQ_event (irq=3, regs=0xc0387f98, action=0xce5a9860)
at irq.c:452
#4  0xc0109597 in do_IRQ (regs=
      {ebx = -1072671776, ecx = -1, edx = -1070047232, esi = -1070047232, edi
= -1070047232, ebp = -1070039092, eax = 0, xds
= -1070071784, xes = -1070071784, orig_eax = -253, eip = -1072671729, xcs =
16, eflags = 582, esp = -1070039072, xss = -1072671582}) at irq.c:639
#5  0xc010c0e8 in call_do_IRQ ()

  查看jiffies变量的值

(gdb) p jiffies
$1 = 76153

  如果想让target上的内核继续运行,执行continue命令

(gdb) continue
Continuing.

  3.3.2 内核在引导时调试

  kgdb可以在内核引导时就对其进行调试,但并不是所有引导过程都是可调试的,如在kgdb 1.9版中,它在init/main.c的start_kernel()函数中插入以下代码:

start_kernel()
{
    ......
        smp_init();
#ifdef CONFIG_KGDB
        if (gdb_enter) {
                gdb_hook();             /* right at boot time */
        }
#endif
    ......
}

  所以在smp_init()之前的初始化引导过程是不能调试的。

  另外要想让target的内核在引导时就处于调试状态,需要修改其/etc/grub.conf文件为如下形式:

title Red Hat Linux (2.4.23-kgdb)
    root (hd0,0)
    kernel /boot/vmlinuz-2.4.23-kgdb ro root=/dev/hda1 gdb gdbttyS=1 gdbbaud=115200

上一页  [1] [2] [3] 下一页  

文章录入:sygbox    责任编辑:sygbox 
【字体: 】【发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
VIP 专 区
Copyright @2006 黑客风云 ●业务联系:QQ 联系怪人 联系奇人 Email:给怪人发邮件 给奇人发邮件
ICP备案:冀06009886