先查看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. SQL算术数字的默认类型

    select 100*100*100*100*100 --错误:将 expression 转换为数据类型 int 时出现算术溢出错误. select   cast(1000 as  bigint) * ...

  2. DataGuard主备归档存在gap的处理办法

    DataGuard主备之间可能由于网络等原因,造成备库和主库之间的归档日志不一致,这样就产生了gap. 解决gap的步骤: 1.在备库获得gap的详细信息 2.将需要的归档日志从主库拷贝到备库 3.备 ...

  3. LTS版本的解析

    LTS = Long Term Support Long Term Support:长时间支持版本(三年) ,一般的版本支持为18个月

  4. vi复制文字

    可以对文字使用标记,在光标处使用 ma 将该行标记为a,可用`a (反引号)定位到该标记a位置,用'a (单引号)定位到该行行首. d$删除光标位置到行尾,y$取光标位置到行尾.d和y也可配合标记使用 ...

  5. HDU 1715 大菲波数

    大菲波数 问题描述 : Fibonacci数列,定义如下: f(1)=f(2)=1 f(n)=f(n-1)+f(n-2)  n>=3. 计算第n项Fibonacci数值. 输入: 输入第一行为一 ...

  6. YTU 3002: 出栈顺序(栈和队列)

    3002: 出栈顺序(栈和队列) 时间限制: 1 Sec  内存限制: 128 MB 提交: 80  解决: 20 题目描述 给出一个入栈序列,和一个出栈序列,判断该出栈序列是否正确. 输入 输入包含 ...

  7. HttpClient的使用方法

    使用httpClient发送请求.接收响应很简单.一般需要以下几个步骤. 第一:创建HttpClient对象: 第二:创建请求方法的实例,并指定请求URL.如果要发送GET请求,创建HttpGet对象 ...

  8. javaWEB国际化(jsp中使用)

    在jsp页面中使用国际化方法,首先将jstl开源架包:jstl.jar,standard.jar导进去 并在src目录下建立以test开头,.properties结尾的文件:test_en_US.pr ...

  9. [小技巧] git: Your branch and 'origin/master' have diverged

    本文参考:http://stackoverflow.com/questions/19864934/git-your-branch-and-origin-master-have-diverged-how ...

  10. Log4net使用指南

    请在这里下载示例代码 1           简介 1.1          Log4net的优点: 几乎所有的大型应用都会有自己的用于跟踪调试的API.因为一旦程序被部署以后,就不太可能再利用专门的 ...