调试一直是程序开发的重中之重,使用GDB调试可以帮助我们快速找到程序中的错误。
注意:在进行GDB调试之前,程序在gcc编译时要加上“-g”选项。
1.进入GDB:gdb 可执行文件名
2.查看GDB:“ l ”(list)
3.设置断点:设置断点可以使程序执行到某个位置时暂时停止,方便在该位置处查看变量的值、堆栈情况等,从而找到程序中的问题所在。需要注意的是在GDB中利用行号设置断点是指代码运行到对应行之前暂停(并没有运行到这一行),在GDB中可以设置多个断点。最常用设置断点的方法是在“b”(break)后加入对应的行号(b 行号)。
4.查看断点设置情况:info b
5.运行代码:键盘输入“ r ”(run) 从指定行开始运行:r 行号
6.查看变量值:p 变量名
GDB在显示变量值时都会在对应值之前加上“ $N ”标记,它是当前变量值的引用标记,之后再次引用此变量可以直接写作“ $N ”。
7.观察变量:“ watch ”
8.单步运行:“ n ”(next)
9.程序继续运行:“ c ”(continue) 再次遇到断点或程序结束时停止
10.退出GDB:“ q ”(quit)
补充:GDB中常见的断点设置与删除命令
命令格式 | 作用 |
break + 设置断点的行号 | 用于在程序中对应行设置断点 |
tbreak + 行号或函数名 | 设置临时断点,到达后被自动删除 |
tbreak + filename + 行号 | 用于在指定文件的对应行设置断点 |
break + <0x...> | 用于在内存某一位置处暂停 |
break + 行号 + if + 条件 | 用于设置条件断点,在循环中使用非常方便 |
info breakpoints/watchpoints | 查看断点/观察点的情况 |
clear + 要清除断点的行号 | 用于清除对应行的断点 |
delete + 要清除断点的编号 | 用于清除断点和自动显示的表达式的命令 与clear的不同点:clear要给出断点的行号,delete要给出断点的编号。 用clear命令清除断点时GDB会给出提示, 而用delete清除断点时GDB不会给出任何提示 |
disable + 断点编号 | 让所设断点暂时失效。如果要让多个编号处的断点失效, 可将编号之间用空格隔开 |
enable + 断点编号 | 与disable相反 |
awatch + 变量 | 设置一个观察点,当变量被读出或写入时程序被暂停 |
rwatch + 变量 | 设置一个观察点,当变量被程序读时,程序被暂停 |
watch + 变量 | 同awatch |
在多线程的程序中,观察点的作用很有限,GDB只能观察在一个线程中的表达式的值。如果用户确信表达式只被当前线程所存取,那么观察点才有效。GDB不能注意一个非当前线程表达式值的改变。
常用的gdb调试命令基本上就是这些了,感兴趣的小伙伴可以自己找一个有逻辑bug的代码试着用gdb调试一下,调试命令都挺简单的,多用几遍就记住了,如果觉得这篇文章对你有帮助,欢迎点个小红心支持一下,以后也会继续分享一些非常实用的基本知识,第一次发布文章难免存在不足,也欢迎大家在评论区多提意见,非常感谢!