gdb调试中,对于动态创建的数组,比如 int * x; 这个时候不能像静态数组那样通过p x 就可以打印出整个数组。如果想要打印出整个数组,可以通过创建一个人工数组来解决这个问题。其一般形式为:
gdb还允许在适当的时候使用类型强制转换,比如:
(gdb) p (int[25]*x
gdb的ptype命令可以很方便的快速浏览类或结构体的结构。
(gdb) info locals命令得到当前栈中所有局部变量的值列表。
print和display的高级选项
p /x y 会以十六进制的格式显示变量,而不是十进制的形式。其它常用的格式为c表示字符,s表示字符串,f表示浮点。
可以临时禁用某个显示项。例如
(gdb) dis disp 1
查看条目好,命令是
(gdb) info disp
重新启用条目,命令是
(gdb) enable disp 1
完全删除显示的条目,命令是
(gdb) undisp 1
在gdb中设置变量
在单步调试程序的中间使用调试器设置变量的值是非常有用的。命令是
(gdb) set x = 12
可以通过gdb的set args 命令设置程序的命令行参数。
设置“方便变量”,命令是
(gdb) set $q = p
用来记录特定节点的历史,这个变量q不会去改变自己的地址。
在调用gdb时,可以指定“启动文件”。例如:
gdb –command=z x
表示要在可执行文件x上运行gdb,首先要从文件z中读取命令。
(gdb) jump 34
程序直接跳到34行。
使用strace命令,可以跟踪系统做过的所有系统调用。
进程和线程的主要区别是:与进程一样,虽然每个线程有自己的局部变量,但是多线程环境中父程序的全局变量被所有线程共享,并作为在线程之间通信的主要方法。
可以通过命令 ps axH 来查看系统上当前的所有进程和线程。
gdb线程命令汇总
Info threads (给出关于当前所有线程的信息)
thread 3 (改成线程3)
break 88 thread 3 (当线程3到达源代码行88时停止执行)
break 88 thread 3 if x == y
内存查看命令
可以使用examine命令(简写是x)来查看内存地址中的值。x命令的语法如下所示:
x/<n/f/u> <addr>
其中,n是一个正整数,表示需要显示的内存单元的个数。
f 表示显示的格式:x 按十六进制格式显示变量
d 按十进制格式显示变量
u 按十六进制格式显示无符号整型
o 按八进制格式显示变量
t 按二进制格式显示变量
c 按字符格式显示变量
f 按浮点数格式显示变量
u 表示从当前地址往后请求的字节数,如果不指定的话,GDB默认是4个bytes。u参数可以用下面的字符来代替,b表示单字节,h表示双字节,w表示四字 节,g表示八字节。当我们指定了字节长度后,GDB会从指内存定的内存地址开始,读写指定字节,并把其当作一个值取出来。
命令:x/3uh 0x54320 表示,从内存地址0x54320读取内容,h表示以双字节为一个单位,3表示输出三个单位,u表示按十六进制显示。