先查看linux有没有gcc 和 gdb

$ gcc -v

$ gdb -v

如果没有安装gcc,可以 $ yum install gcc

要获取管理员权限才能安装软件,$ su root (有的linux是sudo root)

gdb的安装和gcc一样。

编译命令:

$ gcc -o <输出文件名> <源文件名>

执行命令:

$ ./<输出文件名>

调试命令:

1.  在编译的时候:gcc -o <输出文件名> -g <源文件名>

2.  $ gdb <输出文件名>

查看源代码 :(gdb) l <第几行开始>

增加断点:(gdb) b <第几行>

运行:(gdb) run

查看变量:(gdb) p <变量名>

继续:(gdb) c

退出:(gdb) q

帮助:(gdb) help

/************************************如果你还是有疑惑************************************************/

下面通过一个很简单的例子来说明。

1 .编写C程序:$ vim test.c

进入vim后,按 i 进入编辑模式

输入如下代码:

    #include<stdio.h>
#define N 10
int main(void){
int a[N] = {,,,,,,,,,};
int i;
for(i=;i<=N;i++){
printf("%d ",a[i]);
}
printf("\n");
return ;
}

完成之后,按ESC ,然后按 shift+: 进入vim命令行模式 输入 wq保存并退出vim 回到 shell

2. 编译:

$ gcc -o test test.c (其中-o 表示将编译后的可执行文件命名为test)

3. 执行:

$ ./test

得到的结果是:1 2 3 4 5 6 7 8 9 10 0

怎么多了一个0?

源代码的本意是打印从a[0]到a[N-1]的值,但是某个初学C语言的同学粗心了,怎么也得不到正确结果,程序出现了问题,对着代码看了许久都没有发现问题所在。

所以他决定调试,但是他不知道在Linux命令行下怎么调试。

4. 调试

  首先,重新编译C程序:

  $ gcc -o test -g test.c

  和刚才编译的命令多了一个 “-g” 这个表示生成的文件可用gdb来调试。

  $ gdb test

  进入调试界面

  (gdb) l 1                         //(字母“L”的小写 和 1) 会输出从第一行开始的源代码。

  (gdb) b 7                       //(在源代码的第7行加断点,b是breakpoint的缩写)

  (gdb) run                      // 这时候程序会在第七行停止。

  (gdb) p i                       // 表示打印i的值,p是print的缩写,这时会输出 :$1 = 0 ,即 i == 0

  (gdb) p a[i]                   // 表示打印a[i]的值,p是print的缩写 这时会输出:$2 = 1 ,即 a[i] == 1

  (gdb) c                       // 继续执行,程序会在第七行停止,这时候可以用p命令来查看相应的值。

  最后当程序运行到 i == 9的时候,发现a[9]已经等于10了,该同学觉得下一步程序应该要正常退出才对,于是,他输入了 (gdb) c

  结果发现 程序继续停在第七行,他非常纳闷,于是 (gdb) p i ,发现 i == 10,(gdb)p a[i] == 0,这时他才猛然想起老师教的内容:数组大小为10,范围是从0到9

  然后

  (gdb) l 7                     // 打印第七行前后几行的源代码

  这时他发现他的代码第六行:for(i=0;i<=N;i++)

  原来问题出在这个'='上,他发现了问题所在。

  于是

  (gdb) q                       //结束当前调试,返回shell命令行界  

  再次用 vim test.c 打开源文件 修改了代码

  最后他重新编译了一遍

  gcc -o test test.c

  这一次,他终于得到了正确的答案,然后他顺便学会了gdb来调试C程序。

