linux进阶20——GDB(六):查看变量命令(print和display)

2023-05-16

一段c语言程序:

#include <stdio.h>
int main(){
    int num,result=0,i=0;
    scanf("%d", &num);
    while(i<=num){
        result += i;
        i++;
    }  
    printf("result=%d\n", result);
    return 0;
}

1. print

1.1 功能

在 GDB 调试程序的过程中,输出或者修改指定变量或者表达式的值。

1.2 语法

(gdb) print num
(gdb) p num

其中,参数 num 用来代指要查看或者修改的目标变量或者表达式。

1.3 示例

[root@localhost day6]# gcc test1.c -o test1 -g
[root@localhost day6]# gdb test1 -q
Reading symbols from /home/gdb/day6/test1...done.
(gdb) l 0
1	#include <stdio.h>
2	int main(){
3	    int num,result=0,i=0;
4	    scanf("%d", &num);
5	    while(i<=num){
6	        result += i;
7	        i++;
8	    }  
9	    printf("result=%d\n", result);
10	    return 0;
(gdb) 
11	}
(gdb) b 3
Breakpoint 1 at 0x40057a: file test1.c, line 3.
(gdb) info breakpoints 
Num     Type           Disp Enb Address            What
1       breakpoint     keep y   0x000000000040057a in main at test1.c:3
(gdb) r
Starting program: /home/gdb/day6/test1 

Breakpoint 1, main () at test1.c:3
3	    int num,result=0,i=0;
Missing separate debuginfos, use: debuginfo-install glibc-2.17-323.el7_9.x86_64
(gdb) n
4	    scanf("%d", &num);
(gdb) p num
$1 = 32767
(gdb) b 9
Breakpoint 2 at 0x4005b2: file test1.c, line 9.
(gdb) info breakpoints 
Num     Type           Disp Enb Address            What
1       breakpoint     keep y   0x000000000040057a in main at test1.c:3
	breakpoint already hit 1 time
2       breakpoint     keep y   0x00000000004005b2 in main at test1.c:9
(gdb) c
Continuing.
4

Breakpoint 2, main () at test1.c:9
9	    printf("result=%d\n", result);
(gdb) p result
$2 = 10
(gdb) c
Continuing.
result=10
[Inferior 1 (process 1793) exited normally]
(gdb) 

2. display

2.1 功能

使用 display 命令查看变量或表达式的值,每当程序暂停执行(例如单步执行)时,GDB 调试器都会自动帮我们打印出来,而 print 命令则不会。

2.2 语法

(gdb) display expr
(gdb) display/fmt expr

其中,expr 表示要查看的目标变量或表达式;参数 fmt 用于指定输出变量或表达式的格式,表 1 罗列了常用的一些 fmt 参数。

注意,display 命令和 /fmt 之间不要留有空格。以 /x 为例,应写为 (gdb)display/x expr。

2.3 示例

[root@localhost day6]# gdb test1 -q
Reading symbols from /home/gdb/day6/test1...done.
(gdb) l 0
1	#include <stdio.h>
2	int main(){
3	    int num,result=0,i=0;
4	    scanf("%d", &num);
5	    while(i<=num){
6	        result += i;
7	        i++;
8	    }  
9	    printf("result=%d\n", result);
10	    return 0;
(gdb) 
11	}
(gdb) b 4
Breakpoint 1 at 0x400588: file test1.c, line 4.
(gdb) b 9
Breakpoint 2 at 0x4005b2: file test1.c, line 9.
(gdb) info breakpoints 
Num     Type           Disp Enb Address            What
1       breakpoint     keep y   0x0000000000400588 in main at test1.c:4
2       breakpoint     keep y   0x00000000004005b2 in main at test1.c:9
(gdb) r
Starting program: /home/gdb/day6/test1 

Breakpoint 1, main () at test1.c:4
4	    scanf("%d", &num);
Missing separate debuginfos, use: debuginfo-install glibc-2.17-323.el7_9.x86_64
(gdb) display num
1: num = 32767
(gdb) n
5
5	    while(i<=num){
1: num = 5
(gdb) c
Continuing.

Breakpoint 2, main () at test1.c:9
9	    printf("result=%d\n", result);
1: num = 5
(gdb) diaplay result
Undefined command: "diaplay".  Try "help".
(gdb) print result
$1 = 15
(gdb) display/d result
2: /d result = 15
(gdb) 

对于使用 display 命令查看的目标变量或表达式,都会被记录在一张列表(称为自动显示列表)中。通过执行info dispaly命令,可以打印出这张表:

(gdb) info display 
Auto-display expressions now in effect:
Num Enb Expression
2:   y  /d result
1:   y  num
(gdb) 

其中,各列的含义为:

  • Num 列为各变量或表达式的编号,GDB 调试器为每个变量或表达式都分配有唯一的编号;
  • Enb 列表示当前各个变量(表达式)是处于激活状态还是禁用状态,如果处于激活状态(用 y 表示),则每次程序停止执行,该变量的值都会被打印出来;反之,如果处于禁用状态(用 n 表示),则该变量(表达式)的值不会被打印。
  • Expression 列:表示查看的变量或表达式。

对于不需要再打印值的变量或表达式,可以将其删除或者禁用。

1) 通过执行如下命令,即可删除自动显示列表中的变量或表达式:

