GDB调试总结

1.        gdb编译:

g++ -Wall -g -o study_cpp      study_cpp.cpp

-g代表保留编译信息

2.        gdb运行

gdb          study_cpp

3.        设置命令行参数,即设置main函数的输入参数

set   args          a       b       c       d       e       f        g

相当于main函数的argc = 8, args[0] = “a”……

4.        显示命令行参数

show         args

不人为set       args 时,直接show        args则结果显示为空:

Argument list to give program beingdebugged when it is started is "".

如果如第三条那样set之后,则show的结果就是:

Argument list to give program beingdebugged when it is started is "a b c d e f g".

5.        程序执行

a)        不带输入参数(命令行参数)

run  

注意:run后面不用加程序名!!原因很简单,我们进入gdb的时候已经写程序名了,run的是哪个程序是不言自明的!

如果之前有用set  args进行设置,则此时的输入参数即为set       args时写进去的参数

b)        带输入参数

run   a       b       c       d       e       f        g

则a          b       c       d       e       f        g就成为study_cpp里main函数的args输入参数

注意:同样不用写程序名。即便之前有用set  args设置输入参数,此处也会按照我们新写的参数进行。之前的设置失效。

6.        设置变量的值

a)        改变gdb环境里的临时变量的值。这个是是gdb环境里的,而不是程序里的。

set $var_name  = 3

注意:gdb临时变量总是以$开头,此变量只能在gdb环境中使用,且使用的时候也必须以$开头,即比如要打印我们刚刚设置的临时变量的值,不能用:

print                   var_name

而必须写:

print                   $var_name

b)        改变程序里变量的值:

set             variable             var_name  =          5

很明显,gdb用是否以$开头来将gdb环境里的临时变量与程序里的变量区分开来。但是,如果程序里的变量就用$开头会怎么样?


打印$j并没有打出来。

可见,程序里最好不要用以$开头的变量,虽然C语言并没有明令禁止。

7.        gdb里的循环语句

(gdb) set $i       =       0
(gdb) set variable p            =       argv[$i]
(gdb) while p     !=      0

>print       p       =       argv[$i++]
>end

执行的结果是:

注意$i++和while的用法

8.        在某一断点处持续执行一系列命令

前提:设置断点

(gdb) break 81

Breakpoint 2 at 0x400ae1: file test.cc,line 81

开始:以command        nr开头,以end结尾,中间的命令就是执行到断点处自动执行的命令,其中nr是断点的编号。

例子如下:

(gdb)commands 2      //命令开始

Typecommands for breakpoint(s) 2, one per line.

Endwith a line saying just "end".

>silent   //关闭gdb的自动输出

>set$p = obj  //设置gdb临时变量

>while$p != 0  //遍历链表

 >print $p->name

 >set $p = $p->next

 >end

>continue //跳过断点,继续执行

>end //命令结束

输入run,运行:

9.        查看内存处的内容

x       /<fmt>      <ADDRESS>

其中:

a)        ADDRESS可以是任何合法的地址表达式,如0X8799f00,          p(指针),   &var

b)        fmt由三个部分组成,NFU:

1)        N,表示查看的长度;

2)        F,表示格式,同print命令


3)        U,表示单位,可以是b(字节) h(半字,两个字节) w(字,4个字节) g(双字,8个字节)

例:

(gdb) x /10cb argv[0]

以字节为单位,10个字节,用字符格式显示

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值