Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1120884
  • 博文数量: 113
  • 博客积分: 2422
  • 博客等级: 大尉
  • 技术积分: 1393
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-25 17:54
文章分类
文章存档

2016年(1)

2014年(8)

2013年(7)

2012年(13)

2011年(42)

2010年(26)

2009年(6)

2008年(6)

2007年(4)

我的朋友

分类: C/C++

2009-12-05 14:32:28

记得用gcc 加-g 参数编译程序,以便生成的程序中带有调试信息。

1。gdb载入程序
gdb a.out

2。运行程序
run 加程序需要的参数

3。设置源代码目录
gdb directory /代码目录

4。查看函数名字用 info
gdb info functions
类似的有
gdb info files
查看函数所在的源代码行数
gdb info line 函数名字

5。下断点
(gdb) br net.c:911 在源代码的 net.c 文件911行下断点
Breakpoint 2 at 0x4163fc: file net.c, line 911.

在改函数上下断点
br 函数名字  

6。 查看寄存器 内容
info regiseter 查看寄存器   简写 i reg

7.查看堆栈
bt

8.查看变量的值 用 print 加表达式
(gdb) print (struct intfconfig_s *) 0x7fff2d15f878
$21 = (struct intfconfig_s *) 0x7fff2d15f878

9。查看类型 用ptype
(gdb) ptype struct intfconfig_s   
type = struct intfconfig_s {
    newtComponent ipv4Entry;
    newtComponent cidr4Entry;
    newtComponent ipv6Entry;
    newtComponent cidr6Entry;
    newtComponent gwEntry;
    newtComponent nsEntry;
    const char *ipv4;
    const char *cidr4;
    const char *ipv6;
    const char *cidr6;
    const char *gw;
    const char *ns;
}
10。 查看结构的子成员
(gdb) print ((struct intfconfig_s *) 0x7fff2d15f878)->ipv6
$25 = 0x1bf63740 " \025- \177"

(gdb) print ((struct intfconfig_s *) 0x7fff2d15f878)->ipv4
$26 = 0x0
(gdb) print ((struct intfconfig_s *) 0x7fff2d15f878)->ipv6Entry
$27 = (newtComponent) 0x1bf916e0

(gdb) print ((struct intfconfig_s *) 0x7fff2d15f878)->ipv4Entry
$28 = (newtComponent) 0x7fff2d15fb90

(gdb) print ((struct intfconfig_s *) 0x7fff2d15f878)->cidr6
$29 = 0x30687465


(gdb) print ((struct intfconfig_s *) 0x7fff2d15f878)->cidr4
$30 = 0x1bf91580 " \027 \033"
(gdb) print ((struct intfconfig_s *) 0x7fff2d15f878)->gw
$31 = 0x1bf92410 "\004"

11 执行下一句
next
nexti

12。运行时修改数据
set


13。 可以使用examine命令(简写是x)来查看内存地址中的值。x命令的语法如下所示:

x/

n、f、u是可选的参数。

n 是一个正整数,表示显示内存的长度,也就是说从当前地址向后显示几个地址的内容。
f 表示显示的格式,参见上面。如果地址所指的是字符串,那么格式可以是s,如果地十是指令地址,那么格式可以是i。
u 表示从当前地址往后请求的字节数,如果不指定的话,GDB默认是4个bytes。u参数可以用下面的字符来代替,b表示单字节,h表示双字节,w表示四字 节,g表示八字节。当我们指定了字节长度后,GDB会从指内存定的内存地址开始,读写指定字节,并把其当作一个值取出来。

表示一个内存地址。
n/f/u三个参数可以一起使用。例如:

命令:x/3uh 0x54320 表示,从内存地址0x54320读取内容,h表示以双字节为一个单位,3表示输出三个单位,u表示按十六进制显示。

输出格式
一般来说,GDB会根据变量的类型输出变量的值。但你也可以自定义GDB的输出的格式。例如,你想输出一个整数的十六进制,或是二进制来查看这个整型变量的中的位的情况。要做到这样,你可以使用GDB的数据显示格式:

x 按十六进制格式显示变量。
d 按十进制格式显示变量。
u 按十六进制格式显示无符号整型。
o 按八进制格式显示变量。
t 按二进制格式显示变量。
a 按十六进制格式显示变量。
c 按字符格式显示变量。
f 按浮点数格式显示变量。

(gdb) p record
$10 = {12, 76, 48, 62, 94, 17, 32, 37, 52, 69}
(gdb) p &record
$11 = (int (*)[10]) 0x8049740
(gdb) x/4uw 0x8049740
0x8049740 :    12    76    48    62
(gdb) x/6ow 0x8049740
0x8049740 :    014    0114    060    076
0x8049750 :    0136    021

阅读(2511) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~