IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> gdb 笔记(06)— 查看当前函数参数、查看结构体/类的值、查看数组的值 -> 正文阅读

[C++知识库]gdb 笔记(06)— 查看当前函数参数、查看结构体/类的值、查看数组的值

1. 查看当前函数参数

当程序在函数中暂停后,即可查看函数的参数。语法如下:

info agrs

或者

i args

使用示例

(gdb) b fun_test
Breakpoint 1 at 0x969: file demo.cpp, line 6.
(gdb) r
Starting program: /home/wohu/cppProject/book_debug/chapter_3.1/demo 
ret is 8

Breakpoint 1, fun_test (a=10, str=0x555555554b21 "test") at demo.cpp:6
6	    printf("a is %d, str is %s\n", a, str);
(gdb) info args
a = 10
str = 0x555555554b21 "test"
(gdb) i args
a = 10
str = 0x555555554b21 "test"
(gdb)

2. 查看/修改变量的值

在程序命中断点时,可以查看变量的值。这个变量可以是全局变量,也可以是局部变量,而且当前上下文能够访问的变量都可以查看。语法如下:

print 变量名 
# 或者
p 变量名

如果要修改查看到的变量值,可以使用下述命令:

print 变量名=

即如果要改变 x 变量的值,将它修改为 20,可以使用命令 p x=20 。对于结构体或者类对象,也可以使用这种方式修改成员的值,例如 p test->x=30p node.ID=100 等。

完整示例过程

(gdb) p a
$1 = 10
(gdb) p str
$2 = 0x555555554b21 "test"
(gdb) p x = 20
No symbol "x" in current context.
(gdb) p a = 20
$3 = 20
(gdb) c
Continuing.
a is 20, str is test

Breakpoint 1, fun_test (a=10, str=0x555555554b21 "test") at demo.cpp:6
6	    printf("a is %d, str is %s\n", a, str);
(gdb) 

2.1 使用gdb内嵌函数

在使用 print 或者 p 命令时,可以直接使用 gdb 内嵌的一些函数(比如 C 函数),比如 sizeofstrcmp 等,也可以使用一些常见的表达式。当使用内嵌函数时,通常不是查看某个变量的值,而是进行一些计算或者比较等操作。这样,就可以实时地查看一些信息。

比如,想了解 longLinux gcc 下占用几个字节长度、某个结构体所占用的空间大小等,都可以使用sizeof 来计算。比如可以直接使用 p sizeof(long)p sizeof(NODE) 等。

(gdb) p sizeof(int)
$4 = 4
(gdb) p sizeof(long)
$5 = 8
(gdb) p sizeof(void*)
$6 = 8
(gdb) p 12 == 12
$7 = true

2.2 查看结构体/类的值

1
当命中第38行的断点时,可以查看 new_node 的值。由于 new_node 是一个指针,因此可以查看这个指针本身,也可以查看其成员的值,如图所示。

56
但是我们会发现,要查看结构体各个成员的值比较麻烦,因为这个结构体有 3 个数据成员,所以使用了3 次 p 命令。查看 new_node 结构体更加方便的方式是直接查看这个结构体的对象值,而不是new_node 指针本身。也就是说,在查看 new_node 指针指向的内容的值时,使用 p *new_node 可以显示整个结构体的成员信息,如图所示。

57
我们还可以删除上图中显示的空字符,使显示更美观。在 gdb 中输入 set print null-stop 命令,设置字符串的显示规则,即遇到结束符时停止显示。通过设置之后,再次执行 p *new_node 命令,Name部分不会再显示空字符,如图所示。

58
如果结构体的成员比较多,这种显示仍然会杂乱无章,不方便查看每一个成员的数据,也就是说还不够漂亮(pretty)。gdb 还提供了一个使显示更加漂亮的选项,命令为 set print pretty 。设置之后,我们再次使用 p *new_node 命令来查看,结果如图所示。
59
类变量也可以使用 p 命令来显示,只要设置了 print pretty ,显示出来的类成员也与结构体成员相同,如图所示。
60

2.3 查看数组

同样,使用 print 或者 p 命令也可以查看数组的信息。
256启动调试后,为print_arr_test函数设置断点,在该函数中查看两个数组iarr和strarr的值,如图所示。
61
该显示的问题与查看结构体的问题相同,即不太美观。在执行 set print pretty 命令后,数组的显示效果并没有改善。控制数组显示的命令为 set print array on ,其中 on 可以省略,默认情况下为 off ,因此在 gdb 中执行 set print array 命令,以便能够在显示数组时更方便查看,如图所示。
655

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2022-06-08 18:52:05  更:2022-06-08 18:52:41 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 16:49:23-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码