1、背景
- 程序的发布方式有两种,debug模式(给程序员用的)和release模式(给用户用的)
- Linux gcc/g++出来的二进制程序,默认是release模式
- 要使用gdb调试,必须在源代码生成二进制程序的时候,加上 -g 选项
注:debug模式产生的可执行程序,体积要比release模式产生的可执行程序的体积大,因为里面加了一些调试信息。这也是debug模式产生的可执行程序可调式的原因。
ex:
补充:readelf -S 可执行程序 -- 可以读取ELF可执行程序的符号表里的一些内容
注:Linux 下形成的可执行程序遵守ELF格式。
ex:
2、命令使用
开始调试:gdb binFile
退出:ctrl + d 或 quit 或
调试命令:
list/l <源代码文件名> 行号:显示 binFile 源代码,从行号的位置往下列,每次列10行。
list/l <源代码文件名> 函数名:列出某个函数的源代码。
r 或 run:运行程序直至碰到第一个断点(没有断点就一口气全部执行完)。
n 或 next:单条执行。-- 相当于 vs 中的逐过程
s 或 step:进入函数调用 -- 相当于 vs 中的逐语句
break(b) 行号:在某一行设置断点
break(b) 函数名:在某个函数开头(该函数的第一句有效代码)设置断点
info(i) break(b) :查看断点信息。
finish:执行完当前函数,然后停下来等待新的命令
print/p 变量名:查看该变量的内容,如果变量前面加了&,就是查看该变量的地址
set var:修改变量的值
continue(或c):从当前断点开始执行程序直到下一个断点(想只执行一块区域的代码时用)
delete(d) breakpoints(b):删除所有断点
delete n:删除序号为n的断点
disable n:禁用序号为n的断点 -- 注:这个 disable 不能再简写了,因为和 delete 的简写重合了。
enable n:启用序号为n的断点
info(或i) breakpoints:参看当前设置了哪些断点
display 变量名:跟踪查看一个变量,每次停下来都显示它的值 -- 就是长显示一个变量的内容 -- 注:这个 display 也不能简写。
undisplay n:取消对先前设置的序号为n的变量的跟踪
until X行号:跳至X行
breaktrace(或bt):查看各级函数调用及参数 -- 就像 vs 里的窗口里的调用堆栈
info(i) locals:查看当前栈帧的局部变量的值
quit:退出gdb
注:大部分命令可以只用其首字母进行简写。
3、总结
a.调试工具终究只是工具,它的核心作用就是方便我们找到问题。(解决问题还是要靠我们自己)
b.找问题的几个方法:
- 先直接用眼睛看,有的问题很简单,眼睛扫一扫就能看出来问题在哪
- 用打印,在某些你觉得会出问题的地方,用一下打印
- 注释一部分,运行一部分
- 调试