例如:

(gdb) undisplay 1
(gdb) info display 
Auto-display expressions now in effect:
Num Enb Expression
2:   y  /d result
(gdb) 

(gdb) delete display 2
(gdb) info display 
There are no auto-display expressions now.
(gdb) 

2) 通过执行如下命令,可以禁用自动显示列表中处于激活状态下的变量或表达式:

(gdb) disable display num...

num... 表示要禁用的变量或表达式的编号,编号的个数可以是多个,表示一次性禁用多个变量或表达式

例如:

(gdb) display num
1: num = 32767
(gdb) info display 
Auto-display expressions now in effect:
Num Enb Expression
1:   y  num
(gdb) disable display 1
(gdb) info display 
Auto-display expressions now in effect:
Num Enb Expression
1:   n  num
(gdb) 

当然根据需要,也可以激活当前处于禁用状态的变量或表达式,执行如下命令即可:

(gdb) enable display num...

例如:

(gdb) enable display num
warning: bad display number at or near 'num'
(gdb) 
warning: bad display number at or near 'num'
(gdb) info display 
Auto-display expressions now in effect:
Num Enb Expression
1:   n  num
(gdb) 

总的来说,每次程序停止执行时,GDB 调试器会将自动显示列表中处于激活状态下的变量或表达式的值打印出来,display 命令可以实现在查看目标变量或表达式的值的同时,将其添加到自动显示列表中,而 print 命令则只会打印出目标变量或表达式的值。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

