一、先决知识补充:
1.1为什么测试人员需要测试的版本必须是release版本而不是debug版本?
- release版本是用户使用到的版本,release版本能够提供更真实的性能表现、完整的代码逻辑、安全性、稳定性以及用户体验。
- 测试release版本可以确保用户体验的一致性,任何UI/UX问题都能在测试阶段被发现和解决。
1.2为什么用户要使用release版本?
- debug版本的可执行程序中包含了大量的调试信息,这些调试信息对用户完全没用,还会占用用户的存储空间,浪费用户下载时的流量。debug版本大小大于release版本。
- release版本相较于debug版本,代码是有优化的,如内联函数、循环展开、常量折叠等,以提升运行时性能。
1.3灰度上线:
- 灰度上线(也称为灰度发布或渐进发布)是一种软件部署策略,允许新版本的功能逐步在用户群中推广,以便在实际使用中进行验证和优化。这个过程通常先在一小部分用户中进行测试,逐步扩大到整个用户群。这种方法可以有效地降低新版本上线带来的风险,并在发现问题时及时做出调整。
二、gcc/g++默认编译的可执行程序的版本的猜测和证明:
2.1默认编译得到的版本是release版本:
- 使用gcc -o直接编译源文件生成的可执行程序的版本是release版本。
- 因为gcc/g++默认所在的模式是Release,就像vim默认模式为Normal。
- 加上-g选项,生成的可执行程序的版本就是debug版本了。
2.2第一种验证:
- 我们知道debug版本中,有大量的调试信息帮助完成程序的调试。所以debug版本的可执行程序一定是大于release版本的。
- 我们可以通过比较使用-g选项前后生成的可执行程序的大小,判别release版本和debug版本。
"生成debug版本"
gcc mycode.c -o mycode-d -g
"生成release版本"
gcc mycode.c -o mycode-r
2.3第二种验证:
- Linux中可执行程序的文件类型是ELF格式
- 我们可以使用readelf命令查看可执行程序的二进制构成。
readeif -S 文件名 | grep -i debug
三、调试器gdb的使用和部分命令演示:
3.1centos7安装gdb:
sudo yum install -y gdb
3.2gdb调试debug版本的可执行程序:
gdb debug版本的可执行程序名字
3.3查看源代码:
- 查看当前执行代码附近的代码,每次显示十行:
list / l
- 查看指定行号附近的代码:
list <line-number> / l <line-number>
- 查看指定文件的特定行号附近的源代码:
list <file-name>:<line-number>
- 查看特定函数的源代码:
list <function-name>
3.4启动被调试的程序:
- 程序不需要参数:
run / r
- 启动程序并提供参数:
run 参数之间使用空格隔开
3.5在程序中设置断点:
- 在指定行号设置断点:
break <line-number> / b <line-number>
- 在函数调用处设置断点:
break function
- 在指定文件的函数调用处设置断点:
break <file-name>:function
3.6显示当前设置的断点信息:
- 查看所有设置的断点:
info breakpoints / info b
- 名词解析:
3.7删除设置的断点:
- 删除指定序号断点:
delete n / d n
- 删除所有断点:
delete / d
- 退出调试后,上一次的所有断点都会被清空。
3.8禁用和启用断点:
- 禁用断点:
disable n
- 启用断点:
enable n
3.9退出gdb:
quit / q
3.10逐语句执行代码:类似F11
step / s
3.11逐过程执行代码:类似F10
next / n
3.12打印变量或者表达式的值:相当于监视窗口查看单个变量
print / p
3.13像VS一样常显示某些变量或表达式:
display 变量名
3.14取消常显示的变量或表达式:
undisplay 序号
3.15运行到指定行:
until n
3.16从一个断点运行到下一个断点:
continue / c
3.17在一个函数内部,直接运行完该函数并跳出:
finish / f
3.18查看当前变量值,类似VS自动窗口:
info locals
3.19修改变量的值:
set char 变量名=值
3.20查看各级函数调用及参数:
breaktrace / bt