gdb(一)

gdb

源文件编译时需要-g命令

启动GDB的方法

​ A、gdb 程序
​ B、gdb 程序 core
​ 用gdb同时调试一个运行程序和core文件,core是程序非法执行后core dump后产生的文件。
​ C、gdb 程序 PID
​ 指定一个已启动的程序PID,gdb会attach上去,就可以调试
​ 可以用attach pid和detach命令

基本命令

命令帮助: (gdb) help

一、启动与关闭

启动: file pram / run pram

start / 只执行一步

n / next

s / stop (单步,可以进入函数体内, finish跳出函数体)

c / continue (断点停止)

u / 推出当前循环

kill /终止当前被调试程序

二、查看代码

l / list

  • l number / 显示第number行附近的10行代码
  • l number1 number2
  • l function
  • l file:function

三、断点

b / break

  • break number (function)
  • b + N - Puts a breakpoint N lines down from the current line
  • break number (function) if value == 19

删除断点

  • d / delete #删除所有断点, breakpoints, watchpoints and catchpoints
  • d N - Deletes breakpoint number N
  • clear #删除当前行
  • clear function (lineNum)

显示断点

  • info b
  • info breakpoints

正则断点

  • rbreak test.c:. #对test.c中的所有函数设置断点
  • rbreak test.c:^print #对以print开头的函数设置断点

临时断点

  • tbreak test.c:10

跳过断点

  • ignore breakpoint_number times

开关断点

  • disable #禁用所有断点
  • disable bnum #禁用标号为bnum的断点
  • enable #启用所有断点
  • enable bnum #启用标号为bnum的断点
  • enable delete bnum #启动标号为bnum的断点,并且在此之后删除该断点

四、变量

变量类型

  • ptype 变量名

追踪变量(一直显示)

  • display
  • undisplay 编号
  • info display

设置变量的值

  • set var 变量名 = 赋值
  • 设置运行时参数:(gdb) set args --gtest_filter=***

变化时显示

  • watch 变量名
  • rwatch 变量值被读时断住
  • awatch 被读或者被改写时断住

显示信息

  • 打印详细的栈信息:(gdb) info f

  • 打印当前函数的参数名和值:(gdb) info args

  • 打印当前函数的局部变量及其值:(gdb) info locals

  • 打印当前函数中的异常信息调用:(gdb) info catch

  • 查看指定文件或指定函数的变量:

    1. file::variable: (gdb) p 'f2.c'::x
    2. function::variable: (gdb) p 'Hello'::x
  • 打印数组:(gdb) p *array@len #print *name@len

    输出格式:(gdb) p/a i

    1. x 按十六进制格式显示变量。
    2. d 按十进制格式显示变量。
    3. u 按十六进制格式显示无符号整型。
    4. o 按八进制格式显示变量。
    5. t 按二进制格式显示变量。
    6. a 按十六进制格式显示变量。
    7. c 按字符格式显示变量。
    8. f 按浮点数格式显示变量。

五、调试日志

1、# (gdb) set logging file <文件名>
设置输出的文件名称

2、# (gdb) set logging on
输入这个命令后,此后的调试信息将输出到指定文件

3、# (gdb) thread apply all bt
打印说有线程栈信息

4、# (gdb) set logging off
输入这个命令,关闭到指定文件的输出

六、gdb脚本

https://blog.csdn.net/cnsword/article/details/16337031

https://github.com/gdbinit/Gdbinit

可以直接运行python语句
(gdb) python ("hello world")

(gdb)python
python ("hello world")
end

shell / 使用shell脚本

七、TUI

一、启动

  1. 第一种是在启动的时候带参数-tui,如:A:\gdb xxx -tui
  2. 第二种是在GDB命令模式下:Ctrl+X+A 开启TUI模式
    同样,Ctrl+X+A也可以关闭TUI模式

二、窗口

tui模式下切换窗口焦点

  • C-x o 下一窗口
  • focus src 或fs s 源码窗
  • focus cmd 或fs c 命令窗
  • focus asm 或fs a 汇编窗
  • focus regs或fs r 寄存器窗
  • focus next或fs n 下一窗口 / focus prev或fs p 上一窗口
  • 刷新屏幕 C-L或refresh
  • 刷新源码窗至当前执行点 update

命令窗口

C-p 上一命令行
C-n 下一命令行
C-b 命令行光标前移
C-f 命令行光标后移

窗口数目

C-x 1 单窗口模式
C-x 2 双窗口模式

三、显示内容

断点

源代码窗口和汇编窗口会高亮显示程序运行位置并以'>'符号标记。有两个特殊标记用于标识断点。

第一个标记用于标识断点类型:

  • B

    程序至少有一次运行到了该断点

  • b

    程序没有运行到过该断点

  • H

    程序至少有一次运行到了该硬件断点

  • h

    程序没有运行到过该硬件断点

第二个标记用于标识断点使能与否:

  • +

    断点使能Breakpointis enabled.

  • -

info win:显示正在显示的窗口大小信息
Listand give the size of all displayed windows.

layout next:显示下一个窗口
Displaythe next layout.

layout prev:显示上一个窗口
Displaythe previous layout.

layout src:显示源代码窗口
Displaythe source window only.

layout asm:显示汇编窗口
Displaythe assembly window only.

layout split:显示源代码和汇编窗口
Displaythe source and assembly window

layout regs:显示寄存器窗口
Displaythe register window together with the source or assembly window.

tuireg float:寄存器窗口显示内容为浮点寄存器
Showthe floating point registers in the register window.

tuireg general:寄存器窗口显示内容为普通寄存器
Show the general registers in the register window.

tuireg next:显示下一组寄存器
Show the next register group. The list of register groups as well astheir order is target specific. The predefined register groups are the following: general, float,system, vector,all, save,restore.

tuireg system :显示上一组寄存器
Show the system registers in the register window.

winheight winname +count:增加指定窗口的高度
winheight winname -count:减小指定窗口的高度

四、gdbgui

将调试的gui在浏览器中显示

https://blog.csdn.net/songchuwang1868/article/details/86132281

posted @ 2020-02-17 20:28  friedCoder  阅读(241)  评论(0)    收藏  举报