当前位置: 首页 > news >正文

学习GDB(二)

2019独角兽企业重金招聘Python工程师标准>>> 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 1
Type commands for breakpoint(s) 1, one per line.
End with a line saying just "end".
>printf "***********current tree************"
>call printttree(root)
>end

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

(gdb) commands 1
Type 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 <stdio.h>
#include <stdlib.h>

int *x ;

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

     可以如下执行:

(gdb) b 4
Breakpoint 1 at 0x8048426: file test.c, line 4.
(gdb) r
Starting program: /home/mimiasd/mimiasd2/test 

Breakpoint 1, main () at test.c:8
8      x = (int*)malloc(25*sizeof(int));
(gdb) n
9      x[3] = 12;
(gdb) n
10      return 0;
(gdb) p *x@25
$1 = {0, 0, 0, 12, 0 <repeats 21 times>}

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

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

(gdb) p (int [25])*x
$2 = {0, 0, 0, 12, 0 <repeats 21 times>}

     -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 <stdio.h>
#include <stdlib.h>

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

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

(gdb) b 4
Breakpoint 1 at 0x80483f0: file test1.c, line 4.
(gdb) r
Starting program: /home/mimiasd/mimiasd2/test1 

Breakpoint 1, main () at test1.c:7
7      x[2] = 88;
(gdb) n
8      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

相关文章:

  • 【C++】模版的概念、使用方法和深入了解
  • Ajax:拥抱JSON,让XML走开
  • Intellij IDEA 根据数据库自动生成pojo和hbm
  • Storm的2种运行模式
  • GridView创建菜单栏
  • 问题-某个程序改了ICO图标后编译后还是显示老图标?
  • 自动生成小学四则运算题目的程序
  • Android视频直播解决方案(rstp、udp)
  • js实现touch移动触屏滑动事件
  • 7、JavaScript 知识总结
  • 正则学习笔记
  • 注解
  • 堆和栈的区别(转过无数次的文章)
  • 我的Python成长之路---第七天---Python基础(21)---2016年2月27日(晴)
  • 进度条2
  • angular2开源库收集
  • Apache Spark Streaming 使用实例
  • Apache的基本使用
  • HashMap剖析之内部结构
  • JavaScript 事件——“事件类型”中“HTML5事件”的注意要点
  • learning koa2.x
  • Linux编程学习笔记 | Linux IO学习[1] - 文件IO
  • mockjs让前端开发独立于后端
  • Python打包系统简单入门
  • Theano - 导数
  • 彻底搞懂浏览器Event-loop
  • 关于List、List?、ListObject的区别
  • 解决iview多表头动态更改列元素发生的错误
  • 名企6年Java程序员的工作总结,写给在迷茫中的你!
  • 网络应用优化——时延与带宽
  • ​ssh-keyscan命令--Linux命令应用大词典729个命令解读
  • (1/2) 为了理解 UWP 的启动流程,我从零开始创建了一个 UWP 程序
  • (pytorch进阶之路)CLIP模型 实现图像多模态检索任务
  • (solr系列:一)使用tomcat部署solr服务
  • (草履虫都可以看懂的)PyQt子窗口向主窗口传递参数,主窗口接收子窗口信号、参数。
  • (转)C语言家族扩展收藏 (转)C语言家族扩展
  • .Net 6.0 处理跨域的方式
  • .NET CF命令行调试器MDbg入门(一)
  • .NET CORE 第一节 创建基本的 asp.net core
  • .net core使用RPC方式进行高效的HTTP服务访问
  • .net 生成二级域名
  • .NET 中使用 TaskCompletionSource 作为线程同步互斥或异步操作的事件
  • .sh 的运行
  • @Controller和@RestController的区别?
  • @kafkalistener消费不到消息_消息队列对战之RabbitMq 大战 kafka
  • @RequestBody的使用
  • @基于大模型的旅游路线推荐方案
  • [ CTF ] WriteUp- 2022年第三届“网鼎杯”网络安全大赛(朱雀组)
  • [20140403]查询是否产生日志
  • [2019/05/17]解决springboot测试List接口时JSON传参异常
  • [AR]Vumark(下一代条形码)
  • [BJDCTF2020]The mystery of ip
  • [C#]无法获取源 https://api.nuge t.org/v3-index存储签名信息解决方法
  • [cb]UIGrid+UIStretch的自适应
  • [error] 17755#0: *58522 readv() failed (104: Connection reset by peer) while reading upstream