1.调试命令:
sudo gdb -p 工作进程的pid #查看工作进程的pid
sudo gdb -tui -p 工作进程的pid #跟踪该pid的worker进程,可以加-tui可视化
list/l #从第1行列出源码
list 函数 #跳转到想要调试的函数
list 行号 #打印附近代码
b/break 设置断点 #设断点
info break #查看断点信息
d/delete 断点 #删除断点
c #继续运行,触发断点
n/next #单条语句执行,不进入函数内部
s/step #进入函数内部
start #单步执行,运行程序,停在第一执行语句
p i #打印变量i的值
finish #退出函数
q #退出gdb
r #重新开始运行文件
bt/backtrace #查看当前调用堆栈
qcdmy #查看当前栈中的所有信息
bt n #显示栈顶几个层的信息
bt -n #显示栈底几个层的信息
f/frame 数字 #切换到第几个堆栈,0开始,0表示栈顶,1表示栈第二层
up n #向栈的上面移动n层,不打n,表示向上移动一层
down n #向栈的下面移动n层,不打n,表示向下移动一层
info f #会打印出更为详细的当前栈层的信息
set print pretty on #格式化输出样式,可以输出漂亮的结构体
layout #用于分割窗口,可以一边查看代码,一边测试
display #跟踪特定变量值
undisplay #取消追踪观察变量
watch #被设置观察点的变量发生修改时,打印显示
i watch #显示观察点
set #设置变量的值
2.break命令:
break 函数名 :在进入指定函数时设置中断点
break 文件名:函数名 : 设置指定文件中的相应函数为断点
break 行数:按照行数设置断点
break 文件名:行号 : 将指定文件的指定行数设置为断点
break *address :在程序正在运行的指定地址发出断点
break /- offeset :在当前行之前或之后中断点
break . if condition :在处理特定循环体时,可以使用此方法进行调试。 其中…是上述break lineNumber、break /-offset的参数。 其中,condition表示条件,是条件成立的时间
按顺序停止。 例如,如果设置break if i=100,则程序在I为100时停止。
3.print命令:
① 用于打印变量值,print可以输出很多类型的变量:全局变量,静态全局变量,局部变量,如果你的局部变量和全局变量发生冲突(也就是重名),一般情况下是局部变量会隐藏全局变量。
② 输出格式:
x 十六进制
d 十进制
u 十六进制无符号数
o 八进制
t 二进制
c 字符格式
f 浮点数格式
③ 查看变量值:
p "文件名"::全局变量 #查看相应文件中全局变量的值
p *数组的首地址@数据长度 #查看数组指定长度的值
p 数组名 #查看数组值
info registers #所有寄存器的值
p $寄存器 #查看指定寄存器的值
4.layout命令:
layout用于分割窗口,可以一边查看代码,一边测试。
layout src :显示源代码窗口
layout asm :显示汇编窗口
layout regs :显示源代码/汇编和寄存器窗口
layout split : 显示源代码和汇编窗口
layout next :显示下一个layout
layout prev :显示上一个layout