gdb调试命令总结

时间:2022-12-14 00:17:03

gdb调试中,对于动态创建的数组,比如 int * x;  这个时候不能像静态数组那样通过p x 就可以打印出整个数组。如果想要打印出整个数组,可以通过创建一个人工数组来解决这个问题。其一般形式为:

    *pointer@number_of_elements

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表示按十六进制显示。