首页 > 编程知识 正文

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

时间:2023-05-06 00:09:45 阅读:197467 作者:2329

<gdb常用调试命令> gdb调试1、 gdb test2、(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 argvp *argvp 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 <Linux gdb调试打印完整字符串>

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

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

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

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

(gdb) help set print elementsSet 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 elementsLimit 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 = "0123456789abcdefghijklmnopqrstuvwxyzn0123456789abcdefghijklmnopqrstuvwxyzn0123456789abcdefghijklmnopqrstuvwxyzn0123456789abcdefghijklmnopqrstuvwxyzn0123456789abcdefghijklmnopqrstuvwxyzn0123456789abcdefghijklmnopqrstuvwxyzn0123456789abcdefghijklmnopqrstuvwxyzn0123456789abcdefghijklmnopqrstuvwxyzn0123456789abcdefghijklmnopqrstuvwxyzn", '00' <repeats 690 times>(gdb) <gdb命令中查看地址之x命令>

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

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

 

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。