GDB调试器

本文详细介绍了GDB调试器的使用,包括观察窗口、检查栈信息、查看源代码和内存、改变程序运行等核心功能。通过设置断点、单步执行、查看变量值、调试多进程和多线程程序等命令,帮助开发者更有效地进行程序调试。

编译时要加-g

  • gdb 可执行文件名

在gdb内就可以:

  • file 可执行文件名

 

  • start
  • break n:在n行设置断点
  • break 函数名称:程序进入指定功能函数时停止运行
  • break 行号/函数名称 if 条件:符合if语句条件时,运行到指定位置停止运行
  • run:运行程序
  • continue:继续运行程序
  • next:单步执行程序语句
  • step:进入子函数
  • print:显示变量的值,print a=n,给a赋值n
  • print $:显示给定序号的前一个序号的值
  • print $$:显示给定序号的前两个序号的值
  • print 开始表达式@要打印的连续空间大小:用于打印数组,开始表达式例子,a[2]
  • enable:enable命令可以恢复暂时不起作用的断点,例如程序已经运行完了第二个断点,反过来还想运行第一个断点处,此时可以使用enable命令。(多个断点加空格)enable后run
  • disable:使断点失效,然后用continue命令继续执行程序
  • delect:清除断点,需要标明断点的编号,没有提示信息
  • clear:清除断点,需要标明断点所在的行号,会有提示信息
  • display:用于显示表达式的值,该命令每当程序运行到断点处就会显示表达式的值
  • disable display/delete display/undisplay 序号:无效显示
  • enable display:恢复失效
  • whatis:显示数据类型
  • ptype:显示数据类型,同时给出类型的定义(如类和结构体变量)
  • set variable a=n:给a设置值为n
  • x/<n/f/u><addr>:查看此内存地址中的值。n表示显示内容的个数。f表示的输出格式有如下,

x:十六进制整数

d:有符号十进制整数

u:无符号十进制整数

o:八进制整数格式

t:二进制整数格式

c:字符格式

f:浮点数格式

u表示从当前地址开始向后请求的字节数。默认为4字节

b:字节

h:双字节数值

w:4字节数值

g:8字节数值

使用观察窗口功能及其命令

  • watch:用于监视被写的内容,一旦表达式值<a>3>(或变量值a)有变化,就立即停住程序
  • rwatch:当表达式值(或变量值)被读取时,就停住程序
  • awatch:用于当表达式的值被读或写时,停住程序
  • info watchpoints:用于列出当前所有监视点的相关信息

检查栈信息功能及其命令

当程序调用了一个函数时,函数的地址、函数参数、函数内的局部变量都被压入并保存在栈中。

  • backtrace:简写bt,用于显示当前的函数调用栈的所有信息
  • backtrace n:简写bt n,只显示栈顶上n层的栈信息,若n为负整数时,表示只显示栈底下n层的栈信息
  • frame n:显示第n层栈的信息,没有n表示显示当前栈层的所有信息
  • up n:向栈底方向移动n层,没有n为一层
  • down n:向栈顶方向移动n层,没有n为一层
  • info frame:简写info f,可以显示更为详细的栈层信息
  • info args:显示当前函数的参数及值
  • info locals:显示当前函数局部变量及其值
  • info catch:显示当前函数中的异常处理信息

检查源代码功能及其命令

  • list:显示当前行号后面的代码(<表示list后面加上的值>)
  • <+>:显示当前行号后面的代码
  • <->:显示当前行号前面的代码
  • <n>:显示程序第n行周围的代码
  • <function>:显示函数名为function的功能函数代码
  • <first,last>:从first行到last行
  • <,last>:当前行到last行
  • <filename:n>:显示文件名为filename的文件的第n行代码
  • <filename:function>:显示文件名为filename的文件中的函数名为function的函数的代码
  • set listsize <count>:设置每一次显示源代码的行数
  • show listsize:查看当前显示源代码的行数设置

查看源代码内存

  • info line:后面跟参数可以是行号也可以是函数名
  • disassemble:查看源程序当前执行时的机器码,即汇编代码

改变程序的运行及其命名

set命令

  • set $pc=0x400531:更改跳转执行的地址

jump命令

  • jump <file:line>:代表跳转到此行开始运行
  • jump <addr>:跳转到地址为addr处的语句开始执行

return命令

  • return <exp>:将表达式的值作为函数返回值,没有表达式就正常返回

call命令

  • call <exp>:显示表达式的值,或显示函数的返回值

gdb调试多进程程序

先运行服务器,然后找到目标子进程的PID,再将其附加(attach)到gdb调试器上

  • ps -awx |grep cgisrv
  • gdb
  • attach 4183

follow-fork-mode允许我们选择程序在执行fork系统调用后是继续调试父进程还是调试子进程

  • set follow-fork-mode mode:mode的可选值是parent和child

gdb调试多线程程序

  • info threads:显示当前可调试的所有进程。每个线程都有ID,ID前面有“*”号的线程是当前被调试的线程
  • thread ID:调试目标ID指定的线程
  • set scheduler-locking [off/on/step]:调试多线程时,默认除了被调试线程在执行外,其他线程也在继续执行,这是默认值;on表示只有当前被调试的线程会继续执行;step表示在单步执行的时候,只有当前线程会执行

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值