gdb是Linux下非常实用的程序调试插件,因为Linux默认在gcc生成a.out时生成的是Release版本,在ELF段中不存在Debug相关段,需要在编译时在命令最后加上-g 标识,标识生成Debug版本,也因为Debug是在ELF段中插入Debug段落,所以我们可以确定Debug版本是在编译阶段就将相关调试插件放入程序中,而不是在链接的时候放入的。
GDB的相关命令
GDB使用的指令分为以下几个部分,在此一一罗列出:
断点管理命令
l 显示源代码(默认显示main函数所在的文件的源代码)
list filename:num 显示指定文件指定行附近的源代码
b linenum 给指定行添加断点
b funactionname 给指定函数添加断点
b filename:linenum 给指定文件指定行添加断点
b linenum if 条件 添加一个条件断点(if i == 5)在多次循环中使用更加精确和普遍
info b 显示当前所有断点信息
d bpnum 删除断点
disable bpnum 将断点设置为无效
enable bpnum 将断点设置为有效
执行过程控制
r 启动调试
n 执行下一步
s 进入函数执行 类比Visual Studio中的逐语句运行
finish 退出当前函数执行的过程(无论是否真正执行完函数内容)
c 继续运行 运行到下一个断点,中间过程不在停止,如果再没有断点则会运行到程序结束
q 退出调试
p valname 查看变量的值
p &valname 查看变量的地址
p *ptr 查看指针指向的地址存储的值(相当于解引用一次,获取指针所指的值)
//
int arr[10] = {0};
int *parr = arr
//
p arr 显示数据所有的元素,arr是数组首地址,输出数组所有元素数据
p ptrr 这是一个指针变量,会输出数组首元素的地址
p *parr@num 这里的num是元素个数,通过指向数组的指针显示数组所有元素
struct_val 显示结构体变量中所有的成员值
p struct_val.group 显示结构体变量中某个成员值
p ptr_struct->a 通过指针显示结构体变量某个成员的值
p funactionname(a,b) 将函数测试运行(适合于测试函数崩溃的原因是否由传入参数造成)
bt 显示函数调用栈 函数调用流程
之后会写一篇博文来实战gdb调试。