<gdb常用调试命令>

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

<Linux gdb调试打印完整字符串>

在使用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' <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表示按无符号十进制显示。

 

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