GDB的调试
gdb调试技巧
Debug 版本
Debug 版本为可调式版本,生成的可执行文件中包含调试需要的信息。我们作为开发人员,最常用的就是 debug 版本的可执行文件。
Debug 版本的生成:
因为调试信息是在编译过程时加入到中间文件(.o)中的,所以必须在编译时控制其生成包含调试信息的中间文件。
gcc -c hello.c -g —> 生成包含调试信息的中间文件
gcc -o hello hello.o
或者 gcc -o hello hello.c -g
Release 版本
Release 版本为发行版本,是提供给用户使用的版本。用 gcc 默认生成的就是 Release 版本。
首先将源代码编译、链接生成 Debug 版本的可执行文件,然后通过‘gdb Debug 版本的可执行文件名’进入调试模式。
调试程序:
调试的对象是:可执行程序;
在linux下调试需要
调试程序 : gdb
编译时需要增加调试信息 -g(变为debug版本)
gdb中常用的命令:
l显示代码;b+行号设置断点;info break查看断点信息;d 1 删除断点1;r启动程序;r -d;n单步执行,p打印,q退出;s进入函数;finish退出函数;c跳出循环一直运行而非单步到下一个断点停止C后没有断点程序执行到结束;bt当程序发生段错误时,GDB会停在错误发生的位置,你可以使用backtrace命令来查看堆栈跟踪信息,帮助你找到错误的源头;set print elements 0
设置数组元素的最大打印数量。GDB 默认只显示数组的前 200 个元素(具体数量可能因版本而异),超过部分会用省略号 ... 代替。
参数 0 表示不限制打印数量,即显示完整的数组内容。
gdb 打印变量相关操作
格式 说明 示例
x 十六进制(hex) p /x num
t 二进制(two's complement) p /t num
d 十进制(decimal) p /d num
s 字符串(string) p /s str
gdb打印地址内存
一、直接打印指针变量
指针变量存储的就是内存地址,直接打印即可:gdb
(gdb) p ptr
$1 = (int*) 0x7fffffffe3fc # 输出指针值(内存地址)
二、获取变量的内存地址
使用 & 运算符获取变量的地址:gdb
(gdb) p &var
$2 = (int*) 0x7fffffffe3f8 # 输出变量var的内存地址
三、以十六进制格式显示地址
使用 /x 修饰符强制以十六进制格式打印:gdb
(gdb) p/x ptr
$3 = 0x7fffffffe3fc(gdb) p/x &var
$4 = 0x7fffffffe3f8四、查看内存地址处的内容
使用 x 命令(examine memory)查看指定地址的内存内容:gdb
(gdb) x/4xw 0x7fffffffe3f8 # 查看地址处4个字(word)的十六进制内容
0x7fffffffe3f8: 0x00000001 0x00000002 0x00000003 0x00000004
如何gdb一个正在运行的程序
#查看进程id
1,ps axf | grep chengxu
2,gdb -p 进程id