- gdb模式
- set logging on:设置日志开关
- set logging off
- show logging
- set logging file 日志文件:设置日志文件名,默认名称为gdb.txt
- 启动gdb调试
- gdb 可执行文件:使用gdb运行并调试程序(程序被暂停,可以设置启动参数、断点等操作)
- gdb attach pid:使用gdb附件已有进程
- [r]run:运行程序
- run 命令行参数
- run >输出文件:将输出重定向到输出文件
- 继续执行
- [c]continue
- continue 次数:继续执行并跳过当前断点N次
- 继续执行直到当前函数执行完成
- finish
- step:单步执行(会进入函数)
- s 5
- next:逐过程执行(不会进入函数)
- n 5
- q:退出gdb
- 断点
- [b]break 文件名:行号
- break 函数名(如果多个函数名相同或多个地方都调用了函数,则会为所有的函数都设置断点)
- break 类名::函数名
- rbreak(rb) 正则表达式:通过正则表达式设置断点(如fun*)
- b+5、b-5:通过偏移量设置断点,为当前行的前面某一行或后面某一行设置断点
- b 断点 条件:设置条件断点,满足条件时暂停(b chaper.cpp:39 if i==90)
- b *地址:如果调试程序没有符号信息,可以在(函数)地址上设置断点
- tb 断点:设置临时断点,只命中一次,然后会被自动删除
- disable/enable 断点编号:禁用/启动断点
- disable 4-10:禁用一个断点编号范围
- enable once 断点编号:启用断点一次
- enable delete 断点编号:启动断点一次并删除
- enable count 数量 断点编号:启用断点并命中N次
- ignore 断点编号 次数:忽略断点前N次命中,直到第N+1次命中时运行才暂停
- 查看断点
- [i b]info breakpoints [断点编号]
- info break [断点编号]
- info b [断点编号]
- i b [断点编号]
- 删除断点
- delete:删除所有断点
- 删除指定编号断点
- delete 2
- delete 2 3
- delete 2-5
- delete 2-5 7-10
- clear 函数名:删除指定函数断点
- clear 文件名:行号 :删除指定行号断点
- [i agrs]info agrs:查看当前函数参数
- [p]print 变量名:命中断点后,查看变量值
- print 变量名=值:修改查看到的变量值
- 使用gdb内嵌函数或表达式进行计算或比较操作
- p sizeof(int)
- p 12 * 12
- p 12 > 10
- p strcmp("123","12")
- p strlen("test")
- 查看指针对象
- p new_node->name:查看指针对象new_node的name属性
- p *new_node:查看指针对象new_node的所有属性
- set print pretty:美化显示结构体
- 查看数组对象
- set print array on:美化显示数组
- p strarr:显示数组strarr
- 自动显示变量的值
- display 变量名:每次程序暂停自动显示变量名
- display {var1,var2,var3}:每次程序暂停自动显示多个变量名(这些变量的长度必须相同,比如都是整型变量;如果长度不同,则需要分开使用)
- info display:查看已经设置的自动显示的变量名
- 取消变量的自动显示
- undisplay 变量编号
- delete display 变量编号
- undisplay / delete display:取消所有的变量自动显示
- disable display 变量编号:暂时禁用变量自动显示
- enable display 变量编号:恢复变量自动显示
- 查看源代码
- [l]list:显示当前断点前后各5行的源代码
- l-:往后显示10行
- set listsize 20:设置list每次显示的源代码行数
- show listsize:查看listsize的大小设置
- list 函数名:查看指定函数的代码
- list 文件名:行号 :查看指定文件的指定行代码
- list 100:查看当前文件的指定代码行
- x /选项 地址:查看内存
- x str:默认以16进制显示
- x /s str:指定以字符串形式显示
- x /d str:指定以10进制显示
- x /4d str:指定以10进制显示并指定宽度
- x &number:显示数值的内存信息
- x命令并不局限于查看变量的内存信息,无论是函数地址、变量地址还是其他合法地址都可以访问
- 查看栈回溯信息
- [bt]backtrace
- bt 栈帧数量:查看指定数量的栈帧(如果后面跟的是一个正数,则从0开始计数;如果是一个负数,则从最大的栈帧编号开始倒序计数)
- backtrace full:显示所有栈帧的局部变量
- [f]frame 2:切换栈帧
- f 帧地址:切换到指定帧地址的帧
- up 1:切换到上一个帧
- down 1:切换到下一个帧
- info args:查看当前帧所有的函数参数
- i locals:查看当前帧所有局部变量的值
- [i f 1]info frame 1:不用切换栈帧,查看对应编号帧的详细信息(包括帧地址、rip地址、函数名、函数参数等信息)
- 线程管理
- [i]info threads:查看当前进程所有的线程信息(及当前线程)
- thread 线程ID:切换到指定线程
- break 断点 thread 线程ID:为特定线程设置断点
- thread apply 线程号 命令:为线程执行命令
- thread apply 2 3 p local_data
- thread apply all bt:查看所有线程回溯信息,在大型程序的调试中很有用,比如死锁的调试
- 观察点
- watch 变量或表达式:当为变量或一个表达式设置观察点后,该变量或表达式的值在发生变化时,程序会发生中断,并且在变量或表达式发生改变的地方暂停。
- watch count==5
- rwatch 变量或表达式:当该变量或表达式被读取时,程序会发生中断
- awatch 变量或表达式:无论这个变量是被读取还是被写入,程序都会发生中断,即只要遇到这个变量就会发生中断
- info watchpoints:查看所有观察点
- delete/disable/enable 观察点编号: 禁用/启用删除观察点
- 观察点是一种特殊的断点,可以通过管理断点的方式来管理观察点
- 捕获点
- catch 事件:程序在发生某事件时,gdb能够捕获这些事件并使程序停止执行
- 可以捕获的事件如下所示:
- throw:在C++代码中执行throw语句时程序会中断
- catch:当代码中执行到catch语句块时会中断,也就是说代码捕获异常时会中断
- exec、fork、vfork:调用这些系统函数时会中断
- load/unload:加载或卸载动态库时
- 搜索源代码
- search 正则表达式、forward-search 正则表达式:在当前文件中从前向后搜索满足正则表达式的代码,如果满足则显示行号和对应的代码。如果要继续往后搜索,可以继续输入search命令或按下Enter命令。
- reverse-search 正则表达式:反向搜索代码
- dir 目录名:添加目录到源代码搜索路径中
- dir:清空添加到源代码搜索目录的目录
- show directories:查看源代码搜索目录
- 查看变量类型
- ptyppe 可选参数 变量或类型:查看变量或结构体及类等详细信息。
- 可选参数用来控制显示信息,如下:
- /r:表示以原始数据的方式显示,不会代替一些typedef定义。
- /m:查看类时,不显示类的方法,只显示成员变量
- /M:与/m相反,显示类的方法(默认选项)
- /t:不打印类中的typedef数据
- /o:打印结构体字段的偏移量和大小
- 跳转执行
- jump 位置
- jump 36:跳转到第36行
- jump 函数名:跳转到指定函数
- 窗口管理
- 命令窗口、源代码窗口、汇编窗口、寄存器窗口
- layout next:显示下一个窗口
- layout prev:显示前一个窗口
- layout src:只显示源代码窗口
- layout asm:只显示汇编窗口
- layout split:显示源代码和汇编窗口
- layout regs:显示寄存器窗口,与源代码及汇编窗口一起显示
- focus next | prev | src | asm | regs | split:设置窗口为活动窗口,以便能够响应上下滚动键
- refresh:刷新屏幕
- update:更新源代码窗口
- tui disable:关闭除命令窗口以外的其他窗口
- 执行shell命令
- shell 命令
- !命令
- 内存检查
- 内存泄漏:程序中动态分配的堆内存由于某些原因未被程序释放
- 内存破坏:对内存执行写操作的时候由于超出了内存本身的大小(堆/栈溢出)而写入到其他地方,导致其他内存块被写入数据,严重情况下会导致程序崩溃。
- 访问错误内存
- 远程调试
- 方式一:
- 源端:gdbserver x.x.x.x:port 执行程序
- 远端:
- gdb
- target remote x.x.x.x:port
- 方式二:
- 源端:gdbserver x.x.x.x:port --attach 83096
- 远端:
- gdb
- target remote x.x.x.x:port