gdb 调试ko驱动 转载
GDB基本用法
GDB是GNU开源组织发布的一项强大的UNIX下的程序调试工具,GDB主要完成下面4个方面的功能
1.启动程序,可以按照工程师自定义的要求运行程序
2.让被调试的程序在工程师的指定端点处停住,断点可以是条件表达式
3.当程序被停止时,可以检查此程序中所发生的事,并追踪上文
4.动态地改变程序的执行环境
不管是调试Linux内核空间的驱动程序还是调试用户空间的应用程序,掌握GDB的用法都是必须的,而且,调式内核和调试应用程序的GDB命令式完成相同的
下面以一个应用程序来演示GDB调试器的用法:
#include
int add(int a,int b)
{
return a+b;
}
main()
{
int sum[10] = {0};
int i;
int array1[10] =
{
48,56,77,33,33,11,226,544,78,90
};
int array2[10] =
{
85,99,66,0x199,393,11,1,2,3,4
};
for(i = 0;i < 10;i++)
{
sum[i] = add(array1[i],array2[i]);
printf("TQ2440 : %d",sum[i]);
}
}
在linux中使用命令gcc -g gdb.c -o gdbb来编译上面程序,将得到gdbb二进制进行文件,然后执行gdb gdbb命令进入调试状态如下:
root@www:/opt/qudong/qd13# gdb gdbb
GNU gdb (GDB) 7.1-ubuntu
Copyright (C) 2010 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law. Type "show copying"
and "show warranty" for details.
This GDB was configured as "i486-linux-gnu".
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>...
Reading symbols from /opt/qudong/qd13/gdbb...done.
(gdb)
1.list命令
在GDB中运行list命令(缩写l)可以列出代码
list ,显示程序linenum行周围的代码,如下:
(gdb) list 15
10 int i;
11
12 int array1[10] =
13 {
14 48,56,77,33,33,11,226,544,78,90
15 };
16 int array2[10] =
17 {
18 85,99,66,0x199,393,11,1,2,3,4
19 };
(gdb)
list ,显示函数名为function的函数源程序,如下:
(gdb) list main
3 {
4 return a+b;
5 }
6
7 main()
8 {
9 int sum[10] = {0};
10 int i;
11
12 int array1[10] =
(gdb)
下面演示使用GDB中的run(缩写r),break(缩写b设置断点),next(缩写n但不进行)命令控制程序的运行,并使用print(缩写P)命令打印程序中的变量sum过程,如下:
(gdb) break add //在add函数处设置断点
Breakpoint 1 at 0x8048377: file gdb.c, line 4.
(gdb) run
Starting program: /opt/qudong/qd13/gdbb
Breakpoint 1, add (a=48, b=85) at gdb.c:4
4 return a+b;
(gdb) next
5 }
(gdb) next
main () at gdb.c:24
24 printf("TQ2440 : %d",sum[i]);
(gdb) next
21 for(i = 0;i < 10;i++)
(gdb) next
23 sum[i] = add(array1[i],array2[i]);
(gdb) print sum
$1 = {133, 0, 0, 0, 0, 0, 0, 0, 0, 0}
(gdb)
2.run命令
在GDB中,运行程序用run命令,在程序运行之前,我们可以设置如下方面的工作环境
(1)程序运行参数
set args可指定运行时参数,如set args 10 2 0 20 30;show args命令可以查看设置好的参数
(2)运行环境
path
(3)工作目录
cd
(4)程序输出
info terminal用于显示程序用到的终端模式
3.break命令
在GDB中用break命令来设置断点,设置断点方法如下:
(1)break ,指定在函数function处设置断点(停止)
(2)break ,指定行号停止
(3)break+offset / break - offset ,在当前行号前面或后面的offset行停止
(4)break filename:linenum在源文件filename的linenum行处停止
(5)break filename:function,在源文件filename的function函数入口处停止
(6)break *address,在程序运行的内存地址处停止
(7)break,没有指定参数,表示在下一条指令处停止
(8)break ... if,其中...可以是上述的break ,break+offset / break - offset,break 等,在条件成立时停止
4.单步命令
(1)step 单步跟踪,如果由函数调用,则进入该函数,step后面不加count 表示一条条地执行
(2)next 单步跟踪,如果由函数调用,它不会进入该函数,同样地,next后面不加count表示一条条地执行
(3)set step-mode,set step-mode on用于打开step-mode模式,这样,在进行单步调试时,程序不会因为没有debug信息而不停止,set step-mode off用于关闭step-mode模式
(4)finish,运行程序,直到当前函数完成返回
(5)until(缩写u),一直在循环体内执行单步,不会退出来
(6)stepi(缩写si)和nexti(缩写ni),用于单步跟踪一条机器码
5.continue命令
当程序被停止后,可以使用continue命令恢复程序的运行直到程序结束或到达下一个断点
6.print命令
在调试程序时,当程序被停止时,可以使用print命令(缩写p),来查看当前程序的运行数据,如下:
(gdb) print sum
$3 = {133, 0, 0, 0, 0, 0, 0, 0, 0, 0}
(gdb) next
Breakpoint 1, add (a=56, b=99) at gdb.c:4
4 return a+b;
(gdb) next
5 }
(gdb) next
main () at gdb.c:24
24 printf("TQ2440 : %d",sum[i]);
(gdb) next
21 for(i = 0;i < 10;i++)
(gdb) next
23 sum[i] = add(array1[i],array2[i]);
(gdb) print sum
$4 = {133, 155, 0, 0, 0, 0, 0, 0, 0, 0}
(gdb)
#define KERN_ALERT "<1>" /action must be taken immediately
#define KERN_CRIT "<2>" /critical conditions
#define KERN_WARNING "<4>" /warning conditions
#define KERN_NOTICE "<5>" /normal but significant condition
#define KERN_INFO "<6>" /informational
#define KERN_DEBUG "<7>"
mode_t mode, struct proc_dir_entry *parent);
mode_t mode, struct proc_dir_entry *base,
read_proc_t *read_proc, void * data);
New0001.ko devgecho hello.c myhello signal.ko wed
backlight etc hello.ko myled.ko sixqd.ko yg.ko
bin fb home myzd sy yubu
cgy fb_test leds opt sys yueyi.ko
cgyled fost.ko lib poll thirdzd.ko yy.ko
cs gui.ko linuxrc proc tmp zd
dev gy mnt root usr
devg hello myanjian.ko sbin var
[root@cgyl2010 ~]#insmod yueyi.ko
[root@cgyl2010 ~]#cd /sys/module/yueyi/
[root@cgyl2010 /sys/module/yueyi]#
. .devexit.text
.. .devinit.text
.ARM.exidx .gnu.linkonce.this_module
.ARM.exidx.devexit.text .note.gnu.build-id
.ARM.exidx.devinit.text .rodata
.ARM.extab .rodata.str1.1
.ARM.extab.devexit.text .strtab
.ARM.extab.devinit.text .symtab
.bss .text
.data
[root@cgyl2010 /sys/module/yueyi/sections]#
0xbf006000
[root@cgyl2010 /sys/module/yueyi/sections]#cat .bss
0xbf007568
[root@cgyl2010 /sys/module/yueyi/sections]#cat .data
0xbf0073e4
[root@cgyl2010 /sys/module/yueyi/sections]#