gcc编译器与gdb调试器

gcc编译器与gdb调试器

编译过程可分为四个阶段:

  1. 预处理(Pre-Processing)
  2. 编译(Compiling)
  3. 汇编(Assembling)
  4. 链接(Linking)

gcc文件类型约定规则:

在这里插入图片描述

gcc常用选项:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-97gPgoDa-1590075237154)(C:\Users\HUAWEI\Desktop\image-20200521211226703.png)]

常用的有 -o -c -S -E -g -O

**预处理:*在预处理阶段,gcc把预处理命令扫描处理完毕,输入C语言的源文件,通常为.c

它们通常带有.h之类的头文件的包含文件,这个阶段主要处理源文件中的#ifdef#include和#define等预处理命令,该阶段会生成一个中间文件*.i,可以使用-E生成中间文件.i

gcc -E hello.c -o hello.i

**编译:*gcc把预处理后的结果编译成汇编或者目标模块,输入的中间文件 * .i,编译后生成汇编语言文件.s

gcc -S hello.i -o hello.s

**汇编:*汇编阶段,编译器把编译出来的结果汇编成具体CPU上的目标代码模块,输入汇编文件 * .s,输出机器语言.o

gcc -c hello.s -o hello.o

**链接:*在链接阶段把多个目标代码模块连接成一个大的目标模块,输入机器代码文件, .o,汇集成一个可执行的二进制代码文件。

gcc hello.o -o hello

优化gcc

编译器通过分析源代码,找出其中尚未达到最优的部分,然后对其进行重新组合,改善程序的执行性能。

gcc -On

gcc -O2 常用

gcc -O0 不进行优化

调试选项

默认情况下,gcc在编译时不会建个调试符号插入到生成的二进制代码中,如果需要生成调试符号信息,可以使用gcc -g选项,一般不加调试选项,否则会使代码增大。

gdb调试器

功能表:

  1. 设置断点
  2. 单步执行程序,便于调试
  3. 查看程序中变量值的变化
  4. 动态改变程序的执行环境
  5. 分析崩溃程序产生的core文件

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jKCuZJDT-1590075237155)(C:\Users\HUAWEI\Desktop\image-20200521220135777.png)]

设置断点
break 4

break main

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LO9yyYUk-1590075237157)(C:\Users\HUAWEI\Desktop\image-20200521222933368.png)]

单步执行程序
step 步入
next 下一行
查看运行时的数据 print display
print <expr>
print/<f> <expr>
display 可以设置一些自动显示的变量,当程序停住时,或是在单步跟踪时,这些变量会自动显示,相关的gdb命令是display,格式如下
display<expr>
display/<fmt><expr>
display/<fmt><addr>

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ncQF1CxU-1590075237158)(C:\Users\HUAWEI\Desktop\image-20200521224510964.png)]

查看源程序

1、显示源代码

gdb可以打印出所调试程序的源代码,编译时一定要加上-g参数,用list来显示源代码

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HvwCPhqs-1590075237159)(C:\Users\HUAWEI\Desktop\image-20200521231148390.png)]

2、源代码内存

info line命令查看源代码在内存中的地址

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是使用vi编辑器、GCC编译器gdb调试器编写的用选择法对输入的10个整数从大到小排序的C语言代码: ``` #include <stdio.h> void selection_sort(int arr[], int n) { int i, j, max, temp; for (i = 0; i < n - 1; ++i) { max = i; for (j = i + 1; j < n; ++j) { if (arr[j] > arr[max]) { max = j; } } if (max != i) { temp = arr[i]; arr[i] = arr[max]; arr[max] = temp; } } } int main() { int arr[10], i; printf("请输入10个整数:\n"); for (i = 0; i < 10; ++i) { scanf("%d", &arr[i]); } selection_sort(arr, 10); printf("从大到小排序后的结果为:\n"); for (i = 0; i < 10; ++i) { printf("%d ", arr[i]); } printf("\n"); return 0; } ``` 使用vi编辑器创建名为`sort.c`的文件,将以上代码复制粘贴进去。然后使用GCC编译器进行编译,命令如下: ``` gcc -g -o sort sort.c ``` 其中,`-g`选项表示生成调试信息,`-o`选项指定生成的可执行文件的名称,`sort`为可执行文件的名称,`sort.c`为源代码文件的名称。 使用gdb调试器进行调试,命令如下: ``` gdb sort ``` 在gdb命令行界面中,可以使用以下命令进行调试: - `break main`:在`main`函数处设置断点。 - `run`:运行程序。 - `print arr`:查看数组`arr`的值。 - `next`:单步执行程序。 - `continue`:继续执行程序。 - `quit`:退出gdb调试器。 使用以上命令,可以进行程序的调试和排错。调试完成后,运行可执行文件即可得到从大到小排序后的结果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值