Linux gdb调试命令(如何打印完整字符串) 您所在的位置:网站首页 打印字符串长度 Linux gdb调试命令(如何打印完整字符串)

Linux gdb调试命令(如何打印完整字符串)

2024-07-17 23:20| 来源: 网络整理| 查看: 265

gdb调试 1、 gdb test 2、(gdb)b xxx.cpp:1061 //打断点 b + 偏移量 b + 函数名 info b //查看断点 3、(gdb) run --gtest_filter=*.xxxx verbose //执行用例 run (r) 执行源代码中一行的命令next(简称n)//执行时如果遇到函数调用,可能想执行到函数内部,这时用step(简称p) continue(c) // continue+n忽略指定次数的断点 delete(d) d + 编号// 删除断点或监视点 4、(gdb)p/x *dirTransMsg//打印 p argv p *argv p argv[o]//首元素指针 p argv[1] p/格式变量 格式x显示为16进制 d显示为10进制 u无符号10进制数 c显示为字符 ASCII f显示为浮点小数 5、*****[监视点]!!! watch //表达式发生变化时暂停 awatch//表达式被访问、改变时暂停 ratch //被访问时暂停 6、设置变量 set $s= context.size() 7、反汇编disassemble/m function_1

在使用gdb调试过程中,经常需要查看变量的值,最常用的方法:(gdb) print {变量名} 一般情况下,打印并不存在问题。但当一个字符串比较长时,打印出来的内容不完整,内容的最后为"..." 例如:

可以看到后面带有省略号,内容没有完整的显示出来。 如何才能将需要print的内容完整显示出来呢?其实gdb 默认有一个最大显示长度限制,可能通过show print elements命令查看: 

(gdb) show print elements Limit on string chars or array elements to print is 200. (gdb)

可以看到最大显示长度是200那么要完全显示就要改变这个参数的值了,用set print elements 0 命令设置即可:

(gdb) help set print elements Set limit on string chars or array elements to print. "set print elements 0" causes there to be no limit. (gdb) (gdb) set print elements 0 (gdb) show print elements Limit on string chars or array elements to print is unlimited. (gdb)

再用print就可以完整显示了 :

当然如果不想改这个参数,也可以通过以下命令显示(下面这个方法我试过没有用,并不能突破elements数的限制):

(gdb) p *test@1 $7 = "0" (gdb) p *test@4 $8 = "0123" (gdb) p *test@1024 $9 = "0123456789abcdefghijklmnopqrstuvwxyz\n0123456789abcdefghijklmnopqrstuvwxyz\n0123456789abcdefghijklmnopqrstuvwxyz\n0123456789abcdefghijklmnopqrstuvwxyz\n0123456789abcdefghijklmnopqrstuvwxyz\n0123456789abcdefghijklmnopqrstuvwxyz\n0123456789abcdefghijklmnopqrstuvwxyz\n0123456789abcdefghijklmnopqrstuvwxyz\n0123456789abcdefghijklmnopqrstuvwxyz\n", '\000' (gdb)

可以使用examine命令(简写是x)来查看内存地址中的值。x命令的语法如下所示:x/ n、f、u是可选的参数:n 是一个正整数,表示需要显示的内存单元的个数,也就是说从当前地址向后显示几个内存单元的内容,一个内存单元的大小由后面的u定义。f 表示显示的格式,如果地址所指的是字符串,那么格式可以是s,如果地十是指令地址,那么格式可以是i。u 表示从当前地址往后请求的字节数,如果不指定的话,GDB默认是4个bytes。u参数可以用下面的字符来代替,b表示单字节,h表示双字节,w表示四字 节,g表示八字节。当我们指定了字节长度后,GDB会从指定的内存地址开始,读写指定字节,并把其当作一个值取出来。表示一个内存地址。

注意:严格区分n和u的关系,n表示单元个数,u表示每个单元的大小。 n/f/u三个参数可以一起使用。例如: 命令:x/3uh 0x54320 表示,从内存地址0x54320读取内容,h表示以双字节为一个单位,3表示输出三个单位,u表示按无符号十进制显示。

 



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有