【Linux取经之路】编译器gcc/g++的使用 调试器gdb的使用
目录
背景知识
编译器gcc/g++的安装
编译器gcc/g++的使用
调试器gdb的使用
cgdb
条件断点
背景知识
子曰:“温故而知新”。在谈gcc/g++的使用之前,我们先来复习编译的4个阶段,也算是为下面的内容做一些铺垫,请看思维导图。
编译器gcc/g++的安装
在CentOS下,安装的指令为 sudo yum install -y gcc。
在Ubuntu下,安装的指令为 sudo apt install -y gcc。
编译器gcc/g++的使用
gcc和g++的使用方法很类似,因为它们的选项基本一样。
● -E,在预处理结束后停止编译过程。
● -S,编译完成就停下。
● -c,汇编完成就停下。
● -g,生成调试信息。
编译器优化选项的4个级别:
● -O0
● -O1
● -O2
● -O3
其中,-O0表示没有优化,-O1为缺省值,-O3的优化级别最高。
其他选项:
● -w,不生成任何警告信息。
● -Wall,生成所有警告信息。
下面,我们来练练手。
1)将test.c进行预处理,生成test.i文件。
我们打开test.i瞅一眼。
2)将test.i进行编译生成test.s文件。
我们打开test.s看看。
可以看到,已经变成汇编指令了。
3)将test.s进行汇编生成test.c文件。
当我们在打开test.o时,会发现我们已经看不懂了,汇编指令已经被转换成机器可识别的二进制代码。
4)-g选项有无的对比
我们可以看到,加了-g选项生成的_g_test文件要比没加-g选项生成的test文件要大,这是因为_g_test文件里包含了调试信息,而test中没有包含。
调试器gdb的使用
程序的发布方式有两种,debug模式和release模式,gcc/g++直接编译出来的二进制程序,默认是release模式。如果我们要使用gdb调试,就必须在编译的时候加上-g选项。至于-g选项怎么加,上面已经演示过了。下面我们正式进入gdb的使用。
指令:gdb code / /打开code进行调试
● ctrl + d 或 quit,退出调试。
● list 或 l 行号,以所指定行号为中心显示源代码,一次10行。
● list 或 l 函数名,列出指定函数的源代码。
● run 或 r,运行程序。
● n 或 next,逐过程调试(不会进入函数内部)。
● s 或step,逐语句调试(会进入函数内部)。
● b 或 break 行号,在指定行设置断点。
● break 函数名,在指定函数开头设置断点。
● info break,查看断点信息。
● finish,执行当前函数,然后停下。
● p 变量,打印变量的值。
● set var,修改变量的值。
● c 或continue,从当前位置开始运行。
● delete breakpoints,删除所有断点。
● d n,删除序号为n的断点。
● delete breakpoints,删除所有断点。
● disable breakpoints,禁用所有断点。
● disable breakpoint n,禁用n号断点。
● enable breakpoints,启用所有断点。
● enable breakpoint n,启用n号断点。
● info b,查看所有断点信息。
● until 行号,跳到指定行。
● display 变量名,跟踪查看一个变量,每次停下来都显示它的值。
● undisplay,取消对先前设置的变量的跟踪。
cgdb
cgdb是gdb的一个图形界面版本,它具有gdb的所有功能,相较于gdb,cgdb便于我们查看源代码。
CentOS下,安装指令 sudo yum install -y cgdb。
Ubuntu下,安装指令 sudo apt install -y cgdb。
用法:cgdb 文件,例如,cgdb code。
条件断点
通过前面的学习,我们已经掌握了如何打断点,现在我们来学习如何打条件断点。
关键字:condition
语法:condition 断点编号 条件
下面举个简单的例子。
上述设置的条件断点的意思是:如果a等于20就停下来,否则不停下。我们可以看到,在运行起来后,程序停在了第12行,也就是说跳过了第一个断点,因为a不等于20,导致条件断点没生效。
本文到这就结束啦~如有错误,请您不吝指出!