GDB基础操作
- 参考课程CppCon 2015: Greg Law " Give me 15 minutes & I’ll change your view of GDB" - YouTube
- GDB Tutorial: Essential GDB Tips to Learn Debugging (techbeamers.com)
Step1 开始调试
- 使用
gxx -g file
选项,在编译时保留调试信息 gdb file.out
启动调试- 输入q退出
Step2 运行程序
-
run [args]
开始运行程序[args]
为可选命令行参数- 也可以使用缩写
r
-
start
也可以启动程序,但是会在main
函数第一行自动设置一个断点 -
在程序运行过程中,使用
run or start
可以重新启动程序 -
使用
list
查看源代码-
使用缩写
l
-
l ([函数名],行号)
可以显示指定函数或行号开始的代码 -
一般gdb还会显示指定位置之前的几行代码,如图所示
-
-
-
next
执行下一行代码。注意:这个行不会进入函数 -
step
,缩写s,进入函数 -
continue
直到下一个断点
Step3 设置断点
-
break设置断点
- 同样的,可以使用b作为缩写
-
b linenum
在(当前文件的)指定行设置断点 -
b file:line/func
在指定文件的行或者函数设置断点 -
如果你想要在没有debug支持的文件(例如没有使用-g)中设置断点。
b *(memory address)
可以在指定的位置设置断点 -
通过command,你可以在达到指定断点时,执行指令
-
(gdb) b CheckValidEmail Breakpoint 1 at 0x8049d87: file ../../test/testgdb.c, line 107. (gdb) command 1 # Note: #1: 1 is the breakpoint number. #2: Here you can specify set of commands to execute. #3: To close the command block, use the "end" keyword. >print port >print IPAddr >print User >print Pwd >end (gdb)
-
-
使用
info b
显示所有断点 -
ignore b-index times
来忽略指定断点指定次数 -
delete(或者缩写d) b-index
删除指定断点,单写一个d
可以删除所有断点
Step4 打印信息
-
frame
打印当前的语句 -
backtrace
可以显示堆栈信息- 或者使用缩写bt
-
使用where
-
例如一个简单的递归程序
-
// // Created by Anti on 2022/11/3. // void stack(int x) { if(x==10) return; stack(x+1); } int main() { stack(1); }
-
通过
b stack
打上一个断点,然后continue多次后使用bt查看堆栈信息 -
-
-
print打印变量
-
缩写p
-
p 变量(int,char等)
-
p 结构化变量
-
上图为用gdb打印数组信息
-
-
p *pointer
打印指针的值
-
Step5 不知道怎么分类的操作
- 使用
finish
完成当前函数(运行到直到这个函数返回之前)- 缩写fin
- 会被断点打断
return [exp]
从当前函数返回,也可以指定一个值返回- 使用
watch <variable name>
来给指定变量添加一个watchpoint,当该变量发生变化时停止程序