注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

Mr.Right

不顾一切的去想,于是我们有了梦想。脚踏实地的去做,于是梦想成了现实。

 
 
 

日志

 
 
关于我

人生一年又一年,只要每年都有所积累,有所成长,都有那么一次自己认为满意的花开时刻就好。即使一时不顺,也要敞开胸怀。生命的荣枯并不是简单的重复,一时的得失不是成败的尺度。花开不是荣耀,而是一个美丽的结束,花谢也不是耻辱,而是一个低调的开始。

网易考拉推荐

阿英的GDB学习札记(gcc调试)-含完整linux debug范例  

2016-06-10 21:50:00|  分类: 编程 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
缘起:GDB比C++ builder等GUI软件更难掌握,本人之前也不会用,因linux下c语言调试需要,学习下GDB使用方法。写出来,一来记录自己的学习过程,并做个备忘;二来为了让后来学习者能够迅速掌握linux下的GDB C语言调试,节省不必要的摸索时间。

(序)
linux下上一条命令是 (Alt + 句点)
cat test.c查看 test.c源代码
gdb 没有设定清屏命令,是因为gdb可以执行shell命令,在gdb中运行shell clear就完事了

(一) 输入源文件并编译
程序的一个为test.c,其中有主程序main()mean.c程序中定义了mean()函数,并在main()中调用。
// mean.c
float mean(float a, float b)
{
   return (a + b)/2.0;
}

// test.c
// $ gcc -g -o test test.c mean.c     // in order to use gdb, -g must be added 

#define ARRAYSIZE 7

float mean(float, float);

int main()
{
    int i;
    float a=4.5;
    float b=5.5;
    float rlt=0.0;

    float array_a[ARRAYSIZE]={1.0, 2.0, 3.0, 4.0};
    float array_b[ARRAYSIZE]={4.0, 3.0, 2.0, 1.0};
    float array_rlt[ARRAYSIZE];

    for(i = 0; i < ARRAYSIZE - 1; i++) {
        array_rlt[i] = mean(array_a[i], array_b[i]);
    }

    rlt = mean(a, b);

    return 0;
}

(二) 进入GDB环境

进入gdb,准备调试程序:

$gdb test

1) 运行程序

(gdb) run

由于没有设置断点,故程序运行到最后
2)查看程序,GDB中查看源代码。
a) list line number
按行号用list命令来打印程序的源代码。默认打印10行。list 的快捷键是 l 。 
(gdb) l 1
然后按enter键翻页(gdb提示符后按Enter 实际上是执行上一条命令)。上面 l 1 表示从 第1行开始查看。
阿英的GDB学习札记(gcc调试)-含完整linux debug范例 - 阿英 - Mr.Right
 
b) list function
按函数名用list命令来打印程序的源代码。默认打印10行。list 的快捷键是 l 。 
(gdb) l mean
然后按enter键翻页。

阿英的GDB学习札记(gcc调试)-含完整linux debug范例 - 阿英 - Mr.Right
 
c) list source file
用list命令来打印指定源码文件内的内容。默认打印10行。list 的快捷键是 l 。 
(gdb) list mean.c:1
然后按enter键翻页。

3)设置断点
a) beak line number
在行号处设置断点。 
(gdb) break 16
b) beak function
在行号处设置断点。 
(gdb) break mean
查看断点: info break, 可简写为 info b, i b

4)运行程序并在断点处停止
a) run,其快捷键是r

b) 查看断点处的某个变量值,以及变量的内存地址:

(gdb) print array_a

(gdb) print &array_a

print 打印变量、字符串、表达式等的值,可简写为p 
(gdb) a                            打印a的值 

(gdb) p &a                            打印a的地址 
(gdb) p a*a               打印表达式值

c) 查看局部变量

(gdb) info local

d) 查看当前调用堆栈, 查看当前进程执行的调用栈以下三个指令都可以, bt代表backtrace

(gdb) info stack

(gdb) bt

(gdb) where

查看当前栈层的信息,你可以用以下GDB命令:

frame 或 f

会打印出这些信息:栈的层编号,当前的函数名,函数参数值,函数所在文件及行号,函数执行到的语句。

info frame

info f

e) 更改变量的值

(gdb) set var a=0.0

(gdb) set var array_a={0.0, 0.0, 1.0, 1.0}

当程序继续运行时,将使用更改后的值。

阿英的GDB学习札记(gcc调试)-含完整linux debug范例 - 阿英 - Mr.Right

f) 单条语句执行,s即step,n即next都可单步执行一条语句,然后停下来

(gdb) step

(gdb) s

(gdb) n

g) 运行到下一个断点

也可以使用下面命令,从断点恢复运行,直到下一个断点:

(gdb) continue

(gdb) c

h) 禁止和使能断点

disable [breakpoints] [range...]

disable所指定的断点,breakpoints为断点号。如果什么都不指定,表示disable所有的断点。简写命令是dis

enable [breakpoints] [range...]

enable所指定的停止点,breakpoints为断点号。

阿英的GDB学习札记(gcc调试)-含完整linux debug范例 - 阿英 - Mr.Right

 

i) 条件断点

(gdb) break line-or-function if expr 
例: 
(gdb) break test.c:19 if i==3

条件设置好后,我们可以用condition命令来修改断点的条件。

condition 与break if类似,只是condition只能用在已存在的断点上

修改断点号为bnum的停止条件为expression

condition bnum expression

清楚断点号为bnum的停止条件

condition bnum

ignore 忽略停止条件几次

表示忽略断点号为bnum的停止条件count次

Ignore bnum count

阿英的GDB学习札记(gcc调试)-含完整linux debug范例 - 阿英 - Mr.Right

 

 j) watch

watch 为表达式(变量)expr设置一个观察点。当表达式值有变化时,马上停住程序。

rwatch 表达式(变量)expr被读时,停住程序。

awatch 表达式(变量)的值被读或被写时,停住程序。

info watchpoints 列出当前所设置了的所有观察点

(gdb) watch i

阿英的GDB学习札记(gcc调试)-含完整linux debug范例 - 阿英 - Mr.Right

 

 k) finish,即从调用的子函数中跳出

(gdb) finish


info 命令可以对当前的函数帧的寄存器、局部变量、函数的参数、线程进行查看。

info register;info local;info args;info threads。

info program 来查看程序的是否在运行,进程号,被暂停的原因。


也可以删除所有断点:

(gdb) delete breakpoints


 (三) 指定程序运行参数

set args 可指定运行时参数。(如:set args 10 20 30 40 50 )

show args 命令可以查看设置好的运行参数。

run (r) 启动程序

不指定运行参数 r

指定运行参数r 10 20 30 40 50

例如一个程序名为prog 参数为 -l a -C abc

则,运行gcc -g  prog.c -o prog

就可以用gdb调试程序prog

#gdb prog

进入gdb调试界面

输入参数命令set args 后面加上程序所要用的参数,注意,不再带有程序名,直接加参数,如:

set args -l a -C abc

回车后输入

r


(四) Miscellaneous 

1)退出GDB环境
(gdb) quit
quit 的快捷键是 q
2) GDB使用的帮助说明

你可以通过gdb的帮助学到更多:

(gdb) help all

或者更具体的命令:

(gdb) help info


参考文献:
1.  http://www.cnblogs.com/vamei/archive/2013/04/03/2998652.html
2.  http://www.cnblogs.com/ggjucheng/archive/2011/12/14/2288004.html
  评论这张
 
阅读(172)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2016