GCC编译调试C语言基础

#include<stdio.h>
int main()
{
  printf("Hello World!");
  return 0;
}
cloudray@ubuntu:~/test/testc$ gcc -o test hello.c
cloudray@ubuntu:~/test/testc$ ls
hello.c  test
cloudray@ubuntu:~/test/testc$ ./test
Hello World!

GCC简介

 GCC,全名GNU编译器套件(GNU Compiler Collection)。由GNU开发的编程语言编译器,包括C、C++、 Objective-C、 Fortran、Java、Ada和Go语言前端,也包括了这些语言的库(如libstdc++,libgcj等)。
 支持在各种处理器架构上使用。
(ps:关于GNU可以继续深入了解)
 The GNU Compiler Collection includes front ends for C, C++, Objective-C, Fortran, Ada, Go, and D, as well as libraries for these languages (libstdc++,…). GCC was originally written as the compiler for the GNU operating system. The GNU system was developed to be 100% free software, free in the sense that it respects the user’s freedom.
GCC, the GNU Compiler Collection - GNU Project

编译器组件

 分析器:将程序语言变为汇编程序
 汇编器:将汇编语言转换为CPU可执行字节码(二进制)
 链接器:将汇编器生成的单独目标文件组合成可执行的应用程序。链接器需要知道这种目标格式一边工作。
 标准C库:主要与常用的C程序库,通过链接器与源代码连接。

支持后缀

文件后缀描述
.cC语言源文件
.C/.cc/.cxx/.cppC++ 源文件
.h C/C++头文件
.i/.ii经过预处理的 C/C++ 文件
.s/.S汇编语言源文件
.o/.obj静态库
.so/.dll动态库
.a/.so编译后的库文件

GCC基本参数

命令作用
-c只进行编译过程,而不链接成可执行文件,编译器只是将输入的源代码(.c/c++、java、python等)生成.o为后缀的目标文件(objective file),通常用于编译不包含主程序的子程序。
-o确定输出文件名,注意输出文件名不能和源文件同名;如果不给出该调用参数,gcc就给出默认的可执行文件a.out。
-g生成符号调试工具(GNU的gdb)所需要的符号信息,想要对源代码进行调试,必须加入这个选项。
-E仅执行预处理操作,而不进行编译、汇编和链接操作。
-S仅执行编译操作,而不进行汇编、链接操作
-O对程序进行优化编译、链接操作,提高可执行文件的执行效率,但编译链接也会慢一点。
-O2更高级别优化,也会更慢。
-w禁止显示任何警告信息
-Wall显示全部警告信息

编译流程

在这里插入图片描述

 1. 预处理(Pre-Processing)
 2. 编译(Compiling)
 3. 汇编(Assembling)
 4. 链接(Linking)
在这里插入图片描述

逐步生成可执行文件

cloudray@ubuntu:~/test/testc$ gcc -E hello.c -o hello.i #包含头文件
cloudray@ubuntu:~/test/testc$ gcc -S hello.c -o hello.s #汇编代码
cloudray@ubuntu:~/test/testc$ gcc -c hello.s -o hello.o #二进制文件
cloudray@ubuntu:~/test/testc$ gcc hello.o -o hello #可执行文件
cloudray@ubuntu:~/test/testc$ ./hello
Hello World!

常见错误

  1. C语法错误
  2. 头文件错误
  3. 档案库错误
  4. 未定义错误

GDB调试基础

 Unix下的调试工具。一般来说,GDB主要帮助你完成下面四个方面的功能:
 1. 启动你的程序,可以按照你的自定义的要求随心所欲的运行程序。
 2. 可让被调试的程序在你所指定的调置的断点处停住。(断点可以是条件表达式)
 3. 当程序被停住时,可以检查此时你的程序中所发生的事。
 4. 你可以改变你的程序,将一个BUG产生的影响修正从而测试其他BUG。

基础命令。

命令(简写)作用
gdb -t .c生成可调试的可执行文件
gdb 可执行文件进入该文件的调试界面
list(l)显示接下来的十行代码
start开始调试,在主函数第一行处停止(即自动设置断点)
run®运行(遇到断点才停止)
next(n)逐步执行
break(b)设置一般断点,可在特点行数或者函数处设置
info break(b)查看所有断点信息
s进入下一个将要运行的函数
p查看特定变量值
quit(q)退出gdb调试
回车重复上一条命令

示例

#include <stdio.h>
int sum(int a, int b);
int fun(int a, int b);
int main()
{
    int a,b;
    scanf("%d %d",&a,&b);
    printf("开始\n");
    printf("a+b=%d\n", sum(a, b));
    fun(a,b);
    return 0;
}
int sum(int a,int b)
{
    return (a + b);
}

int fun2(int a, int b);
int fun(int a,int b)
{
    printf("axb=%d\n",a*b);
    fun2(a,b);
    return 0;
}
int fun2(int a,int b)
{
    printf("a/b=%d\n",a/b);
    return 0;
}

第一步:生成调试文件

gcc -g test.c -o test

第二步:进入该文件的调试界面

gdb 可执行文件

显示代码:list(l)
一次显示10行,回车表示重复上次命令。
在这里插入图片描述
开始运行:run®
直到所设断点。
在这里插入图片描述
设置一般断点,并查看所有断点情况。
break(b)
info break(b)
在这里插入图片描述
逐步执行:next(n)
先自动运行到断点处,再逐步执行,回车重复,且不进入内部函数。
在这里插入图片描述
开始调试:start
停留在主函数第一行。
在这里插入图片描述
进入函数:s
逐步调试,但会进入每一个内部函数,包括printf。
在这里插入图片描述
退出函数:finish
在这里插入图片描述
查看与打印变量或地址:print§
在这里插入图片描述
在这里插入图片描述
退出调试: quit(q)
在这里插入图片描述

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值