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
-
查看指定文件或指定函数的变量:
- file::variable: (gdb) p 'f2.c'::x
- function::variable: (gdb) p 'Hello'::x
-
打印数组:(gdb) p *array@len #print *name@len
输出格式:(gdb) p/a i
- x 按十六进制格式显示变量。
- d 按十进制格式显示变量。
- u 按十六进制格式显示无符号整型。
- o 按八进制格式显示变量。
- t 按二进制格式显示变量。
- a 按十六进制格式显示变量。
- c 按字符格式显示变量。
- 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
一、启动
- 第一种是在启动的时候带参数-tui,如:A:\gdb xxx -tui
- 第二种是在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

浙公网安备 33010602011771号