Linux C程序编译与调试

1、Yum 仓库搭建及 gcc 的安装

        (1) 准备安装包,安装包再系统光盘“rhel-server-6.3-i386-dvd.iso”的镜像文件中

        (2) 将安装包添加到 VMware 的虚拟光驱中

        (3) 在系统终端中切换到管理员用户

        (4) 挂在光盘 mount /dev/cdrom /mnt

        (5) 在 /etc/yum.repos.d 目录中写配置文件 test.repo

        (6) 验证 yum 仓库是否有效 yum repolist

        (7) 搜索 gcc,yum search gcc

        (8) 安装 yum install gcc.i686

test.repo 文件内容如下:

2、gcc 分步编译链接

        (1) 预编译 :

                gcc -E main.c -o main.i

        (2) 编译:

                gcc -S main.i -o main.s

        (3) 汇编:

                gcc -c main.s -o main.o

        (4) 链接:

                gcc main.o -o main 

3、编译链接过程

3.1 预编译阶段

        a) 删除所有的“#define”,并且展开所有的宏定义;

        b) 处理所有的条件预编译指令,“#if”、“#ifdef”、“#endif”等;

        c) 处理“#include”预编译指令,将被包含的文件插入到该预编译指令的位置;

        d) 删除所有的注释;

        e) 添加行号和文件名标识,以便于编译器产生调试用的符号信息及编译时产生编译错 误和警告时显示行号;

        f) 保留所有的#pragma 编译器指令,因为编译器需要使用它们。 

3.2 编译阶段

        词法分析、语法分析、语义分析,代码优化,汇总符号。

3.3 汇编阶段

        将汇编指令翻译成二进制格式,生成各个 section,生成符号表。

3.4 链接阶段

        a) 合并各个 section,调整 section 的起始位移和段大小,合并符号表,进行符号解析, 给符号分配虚拟地址

        b) 符号重定位

 4、makefile 和 make

        管理工程 实现自动化编译 (和 vs 比较)示例:

                对 main.c add.c max.c 三个文件进行编译(注意: gcc 前面必须是 table 建缩进)

        make 命令根据 makefile 文件的规则生成可执行程序 

5、gdb 调试

5.1 Debug 版本和 Release 版本 

        Debug 版本

        Debug 版本为可调式版本,生成的可执行文件中包含调试需要的信息。我们作为开发人 员,最常用的就是 debug 版本的可执行文件。

        Debug 版本的生成:

        因为调试信息是在编译过程时加入到中间文件(.o)中的,所以必须在编译时控制其生 成包含调试信息的中间文件。

         gcc -c hello.c -g ---> 生成包含调试信息的中间文件

        gcc -o hello hello.o

或者 gcc -o hello hello.c -g

        Release 版本

        Release 版本为发行版本,是提供给用户使用的版本。用 gcc 默认生成的就是 Release 版 本。

        首先将源代码编译、链接生成 Debug 版本的可执行文件,然后通过‘gdb Debug 版本 的可执行文件名’进入调试模式。

5.2 单进程、单线程基础调试命令

l    //显示 main 函数所在的文件的源代码
list 文件名:num     //显示 filename 文件 num 行上下的源代码
b 行号     //给指定行添加断点
b 函数名     //给指点函数的第一有效行添加一个断点
info break     //显示断点信息
delete 断点号     //删除指定断点
disable 断点号     //将断点设定为无效的,不加断点号,将所有断点设置为无效
enable     断点号     //将断点设定为有效的,不加断点号,将所有断点设置为有效
r(run)     //运行程序
n(next)     //单步执行
c (continue)     //继续执行,直接执行到下一个断点处
s         //进入将要被调用的函数中执行
finish     //跳出函数
q     //退出调试
p val     //打印变量 val 的值
p &val     //打印变量 val 的地址
p a+b     //打印表达式的值
p arr(数组名)     //打印数组所有元素的值
p *parr@len     //用指向数组的指针打印数组所有元素的值
display     //自动显示,参数和 p 命令一样
info display     //显示自动显示信息
undisplay + 编号     //删除指定的自动显示
ptype val     //显示变量类型
bt     //显示函数调用栈

5.3 多进程调试命令

        (gdb)set follow-fork-mode

                mode mode 可以选择 parent 或者 child,即:选择调试那个进程。

                注意:未被跟踪调试的进程会直接执行结束。 

5.4 多线程调试命令

        a) 利用 info threads 查看线程信息;

        b) thread id 调试目标 id 指定的线程;

        c) set scheduler-locking off | on | step;

                “off”表示不锁定任何线程;

                “on”只有当前被调试的线程继续运行;

                “step”在单步执行的时候,只有当前线程会执行;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

安冉冄先森

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值