使用kgdb调试linux内核及内核模块

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
所以在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
使用kgdb调试linux内核及内核模块
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 #
使用kgdb调试linux内核及内核模块
Google Search
首页
焦点原创
安全文摘
安全工具
安全漏洞
焦点项目
焦点论坛 关于我们 添加文章 Xcon English Version
文章分类
使用kgdb调试linux内核及内核模块
专题文章 << 漏洞分析 安全配置 黑客教学 编程技术 工具介绍 火墙技术 入侵检测 破解专题 焦点公告 焦点峰会
3.2.1 安装
下载linux-2.4.23.tar.bz2,linux-2.4.23-kgdb-1.9.patch,gdbmod-1.9.bz2到developer的/home/liangjian目录
*在developer机器上
#cd /home/liangjian #bunzip2 linux-2.4.23.tar.bz2 #tar -xvf linux-2.4.23.tar #bunzip2 gdbmod-1.9.bz2 #cp gdbmod-1.9 /usr/local/bin #cd linux-2.4.23 #patch -p1 < ../linux-2.4.23-kgdb-1.9.patch #make menuconfig
3.ok,开始
3.1 测试串口线 物理连接好串口线后,使用一下命令进行测试,stty可以对串口参数进行设置
在developer上执行: stty ispeed 115200 ospeed 115200 -F /dev/ttyS0
http://www.xfocus.net/articles/200509/820.html[2008-11-2 14:24:45]
查看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) {
文章推荐
补丁管理最 佳安全实践之资 产评估
国内网络安 全风险评估市场 与技术操作
协作的信息 系统风险评估
创建时间:2005-09-09 文章属性:原创 文章提交:xcspy (xcspy.com_at_gmail.com)
作者:xcspy成员 ladybug E-mail:xcspy.com@gmail.com 主页:www.xcspy.com
使用scp进行将相关文件拷贝到target上(当然也可以使用其它的网络工具) #scp arch/i386/boot/bzImage root@192.168.16.30:/boot/vmlinuz-2.4.23-kgdb #scp System.map root@192.168.16.30:/boot/System.map-2.4.23-kgdb #scp arch/i386/kernel/gdbstart root@192.168.16.30:/sbin gdbstart为kgdb提供的一个工具,用于激活内核钩子,使内核处于调试状态
#./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) 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 ()
3.3 开始调试
target上的内核或内核模块处于调试状态时,可以查看其变量、设置断点、查看堆栈等,并且是源码级的调试,和用gdb调试用户程序一样
3.3.1 内核启动后调试
*在target机器上
重启系统,选择以 2.4.23-kgdb内核启动,启动完成后运行debugkenel, 这时内核将停止运行,在控制台屏幕上显示信息,并等待来自developer的 串口连接
1. 几种内核调试工具比较
kdb:只能在汇编代码级进行调试; 优点是不需要两台机器进行调试。
gdb:在调试模块时缺少一些至关重要的功能,它可用来查看内核的运行情况,包括反汇编内核函数。
kgdb:能很方便的在源码级对内核进行调试,缺点是kgdb只能进行远程调试,它需要一根串口线及两台机器来调试内核(也可以是在同一台 主机上用vmware软件运行两个操作系统来调试)
使用kdb和gdb调试内核的方法相对比较简单,这里只描述如何使用kgdb来调试内核。
2.软硬件准备
环境: 一台开发机developer(192.168.16.5 com1),一台测试机target(192.168.16.30 com2),都预装redhat 9;一根串口线
下载以下软件包: linux内核2.4.23 linux-2.4.23.tar.bz2 kgdb内核补丁1.9版 linux-2.4.23-kgdb-1.9.patch 可调试内核模块的gdb gdbmod-1.9.bz2
http://www.xfocus.net/articles/200509/820.html[2008-11-2 14:24:45]
使用kgdb调试linux内核及内核模块
gdb_hook(); /* right at boot time */ } #endif ...... }
http://www.xfocus.net/articles/200509/820.html[2008-11-2 14:24:45]
使用kgdb调试linux内核及内核模块 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"...
在root目录下建立一个脚本文件debugkernel,内容如下: #vi debug #!/bin/bash gdbstart -s 115200 -t /dev/ttyS1 <<EOF
EOF #chmod +x debugkernel 这个脚本主要是调用gdbstart程序设置target机上使用的串口及其速率,并使内核处于调试状态
在Kernel hacking配置项中将以下三项编译进内核 KGDB: Remote (serial) kernel debugging with gdb KGDB: Thread analysis KGDB: Console messages through gdb
注意在编译内核的时候需要加上-g选项 #make dep;make bzImage
使用kgdb调试linux内核及内核模块 echo hello > /dev/ttyS0 在target上执行: stty ispeed 115200 ospeed 115200 -F /dev/ttyS1 cat /dev/ttyS1
串口线没问题的话在target的屏幕上显示hello
3.2 安装与配置
3.2.2 配置
*在developer机器上
在内核源码目录下编辑一文件.gdbinit(该文件用以对gdb进行初始化),内容如下: #vi .gdbinit define rmt set remotebaud 115200
http://www.xfocus.net/articles/200509/820.html[2008-11-2 14:24:45]
*在target机器上
引导2.4.23-kgdb内核,内核将在短暂的运行后暂停并进入调试状态,打印如下信息: 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 atowk.baidu.comic_set(&kgdb_setting_breakpoint, 0);
这时target上的内核处于调试状态,可以查看其变量、设置断点、查看堆栈等,和用gdb调试用户程序一样
相关文档
最新文档