GCC编译器
GCC(GNU Compiler Collection) 是目前Linux下最常用的c语言编译器,它是GNU项目中符合ANSI C标准的编译系统,可以在多种硬件平台上编译出可执行程序的超级编译器,执行效率与一般的编译器相比平均效率要高20%~30%。
基本用法
在终端中输入下列命令:
gcc options filename
其中,filename为要操作的*.c文件,options是编译器所需要的参数,有以下几个:
-c
只编译,不链接成可执行文件。编译器只是由输入的*.c等源程序生成*.o目标文件。-o output_filename
生成可执行文件output_filename。例如需运行下列c程序(冒泡排序算法)。
//文件名为test.c,存放在home/sywyg/test中
//生成的可执行文件为test,存放在同一目录下
#include<stdio.h>
void BubbleSort(int *data,int count){
int temp,i,j;
for(i=0;i<count;i++){
for(j=count-1;j>0;j--){
if(data[j]<data[j-1]){
temp=data[j-1];
data[j-1]=data[j];
data[j]=temp;
}
}
}
}
int main()
{
int i;
int data[]={8,9,5,3,2,6,7,4,1};
BubbleSort(data,9);
for(i=0;i<9;i++){
printf("%d",data[i]);
}
printf("\n");
return 0;
}
执行过程如图1:
图1GCC编译过程
-g
产生符号调试工具(GDB)所必要的符号资讯。若对源文件进行调试,必须加上这个参数。-O
对程序进行优化编译链接,产生的可执行文件效率可以提高,但时间较慢。
-O2
比-O更优,时间更长。
GDB调试器
启动调试程序
使用GDB调试程序时,首先GDB需要获得程序的信息,因此需在编译是使用参数-g。编译命令如下:
gcc -g -o 可执行文件名(test) 源程序文件名(test.c)
接着可以使用下列命令加载可执行文件进行调试:
gdb 可执行文件名(test)
同样以上面的c程序举例,上述命令如图2。
图2gdb调试1
此时进入到GDB调试工具中,GDB有以下常见命令:
- run
运行命令(每次从头开始),在遇到特殊情况(例如断点)时停止。 - break
断点命令。有以下三种情况:
1.break i //表示在第i行设置断点
2.break function() //表示在进入函数function()处设置断点
3.break i/function() if A //表示满足条件A时运行到i/function()设置断点
在断点后可使用continue命令执行断点后的程序,直到遇到下一次特殊情况。
- next
单步执行程序命令(会跳过子函数) - step(快捷键s)
单步执行子函数语句。 - print
显示变量或表达式的值 - display
显示变量或表达式的值,与print不同点在于每次遇到都会显示该表达式的值。使用disable/enable display 使display失效/恢复 - list
显示部分源代码 - watch
监视变量或表达式,一旦被监视对象的值发生改变,程序就会改变 - kill
终止正在调试的程序 - quit
退出GDB调试器
小技巧:使用Tab键能够智能提示命令,帮你补全命令。
注:本文内容部分借鉴明日科技编著的《Linux C 从入门到精通》。