linux进阶20——GDB(六):查看变量命令(print和display) 的相关文章

  • 在 Alpine Docker 容器上安装 OpenSSH

    第一次运行 alpine docker 容器并尝试 openssh 安装时 会发生以下情况 ole T docker run it rm alpine bin ash apk add openssh WARNING Ignoring APK
  • 输出bash脚本的结果

    例如 如果我选择运行一个 bash 脚本 该脚本将输出 回显 时间 例如CheckDate sh 我如何从 Java 运行它 然后在我的 Java 程序中打印 bash 脚本的结果 日期 试试这个代码 String result null
  • 从 TestContainer 访问 Podman REST API

    我使用 Maven 3 和 Podman 1 8 0 开发一个 Java 应用程序 据我了解 Podman 提供了与 Docker 兼容的 REST API Java集成测试使用TestContainer框架 TestContainer 无
  • 在 GDB 中显示结构体值

    在 GDB 中 给定一个指向结构体的变量 print将显示原始指针值并x将显示指向的原始字节 有什么方法可以显示指向该结构的数据 即字段及其值的列表 print variable 如果这样做 它将在 GDB 中显示该变量的值 您还可以选择显
  • Android Studio无法更新

    我正在运行 Mint 14 Linux 并且在使用 Android Studio 时遇到了一个主要问题 运行更新功能时 所有软件包都会返回 访问被拒绝 状态 我怎样才能解决这个问题 如何授予下载和安装的权限 附加信息 studio sh 正
  • 如何格式化 .CSV 文件的日期字段并在字符串字段中包含多个逗号

    我有一个 CSV 文件 file csv 其数据全部用双引号引起来 文件的示例格式如下 column1 column2 column3 column4 column5 column6 column7 Column8 Column9 Colu
  • 系统调用:sys_exit()、SYS_exit 和 exit() 之间的区别

    SYS exit sys exit 和 exit 之间有什么区别 我的理解是 Linux内核提供了系统调用 这些调用在man 2 syscalls 这些系统调用的包装函数由glibc它们的名称与系统调用大多相似 我的问题 在man 2 sy
  • 无法从外部 bash 脚本正确设置 MySQL 密码

    我有两个脚本 主要的一个脚本执行一些不同的操作并调用第二个脚本 第二个脚本安装 MySQL 从我的主脚本中我做了这样的事情 read p Set the password for the database min 4 characters
  • Linux 内核:Spinlock SMP:为​​什么 spin_lock_irq SMP 版本中有 preempt_disable()?

    Linux内核中的原始代码是 static inline void raw spin lock irq raw spinlock t lock local irq disable preempt disable spin acquire l
  • 访问单个结构体成员是否会将整个结构体拉入缓存?

    我一直在读乌尔里希 德雷珀的书 每个程序员都应该了解的内存知识 http lwn net Articles 250967 并在部分3 3 2 缓存效果的测量 http lwn net Articles 252125 页面中间 它给我的印象是
  • 使用 sed 和 pstree 显示正在使用的终端类型

    我一直在尝试仅显示用作名称的终端类型 例如 如果我使用 konsole 它会显示 konsole 到目前为止我一直在使用这个命令 pstree A s 输出这个 systemd konsole bash pstree 我有以下内容可以从该行
  • Shell Linux:grep 带有 NULL 字符的精确句子

    我有一个像这样的文件 key 0value n akey 0value n key2 0value n 我必须创建一个以单词作为参数的脚本 我必须返回具有与参数完全相同的键的每一行 I tried grep aF key x0 但 grep
  • Ansible 权限问题

    我正在尝试将当前用户添加到系统中的某个组 然后执行需要该组权限的命令 我的剧本是这样的 name Add this user to RVM group sudo true user state present name vagrant ap
  • 使用 gdb 调试反汇编库

    在Linux和Mac OS X中可以使用strapi和next来调试应用程序而无需调试信息 在 Mac OS X 上 gdb 显示在库内部调用的函数 尽管有时会在每个 stepi 指令中推进多个汇编程序指令 在 Linux 上 当我进入动态
  • 测试是否定义了 gdb 便利变量

    有没有办法测试 gdb 中是否设置了便利变量 例如 gdb if exitcode 0 gt quit gt end Invalid type combination in equality test gdb p exitcode 1 vo
  • time_t 最终的 typedef 是什么?

    我搜索了我的 Linux 机器并看到了这个 typedef typedef time t time t 但我找不到 time t定义 The 文章对此进行了一些阐述 底线是类型time tC 规范中不保证 The time tdatatyp
  • Qt 的 sysroot 和前缀选项的实际示例是什么

    我正在查看可以运行的所有选项configureQt 提供的脚本 特别是 qt everywhere opensource src 5 2 0 经过大量搜索后 我确定这些东西充其量记录很少 所以我希望我能得到一些帮助 当我查看描述时prefi
  • 如何编写写入 /var/log/myapp 目录的 C/C++ 应用程序?

    背景 在 Linux 系统上 应用程序日志 https help ubuntu com community LinuxLogFiles Application Logs存在于子目录中 var log 其所有者为root root并且在我的系
  • Linux 上的 Chrome - 查询浏览器以查看打开了哪些选项卡?

    我在 Ubuntu Linux 上运行 Chromium 开源 chrome 版本 我可以编写一个程序来查看我打开了哪些选项卡吗 我想编写一个程序来监控我在事情上花费了多少时间 是否有命令行程序 某种调用 chromium browser
  • 哪个信号被传递到信号处理程序中死锁的进程

    我有一个来自调用信号处理程序后死锁的进程的核心转储 如何确定传送了哪个信号以及是谁发送的 GDB 为接收信号的线程生成的回溯如下 信号处理程序在第 15 帧中被调用 gdb bt 0 0x00007fa9c204654b in sys fu

