0%

gdb简单教程

gdb是一个方便的终端调试工具,能够调试多种语言代码

导图:

graph LR
GDB ---> 编译debug版本程序
GDB ---> 启动调试界面
GDB ---> 调试
调试 ---> 设置断点
调试 ---> 执行
调试 ---> 查看信息
查看信息 ---> 变量
查看信息 ---> 调用堆栈

编译为debug版本,需要在gcc是使用-g参数

1
gcc bugging.c -o bugging -g

启动gdb进入调试界面

1
gdb bugging

gdb常用命令表

命令 简写形式 说明
list l 查看源码
backtrace bt,where 打印函数栈信息
next n 执行下一行
finish 运行到函数结束
continue c 继续运行
break b 设置断点
info breakpoints 显示断点信息
delete d 删除断点
print p 打印表达式信息
run r 启动程序
until u 执行到指定行
info i 显示信息
help h 帮助信息

可以通过!shell执行shell命令

查看源码

list(l)查看源码信息,主要有以下几种方式

  • list 行号,显示某一行附近的代码
  • list 文件名:行号,显示某一个文件某一行附近代码
  • list 函数名,显示某个函数附近代码
  • list 文件名:函数名,显示某个文件某个函数

断点

设置断点

break(b)用来设置断点,常用操作如下

  • break 行号
  • break 文件名:行号
  • break 函数名
  • break 文件名:函数名

查看断点信息

info breakpoints 查看断点信息,主要返回以下信息

  • Num 断点标号,可以作为delete、enable、disable命令的参数控制断点
  • Type 断点类型
  • Disp 代表断点命中后是删除(del)还是保留(keep),或者关闭(dis)
  • Enb 表示断点是enable(y),还是disable(n)
  • Address 表示断点的虚拟内存的地址
  • What 表示断点在源文件中信息

删除断点

delete Num 删除指定断点,delete 删除所有断点

关闭和启用断点

(disable|enable) [Num]

断点的方式

  • enable once Num,断点hit一次后关闭
  • enable delete Num,断点hit一次后删除

断点调试的一些命令

  1. 打印变量
    • info locals 打印所有局部变量
    • print 变量或者表达式
  2. 启动程序
    • run
    • run 参数,会传递给main函数
  3. 单步命令
    • next 单步执行,next N执行N步
    • step 单步执行会进入函数内部,step N执行N次
    • finish 执行到当前函数结束
    • continue 执行到下个断点
    • until N 执行到某一行

函数栈

进程在内存空间会拥有一块叫做 stack 的区域,函数内部的局部变量、函数之间调用时参数的传递和返回值等等都会用到栈这种数据结构。

  • info proc mappings 可以查看进程的内存分布情况

  • backtrace 查看函数调用栈的情况

    backtrace、where、info stack

    这三个命令都能查看函数调用情况

    backtrace full、where full、info stack full

    这三个命令查看函数调用情况的同时,打印所有局部变量的值

  • stack frame

    按调用顺序排,越大越先调用

  • info frame Num

    查看某个函数栈的详细信息,寄存器、程序计数器等