Linux下C程序的编译,运行,及调试的更多相关文章

  1. Linux下librdkafka客户端的编译运行

    Linux下librdkafka客户端的编译运行 librdkafka是一个开源的Kafka客户端C/C++实现,提供了Kafka生产者.消费者接口. 由于项目需要,我要将Kafka生产者接口封装起来 ...

  2. Linux下C程序的编辑,编译和运行以及调试

    国内私募机构九鼎控股打造APP,来就送 20元现金领取地址:http://jdb.jiudingcapital.com/phone.html 内部邀请码:C8E245J (不写邀请码,没有现金送) 国 ...

  3. [转]Caffe在Linux下的安装,编译,实验

    Caffe在Linux下的安装,编译,实验  原文地址:http://www.cnblogs.com/evansyang/p/6150118.html 第一部分:Caffe 简介 caffe是有伯克利 ...

  4. Linux 下提高make的编译效率

    Linux下安装程序,一般都通过包管理器安装,但是包管理器或软件商店里的软件往往不是最新版本的,安装最新版软件时通常是下载源代码进行编译. 编译安装源代码时就离不开make了,但是make是单线程的, ...

  5. Linux下C程序内存泄露检测

    在linux下些C语言程序,最大的问题就是没有一个好的编程IDE,当然想kdevelop等工具都相当的强大,但我还是习惯使用kdevelop工具,由于没有一个习惯的编程IDE,内存检测也就成了在lin ...

  6. Linux下 SpringBoot jar项目后台运行、查看、停用

    运行java jar: nohup java -jar **-0.0.1-SNAPSHOT.jar & 查看进程: 采用top或者ps aux命令.一般 如果后台是springboot,jar ...

  7. Linux下C程序的内存映像

    2.Linux下C程序的内存映像 2.1. 代码段.只读数据段(1)对应着程序中的代码(函数),代码段在Linux中又叫文本段(.text)(2)只读数据段就是在程序运行期间只能读不能写的数据,con ...

  8. linux下c程序调用reboot函数实现直接重启【转】

    转自:http://www.blog.chinaunix.net/uid-20564848-id-73878.html linux下c程序调用reboot函数实现直接重启 当然你也可以直接调用syst ...

  9. 位图文件(BMP)格式以及Linux下C程序实现(转)

    源:位图文件(BMP)格式以及Linux下C程序实现 说到图片,位图(Bitmap)当然是最简单的,它是Windows显示图片的基本格式,其文件扩展名为*.BMP.由于没有经过任何的压缩,故BMP图 ...

随机推荐

  1. jython语言学习笔记

    1.变量可以随便定义,不限制类型,不限制数值.开头空4个空格,使用def定义函数,可以嵌套,可以传参. 2.每个语句结束的时候没有分号.定义类的时候没有括号.在print语句的后面有格式转换时要加上% ...

  2. linux中Iptables限制同一IP连接数防CC/DDOS攻击方法

    1.限制与80端口连接的IP最大连接数为10,可自定义修改.  代码如下 复制代码 iptables -I INPUT -p tcp --dport 80 -m connlimit --connlim ...

  3. Apache httpd和JBoss构建高可用集群环境

    1. 前言 集群是指把不同的服务器集中在一起,组成一个服务器集合,这个集合给客户端提供一个虚拟的平台,使客户端在不知道服务器集合结构的情况下对这一服务器集合进行部署应用.获取服务等操作.集群是企业应用 ...

  4. C#:文件、文件夹特别操作

    1.过滤特殊字符 public class CharService:IDisposable { private List<char> _invalidChars; public CharS ...

  5. 《More Effective C++》

    new operator申请内存,并调用构造函数: 而operator new只申请内存: new operator会调用operator new来申请内存:operator new可以重写或重载: ...

  6. [ios][swift]使用swift闭包进行viewcontroller反向传值

    闭包参考:http://c.biancheng.net/cpp/html/2285.html   闭包详解 传值参考:http://www.tuicool.com/articles/vy2uUz Sw ...

  7. Spring MVC 中请求返回之后的页面没法加载css、js等静态文件

    1.是否被拦截,这个在Web.xml配置中servlet拦截是“/”,如果是则 a.使用spring MVC 的静态资源文件 <!-- 静态文件访问,主要是针对DispatcherServlet ...

  8. c#委托之最大

    public delegate int ceshi(object o1, object o2); static void Main(string[] args) { string[] a = { &q ...

  9. [转]Unity: make your lists functional with ReorderableList

    原文地址:http://va.lent.in/unity-make-your-lists-functional-with-reorderablelist/ This article is reprod ...

  10. UML中的用例(Use Case)概念分析及StarUML实例

    在UML中use case似 乎最簡單的,用例建模的最主要功能就是用来表达系统的功能性需求或行为,依我的理解用例建模可分为用例图和用例描述.用例图由参与者(Actor).用例 (Use Case).系 ...