博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
学习GDB(二)
阅读量:7079 次
发布时间:2019-06-28

本文共 2615 字,大约阅读时间需要 8 分钟。

hot3.png

二、检查和设置变量

1、变量的高级检查和设置

     输出一个结构体中三个变量的值:

(gdb)p tmp->val$1 = 12(gdb)p tmp->left$2 = (struct node *)0x8049098(gdb)p tmp->right$3 = (struct node *)0x0

      键入3个print命令很费力,代替来做相同事情的方法:

     -第一个改进:输出完整结构

(gdb)p *tmp$4 = {val = 12,left = 0x8049098,right = 0x0}

     tmp指向一个结构,那么*tmp就是这个结构本身,GDB向我们显示了完整的内容。

     -第二个改进:使用GDB的display命令

     这个命令要求GDB在执行中每次有暂停(由于有断点,使用next或step命令等)时就输出指定条目。

     -第三个改进:使用GDB的commands命令

     -第四个改进:使用GDB的call命令

(gdb) commands 1Type commands for breakpoint(s) 1, one per line.End with a line saying just "end".>printf "***********current tree************">call printttree(root)>end

     可以动态地修改给定断点的指令集,或者通过简单地重新定义一个空集合来取消命令集。

(gdb) commands 1Type commands for breakpoint(s) 1, one per line.End with a line saying just "end".>end

2、检查动态数组

     2.1  GDB中输出数组

     如数组:int x[25];  输出整个数组是:

(gdb)p x

     2.2  GDB输出动态数组

     GDB中可以通过创建一个人工数组(artifical  array)来解决这个问题。

#include 
#include 
int *x ;int main(){  x = (int*)malloc(25*sizeof(int));  x[3] = 12;  return 0;}

     可以如下执行:

(gdb) b 4Breakpoint 1 at 0x8048426: file test.c, line 4.(gdb) rStarting program: /home/mimiasd/mimiasd2/test Breakpoint 1, main () at test.c:88      x = (int*)malloc(25*sizeof(int));(gdb) n9      x[3] = 12;(gdb) n10      return 0;(gdb) p *x@25$1 = {0, 0, 0, 12, 0 
}

     可以看到一般格式为:*point@number_of_elements  ;

     GDB还可以使用适当的强制类型转换,如:

(gdb) p (int [25])*x$2 = {0, 0, 0, 12, 0 
}

     -ptype  ;方便快速浏览了类或结构(struct)的结构(structure)。

3、监视局部变量

     -info  locals  ;得将到当前栈帧中的所有局部变量的值列表

     -p/x var  ;以十六进制格式显示变量var。默认是十进制。/c用字符显示,/s用字符串,/f用浮点数。

     -info disp  ;列出dispaly条目。

     -dis disp display_list_number  ;临时禁止显示列表中的条目display_list_number;

     -enable disp display_list_number  ;重启条目。

     -undisp display_list_number  ;完全删除显示的条目。

4、GDB中设置变量

     -set  var = variable  ; 把变量var设置为variable。

     -info  args  ;检查当前函数参数。设置这些参数如下:

(gdb)set args 1 2 3 4 ...;

5 、GDB自己的变量

     GDB的print命令输出值被标记为$1,$2等,这些值被统称为值历史。将来执行print时使用这些值历史会比较方便:

(gdb) p/f x$6 = 3.99292288e-34(gdb) p $6$7 = (int *) 0x804b008

     如果没有进行方便输出,则可以使用特殊历史变量$:

(gdb) p $6$7 = (int *) 0x804b008(gdb) p $$8 = (int *) 0x804b006

6、方便变量

     GDB中可以设置根据规则的改变量,称作方便量(convenience variable)。如下:

(gdb)set $q = p

     从那时起执行的命令如下:

(gdb)p *$q

      这里的变量$q就是方便变量。例如下面代码:

#include 
#include 
int x[4] = {1,2,3,4};int main(){  x[2] = 88;  return 0;}

     在GDB中可能做一些类似如下所示的事情:

(gdb) b 4Breakpoint 1 at 0x80483f0: file test1.c, line 4.(gdb) rStarting program: /home/mimiasd/mimiasd2/test1 Breakpoint 1, main () at test1.c:77      x[2] = 88;(gdb) n8      return 0;(gdb) set $i = 0(gdb) p x[$i++]$1 = 1(gdb) $2 = 2(gdb) $3 = 88(gdb) $4 = 4

     可以看出方便变量$i在不断的增加。方便变量不能为$1,$2这种值历史保留的名称,如果是汇编语言也不能使用寄存器名称。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

转载于:https://my.oschina.net/u/2537915/blog/636313

你可能感兴趣的文章
42 个移动端启动页面优化 Tips
查看>>
Egret之ProtoBuf安装
查看>>
Cocos2d-x3.0游戏实例《别救我》目录
查看>>
我的友情链接
查看>>
ASP开发中数据库文件调用的捷径
查看>>
debian启动项与服务设置
查看>>
WinPcap编程环境设置
查看>>
基于openssl的https服务配置
查看>>
从 CentOS 5.5 中精简出属于自己的专属Linux (三)
查看>>
C和指针---第十五章:输入/输出函数
查看>>
Linux打开txt文件乱码的解决方法
查看>>
腾讯微博android授权 SharedPreferences用法
查看>>
图文详解YUV420数据格式
查看>>
nginx 【logformat】日志格式
查看>>
【Linux系列】【基础版】第四章 Shell基础之正则表达式
查看>>
JWT 在 Spring 上的实践
查看>>
释放linux缓存
查看>>
4、C语言 —— 基本运算
查看>>
js判断是否是ipad还是iphone及各手机用户
查看>>
同时添加多个github ssh key的方法
查看>>