printf就是一种基本调试方法,gdb是一种更强大的工具。
调试的基本思想仍然是:
“分析现象->假设错误原因->产生新的现象去验证假设”
单步执行、跟踪函数调用
命令 | 简写 | 描述 |
---|---|---|
backtrace | bt | 查看各级函数调用及其参数 |
finish | - | 连续运行到当前函数返回为止,然后停下来等待命令 |
frame 编号 | f ~ | 选择栈帧 |
info locals | i locals | 查看当前栈帧局部变量的值 |
list | l | 列出源代码,接着上次的位置往下列,每次10行 |
list 行号 | 列出源代码,从第几行开始 | |
list 函数名 | 列出源代码,某个函数 | |
next | n | 执行下一条语句 |
p | 打印表达式的值(通过表达式可以修改变量的值、调用函数) | |
quit | q | 结束gdb环境 |
set var | - | 修改变量的值 |
set args 参数 | - | 含参程序,加入参数 |
start | - | 开始 |
step | s | 执行下一语句,和n不同在于:若有函数则进入函数 |
断点
命令 | 简写 | 描述 |
---|---|---|
break 行号 | b ~ | 在某一行设置断点 |
break 函数名 | 在某个函数开头设置断点 | |
break … if … | 条件断点 | |
continue | c | 从当前位置开始,连续运行函数 |
delete breakpoints 编号 | - | 删除断点 |
display 变量名 | - | 跟踪查看某个变量,每次停下来都显示它的值 |
disable breakpoints 编号 | - | 禁用断点 |
enable 编号 | - | 启用断点 |
info breakpoints | i b | 查看断点 |
run | r | 从头开始连续运行程序 |
undispaly 跟踪显示编号 | - | 取消跟踪显示(注意是编号) |
观察点
命令 | 简写 | 描述 |
---|---|---|
watch | - | 设置观察点 |
info watchpoints | i ~ | 查看已设置的观察点 |
x | - | 从某个位置开始打印存储单元的内容,全部当成字节来看,而不区分哪个字节属于哪个变量 |
参考: Linux C 编程一站式学习.