欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

GDB --- linux调试工具介绍

程序员文章站 2022-06-03 22:43:38
...

GDB

GDB是一套字符界面的程序集,可以用它在linux上调试c和c++程序,它提供了以下的功能:
1. 在程序中设置断点,当程序运行到断点处暂停
2. 显示变量的值,可以打印或者监视某个变量,将某个变量的值显示出来
3. 单步执行
4. 运行时修改变量的值
5. 跟踪路径
6. 线程切换

1、 前提条件: 要使用gdb,在用gcc编译时,需要加上 -g,gcc会向程序中插入一下信息,作为gdb调试时的铺垫,然后gdb才能够利用这些铺垫和信息与程序交互,并且调试时,如果想展示源代码,需要将源代码放在同样的路径

2、 进入gdb:
a. 直接输入gdb -> 用 file命令加载要调试的程序
b. 命令: gdb 程序名

3、 调试命令:

start -> 启动程序,gdb停在main函数中变量定义之后的第一条语句处等待我们发命令
set args 参数值1 参数值2 -> 设置输入参数
list 行号 -> 显示行号周围的源程序: list 开始行号, 结束行号 -> 选择区间来打印  list 函数名 -> 显示函数名对应的源代码  list - 10 -> 显示第10行前面的源代码
bt -> 查看各级函数调用及参数(backtrace) f 栈帧编号 -> 选择栈帧,然后在执行info locals查看函数中的局部变量值
b 位置 -> 设置断点
run 参数 -> 运行程序,运行程序的参数
display 变量名  -> 显示变量
c -> 继续运行程序
q -> 退出GDB
p 变量名 -> 打印变量的值
设置条件断点 : b 44 if i == 2
delete (delete 断点编号) -> 删除断点
whatis 或者 ptype (whatis i) -> 显示变量的类型
s -> 单步跟踪进入 step into
n -> 单步跟踪 step over
ctrl + x + a -> 切换子程序


examine -> 查看内容地址中的值  x/<n/f/u> <addr> -> n: 正整数,表示显示内存的长度,也就是说从当前地址向后显示几个地址的内容; f: 显示的格式; u: 从当前地址往后请求的字节数,默认4字节
watch <expr> -> 观察某个表达式/变量的值是否有变化 (watch i) -> 执行执行 c 才会有效果
set -> 修改寄存器或者内存 set $rbx=0x0000021000 set {unsigned int }0x0000021000=0x0
jump -> 跳到对应的行执行程序 jump <linespec> 注意:jump命令不会改变当前的程序栈中的内容,所以,如果使用jump从一个函数跳转到另一个函数,当跳转到的函数运行完返回,进出栈操作时必然会发生错误。
signal -> 产生一个信号量给被调试的程序,如中断信号 ctrl + c , signal <signal> 系统信号量通常从115
return -> 如果在函数中设置了调试断点,在断点后还有语句没有执行完,可以使用return命令强制函数忽略还没有执行的语句并返回。return <expression> : 该表达式的值会被作为函数的返回值
call <expr> -> 强制调用某函数,会显示函数的返回值 call add(1, 3)
info  -> 可以在调试时查看寄存器、断点、观察点和信号等信息。info registers -> 查看除了浮点寄存器以外的寄存器  info all-registers -> 查看所有寄存器,包括浮点寄存器  info registers <regname...> -> 查看所指定的寄存器  info break -> 查看断点信息  info watchpoints -> 查看所有观察点  info signals -> 有哪些信号被GDB检测 info handle ; info line -> 查看源代码在内存中的地址 info threads -> 查看多线程  info line 后面可以跟行号、函数名、文件名 -> 源码所在的内存地址  info locals -> 查看函数内局部变量的值
disassemble -> 用于反汇编,被用来查看当前执行时的源代码的机器码  disassemble add