本文主要是介绍gdb调试命令,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
方法一:gdb [exec file] [core file]
方法二:gdb -c [core file] [exec file]
finish | 连续运行到当期函数返回为止,然后停下来等待命令 |
info locals(或i locals或I locals) | 查看当前栈帧局部变量的值 |
list(或l) | 列出源代码,列出此刻运行到代码行的函数的上下文代码 |
list 行号 | 列出从第几行开始的源代码 |
list n1n2 | 显示n1行和n2行之间的代码 |
list 函数名 | 列出某个函数的源代码 |
list ,last | 显示以指定的last为结束行,显示10行 |
list + | 以上次显示的结束行为起始行显示后10行 |
list - | 以上次显示的起始行为结束行显示前10行 |
next(或n) | 执行下一行语句 |
print(或p) | 打印表达式的值,通过表达式可以修改变量的值或者调用函数 |
print *a@10 | 如果a是一个数组,这样显示数据的10个元素的值 |
print var=10 | 修改运行时变量的值 |
quit(或q) | 退出gdb调试环境 |
set 变量=变量值 | 修改变量的值 |
set args 参数1 参数2 | 设置运行参数 |
show args | 查看运行参数 |
set width 数目 | 设置GDB的行宽 |
set listsize 数目 | 设置查看源代码时每次显示的行数 |
show listsize | 显示已设置的显示行数 |
start | 开始执行程序,停在main函数第一行语句前面等待命令 |
step(或s) | 执行下一行语句,如果有函数调用则进入到函数中 |
break(或b) 行号 | 在某一行设置断点 |
break 函数名 | 在某个函数开头设置断点 |
break 34 if var=12 | 设置条件断点,当var等于12的时候就在34行设置断点 |
break Refresh.cpp:120 | 在文件Refresh.cpp的第120行设置断点 |
b filename:function | 在文件的函数前设置断点 |
b 0x3400a | 用于在内存某一位置处设置断点 |
tbreak 行号 | 设置临时断点,到达后断点自动删除 |
tbreak 函数名 | 设置临时断点,到达后断点自动删除 |
cd 目录 | 切换工作目录 |
pwd | 显示程序工作目录 |
continue(或c) | 从当前位置开始练习运行程序,直至下一个断点或者结束 |
delete N | 删除标号为N的断点,标号是自动递增的,可以通过info b获取 |
delete | 删除所有断点 |
delete breakpoint(或者delete breakpoints) | 删除所有断点 |
delete breakpoint N(或者delete breakpoints N) | 删除标号为N的断点,标号是自动递增的,可以通过info b获取 |
clear 行号 | 删除行号处的断点(delete是根据断点标号进行删除) |
clear 函数名 | 删除函数名处的断点 |
clear Refresh.cpp:120 | 删除在文件Refresh.cpp的第120行的断点 |
display 变量名 | 跟踪查看某个变量,每次停下来都显示它的值 |
undisplay 跟踪显示号 | 取消跟踪显示 |
info display | 用于显示当前所有要显示值的表达式的情况 |
disable breakpoints N | 禁用标号为N的断点(执行info b后Enb字段标识断点状态,n为禁用,y为启用) |
disable n1 n2 | 禁用多个标号对应的断点,多个断点间用空格分隔 |
enable N | 启用标号为N的断点 |
enable n1 n2 | 启用多个标号对应的断点,多个断点间用空格分隔 |
info breakpoints(或info b) | 查看当前设置的断点 |
run(或r) | 从头开始连续运行程序 |
watch 变量名 | 设置一个观察点,当变量的值发生变动(即写入)时暂停程序 |
rwatch 变量名 | 设置一个观察点,当变量被读出时暂停程序 |
awatch 变量名 | 设置一个观察点,当变量被读出或写入时程序被暂停 |
info watchpoints N | 查看标号为N的观察点 |
whatis 变量名 | 显示某个表达式的数据类型 |
return 返回值 | 改变程序流程,直接结束当前函数,并将返回值返回 |
call 函数名 | 在当前位置执行所要运行的函数 |
until | 在循环体内跟踪程序,直到整个循环结束 |
until 行号 | 运行至指定行,可以用于跳出循环 |
set environment varname [=value] | 设置环境变量,如:set env USER=hchen |
show environment [varname] | 查看环境变量 |
| |
用gdb实时观察某进程crash信息 | |
gdb -p PID | 启动进程 |
c | 运行进程至crash,gdb会显示crash信息 |
| |
core/堆栈相关命令 | |
backtrace(或bt) | 查看各级函数调用及参数 |
frame(或f) 帧编号 | 选择栈帧 |
info reg | 查看寄存器使用情况 |
info stack | 查看堆栈使用情况 |
up/down | 跳到上一层/下一层函数 |
where | 显示当前线程调用堆栈 |
| |
| |
info inferiors | 查看进程 |
info threads | 查看所有线程列表 |
thread num | 切换线程 |
set scheduler-locking on | 设置只执行当前线程的函数 |
set scheduler-locking off | |
| |
set print elements 0 | 显示完整的字符串 |
set print pretty on | 格式化打印 |
p /x var 以16进制显示var的值
x 16进制
d 10进制
t 二进制
c 按字符格式显示变量
f 按浮点数
print *a@10 //如果a是一个数组,这样显示数据的10个元素的值
print var=10 //修改运行时变量的值
whatis var //显示一个变量的类型
ptype var //更详细的方式显示变量var的类型,会打印出var的结构定义
4、编译的时候要加入-g选项,才可以对程序进行跟踪
core调试
1、$sudo gdb binpath corepath
2、bt 查看调用堆栈
3、f 5...假设断的代码在栈号为5这里
4、info locals 查看局部变量
5、info args 查看函数参数的值
6、info catch 查看异常
7、info r 查看寄存器
8、up,down切栈帧
手动生成core文件:
gcore pid (进程号)
//查看当前运行的进程
ps aux|grep a.out
//查看当前运行的轻量级进程
ps -aL|grep a.out
//查看主线程和新线程的关系
pstree -p 主线程id
这篇关于gdb调试命令的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!