随机推荐

  • CCF-炉石传说

    这题原本想的比较复杂 xff0c 因为每次召唤随从或随从死亡时都要对右边的随从编号进行变动 xff0c 然后构建了链表的数据结构 xff0c 但是越写越复杂 xff0c 所以马上放弃这个思路 其实只要构建一个结构体 xff0c 结构体保存随
  • 宝塔面板开启数据库远程登陆权限

    宝塔面板开启数据库远程登陆权限 默认情况下宝塔面板创建的mysql数据库是本地登陆权限 xff0c 如果要远程管理操作需要单独开启权限 xff0c 具体操作如下 xff1a 1 登陆宝塔面板 xff0c 点击 安全 xff0c 在防火墙里面
  • 重参数化技巧:高斯分布采样

    1 高斯分布采样 我们现在得到了有样本X得到的分布X N mu sigma 2 xff0c 通过采样我们得到确定的隐变量向量 xff0c 从而作为解码器
  • 微擎系统安装流程

    虚拟主机安装微擎系统流程 推荐环境 linux 43 php5 6及以上 43 mysql5 6及以上 如果您购买的主机开通的是windows系统 请先更换成linux系统 如果是虚拟主机 在主机面板 php版本页面选择php7 0 从官网
  • 部署https后浏览器提示不安全,不出现绿色小锁?

    网站部署https后 浏览器提示不安全 不出现绿色小锁图标 访问网站后 按f12 浏览器提示 Mixed Content The page at 39 https www xxx com 39 39 was loaded over HTTP
  • linux系统变为只读出现提示Read-only file system的解决办法

    问题描述 linux系统变为只读 出现提示Read only file system 如图所示 问题原因 系统没有正常关机 导致虚拟磁盘出现文件系统错误 说明 此修复可能会导致个别文件及数据丢失 修复之前建议做好文件备份工作 解决方法 使用
  • 小程序接入微信视频号配置指南

    一 填写视频号品牌信息和视频号类目资质 xff08 需要在平台发布模式后再进行填写 xff09 如图 xff1a 二 如之前已是平台发布模式的 xff0c 还需要操作 更新授权 xff1b 如之前是自主发布的 xff0c 切换到平台发布模式
  • 微信小程序如何使用视频组件

    小程序中可以使用视频组件来播放自己想要展示的视频 xff0c 具体步骤如下 一 添加视频组件 1 点击 店铺 装修店铺 编辑 xff0c 进入小程序页面编辑 2 点击 组件库 视频 xff0c 页面会添加视频组件 xff0c 点击视频组件的
  • 小程序地理位置接口申请

    申请接口理由 xff1a wx chooseAddress 获取用户收货地址提交理由 xff1a 快速定位用户当前位置 xff0c 获取省市区等地址信息 xff0c 方便用户提交地址等信息 wx chooseLocation打开地图选择位置
  • 远程桌面时出现“身份验证错误,要求的函数不受支持”解决办法

    远程桌面时 出现身份验证错误 xff0c 要求的函数不受支持 的错误 xff0c 如图所示 xff1a 这是由于本地客户端或者服务器端一方更新了CVE 2018 0886 的 CredSSP 补丁 xff0c 而另外一方未安装更新的原因导致
  • macbook苹果电脑系统使用“终端”远程登录linux主机

    登录mac系统后 xff0c 依次打开顶部菜单 xff0c 前往 gt 应用程序 gt 实用工具 gt 终端 xff0c 如下图 xff1a 在打开的终端页面 xff0c 输入如下代码 xff1a ssh root 64 服务器IP地址 注
  • wdcp面板无法打开

    打开wdcp面板提示 34 无法连接mysql xff0c 请检查mysql是否已启动及用户密码是否设置正确 34 按http faq myhostadmin net faq listagent asp unid 61 417先ssh方式远
  • java主机禁止某些IP访问的方法

    JAVA主机用的是tomcat来处理数据 xff0c 所以不支持以前apche使用的 htacess方式 xff0c 一般有两种禁止方法可以选择 xff0c 一是在server xml文件里面禁止 xff0c 或者是修改程序代码 1 禁止I
  • 用K-Means和DBSCAN算法对西瓜数据集4.0进行聚类分析

    文章目录 数据集K MeansDBSCAN 用K Means和DBSCAN算法对西瓜数据集4 0进行聚类分析 数据集 density sugercontent span class token number 1 span span clas
  • FSS对象存储挂载到windows云服务器操作方法

    FSS对象存储可以挂载到云主机中用于存储视频 备份等不需要 经常读写的大文件 不适合存放数据库等对IO需求较高 经常读写的场景 1 远程登陆服务器 xff0c 打开控制面板 xff0c 然后点击 打开或关闭windows功能 windows
  • nohup: failed to run command java: No such file or directory解决

    程序里远程执行shell命令 xff08 nohup java jar xff09 的执行 xff0c 后台日志报错如下 xff1a nohup failed to run command 96 java 39 No such file o
  • 七大顶级编程学习网站

    1 B站 xff1a https www bilibili com 不要以为b站只有二次元和游戏 xff0c 很多高质量的 34 开源 34 教程应有尽有 xff0c 如果大家想学实践性较强的知识 xff0c 如java的juc xff0c
  • SpringBoot测试失败并报错: Unable to find a @SpringBootConfiguration, you need to use @ContextConfiguration

    情况一 xff1a 该测试类在测试包test下的包名和类路径java下的包名不一致导致的 xff0c 修改包名一致即可 由于包名自动生成的缘故导致这两个包名不一致 xff0c 引发以下报错 java lang IllegalStateExc
  • bootstrap个人简历毕业作品模板

    简介 xff1a 一款bootstrap框架个人简历模板 xff0c 可以作为前端毕业作品模板 xff0c 模板非常简单 网盘下载地址 xff1a https zijieyunpan cn vOnXW43exgr 图片 xff1a
  • linux进阶20——GDB(六):查看变量命令(print和display)

    一段c语言程序 include lt stdio h gt int main int num result 61 0 i 61 0 scanf 34 d 34 amp num while i lt 61 num result 43 61 i