2.2、 debug与release版本的区别
①release版本大小小于debug版本
这肯定是毋庸置疑的,因为debug版本需要我们使用工具调试,需要文件展示的信息更多。
②readelf -S 可执行程序(debug/release)
Linux下有一个readelf -S 可执行程序(debug/release) 指令用于读取可执行程序的二进制构成。
虽然我们看不懂这些二进制,但是我们可以利用管道过滤一下得到debug信息。
我们可以小结一下Linux下的默认行为:
gcc默认行为:
1、默认是动态链接的。
2、默认是release版本
vim默认行为:
默认打开就是命令模式
2.3、 gdb的基本指令
gdb 退出:CTRL+d 或quit/q调试命令:
🖊list/l 行号:显示binFile源代码,接着上次的位置往下列,每次列10行。
🖊list/l 函数名:列出某个函数的源代码
🖊r或run:运行程序
🖊n或next:逐过程调试,相当于f10
🖊s或step:逐语句调试,相当于f11,可以进入函数
🖊break(b) 行号:给第n行断点。注意:如果打断点的所在行没有代码,就会相当于断点打在后面有代码的行。
🖊info break(b):用于查看所有断点
🖊finish:首先需要进入函数,finish直接运行到将对应函数跑完,如果跑时挂掉,直接确定函数有问题。
🖊p 变量:查看变量内容。
🖊p &变量:查看变量地址。
🖊set var:修改变量的值
🖊continue(c):从一个断点运行到下一个断点
🖊run(r):r相当于f5.当没有断点的时候,就是运行程序,有断点的时候就是运行到第一个断点处。
🖊d b:删除所有断点
🖊d b 断点编号:d 断点编号去掉指定断点,这里需要注意,不是d 行号 去掉断点,而是我们info b 查看到的每个断点的编号。
🖊disable breakpoints:禁用断点
🖊enable breakpoints:启用断点
🖊info(或i) b:查看当前设置了哪些断点
🖊display 变量名:跟踪查看一个变量,每次停下来都显示它的值
🖊undisplay:取消对先前设置的那些变量的跟踪
🖊until X行号:跳至X行,跳出循环到有效代码行(不是空)
🖊breaktrace(或bt):查看各级函数调用及参数,查看调用堆栈
🖊info(i) locals:查看当前栈帧局部变量的值,显示特定区域中的临时变量。
Ⅰ断点
①gdb l 1
从第一行开始显示,显示后面的不用再输入指令,回车即可,gdb会默认记住之前的指令。
②gdb b(break) #
gdb b(break) #
:给第#行断点。
我们可以打多个断点。
打过断点后,我们不像在vs上能看到红色断点,我们怎么在Linux上查看断点呢?
③info(i) b
info b
:用于查看所有断点。
④delete(d) 断点编号
d 断点编号去掉指定断点,这里需要注意,不是d 行号 去掉断点,而是我们info b 查看到的每个断点的编号。
在掌握这些基本指令之后,怎么调试呢?在vs下我们f5是执行到断点,当断点比较多的时候,f5表示从一个断点执行到另一个断点。CTRL+f5 是执行可执行程序。那么在Linux下与之对应的哪些指令是调试呢?
Ⅱ调试
①gdb r
r相当于f5.当没有断点的时候,就是运行程序,有断点的时候就是运行到第一个断点处。
②gdb p
p 变量用于查看内容,p &变量,查看地址。
但是我们这样查看很不方便,只能看到临时的,不能常显示。
③display && undisplay
display可以常显示变量。 display &变量可以常显示变量地址。
取消常显示:undisplay 编号
undisplay用于取消常显示,我们取消的也是变量的编号。
④disable && enable
有些断点虽然我们打下了,但是我们不想让它生效,我们又不想取消这个断点就可以使用disable 断点编号指令。
与之对应的是enable 断点编号:重新使断点生效。