赞
踩
支持的功能 | 描述 |
---|---|
断点管理 | 设置断点、查看断点等 |
调试执行 | 逐语句、逐过程执行 |
查看数据 | 在调试状态下查看变量数据、内存数据等 |
运行时修改变量值 | 在调试状态下修改某个变量的值 |
显示源代码 | 查看源代码信息 |
搜索源代码 | 对源代码进行查找 |
调用堆栈管理 | 查看堆栈信息 |
线程管理 | 调用多线程程序,查看线程信息 |
进程管理 | 调试多个进程 |
崩溃转储(core dump)分析 | 分析core dump文件 |
调试启动方式 | 用不同的方式调试进程,比如加载参数启动、附加到进程等 |
list / l
r / run
set args
set args admin password
ps aux | grep test
gdb attach [pid]
将gdb附加到已经跑起来的进程
b / break 设置断点
break 文件名:行号
break 文件名:行号
为函数设置断点
# 为add_member函数打断点
break add_member
p / print
rb / rbreak
# rb/rbreak
rb test_fun*
b +(-)偏移量
b +5
b -5
b 断点 条件
b demo:79 if i==900
# 为函数断点设置条件
# void cond_fun_test(int a,const char *str)
b cond_fun_test if a==10
b *指令地址
# 先获取函数地址
p main
# 设置断点
b * 0x400aa6
tb / tbreak 断点
# tb/tbreak
tb test_fun_x
info b / info break(breakpoints) / i b
ignore 1 7
delete
delete 断点编号
delete范围
delete 5-7 10-12
clear 函数名
clear 行号
# c/continue
# continue 次数
# finish
# s/step
# n/next
# 查看: p 变量名
# 修改: p 变量名=值
每次程序暂停都可以自动显示变量值
如果display命令后面跟多个变量名,则必须要求这些变量的长度相同(比如都是整型变量)。如果长度不相同,则需要分开使用
# display 变量名,可以跟多个变量名
display {var1, var2, var3}
# info display
# undisplay 编号:取消自动变量的显示
# l/list
# 每次显示20行代码
set listsize 20
# 查看指定函数的代码
list add_member
# 查看指定行的代码
l 100
# x 选项 地址, 默认以十六进制显示,可设定显示宽度:x /4o
# /s /d /4d
x /s str
# 不局限于查看变量的内存信息,无论是函数地址、变量地址,还是其他地址,只要地址合法而且可以访问,都可以使用x命令来查看
# i r
如果bt后面跟的是一个正数,则从0开始计数。如果是一个负数,则从最大的栈帧编号开始倒序计数,但是最后显示时还是按照从小到大的编号顺序显示,只是显示的栈帧不同
# bt
# 查看指定数量的栈帧:bt 2
# f/frame 栈帧号
# 还可以使用命令up和down来切换帧。up和down都是基于当前帧来计数的
# 查看当前帧的所有局部变量
info locals
# 查看当前帧所有的函数参数
info args
# 查看帧的详细信息
info frame 栈帧号
#include <vector> #include <thread> #include <iostream> #include <cstring> #include <stdlib.h> int count = 0; void do_work(void* arg) { std::cout << "线程函数开始" << std::endl; //模拟做一些事情 int local_data = count; count++; std::this_thread::sleep_for(std::chrono::seconds(3)); std::cout << "线程函数结束" << std::endl; } int start_threads(int thread_num) { std::vector<std::thread> threads; //启动10个线程 for (int i = 0; i < thread_num; ++i) { threads.push_back(std::thread(do_work, &i)); std::cout << "启动新线程:" << i << std::endl; } //等待所有线程结束 for (auto& thread : threads) { thread.join(); } std::cout << "love" << std::endl; } int main(int argc, char* argv[]) { start_threads(10); }
# 查看当前进程的所有线程信息
info threads
# 切换线程
thread 线程id
# 为线程设置断点
# break 断点 thread 线程id
b 155 thread 2
# 为线程执行命令
# thread apply 线程号 命令
thread apply 2 3 i locals
thread apply all bt
# watch
watch count
watch count==5
# 读取观察点:当该变量或者表达式被读取时,程序会发生中断
rwatch 变量或表达式
# 读写观察点:无论这个变量是被读取还是被写入,程序都会发生中断,即只要遇到这个变量就会发生中断
awatch 变量或表达式
# 查看所有观察点
info watchpoints
捕获点(catchpoint)指的是程序在发生某事件时,gdb能够捕获这些事件并使程序停止执行。该功能可以支持很多事件,比如C++异常、载入动态库等(可以捕获的事件:throw、catch、exec、fork、vfork、load/unload)
# catch 事件
catch throw
# tcatch 临时捕获
# search 正则表达式
# forward-search 正则表达式
# reverse-search 正则表达式(反向搜索)
# ptype 可选参数 变量或者类型
# 可选参数:/r /m /M /t /o
# 可选参数用来控制显示信息,变量或者类型可以是任意的变量,也可以是定义的数据类型,比如类、结构体、枚举等
# whatis
# 不按照代码的流程逐行执行,而是按照我们期望的方式执行。命令中的位置可以是代码行或者某个函数的地址
# jump 位置
jump add_member
gdb可以同时显示几个窗口,比如源代码窗口(显示程序源码的窗口)、命令窗口(gdb命令输入和结果输出的窗口,始终可见)、寄存器窗口(显示寄存器的值)、汇编窗口等。
# layout命令可以设置显示哪个窗口、是否切分窗口等 # 显示下一个窗口 layout next # 显示前一个窗口 layout prev # 只显示源代码窗口 layout src # 只显示汇编窗口 layout asm # 显示源代码和汇编窗口 layout split # 显示寄存器窗口,与汇编,源码窗口一起显示 layout regs # 设置窗口为活动窗口,以便能够相应上下滚动键 focus next | prev | src | asm | regs | split # 刷新屏幕 refresh # 更新源码窗口 update
# shell 命令
backtrace full
比如C函数(例:sizeof、strcmp)
甚至可以在gdb中直接进行开发
查看结构体/类的值
# 设置字符串的显示规则,即遇到结束符时停止显示
set print null-stop
show print null-stop
set print pretty
show print pretty
update
- 调用shell命令
```shell
# shell 命令
backtrace full
比如C函数(例:sizeof、strcmp)
甚至可以在gdb中直接进行开发
查看结构体/类的值
# 设置字符串的显示规则,即遇到结束符时停止显示
set print null-stop
show print null-stop
set print pretty
show print pretty
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。