Linux下C程序的编译,运行,及调试
先查看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程序的编译,运行,及调试的更多相关文章
- Linux下librdkafka客户端的编译运行
Linux下librdkafka客户端的编译运行 librdkafka是一个开源的Kafka客户端C/C++实现,提供了Kafka生产者.消费者接口. 由于项目需要,我要将Kafka生产者接口封装起来 ...
- Linux下C程序的编辑,编译和运行以及调试
国内私募机构九鼎控股打造APP,来就送 20元现金领取地址:http://jdb.jiudingcapital.com/phone.html 内部邀请码:C8E245J (不写邀请码,没有现金送) 国 ...
- [转]Caffe在Linux下的安装,编译,实验
Caffe在Linux下的安装,编译,实验 原文地址:http://www.cnblogs.com/evansyang/p/6150118.html 第一部分:Caffe 简介 caffe是有伯克利 ...
- Linux 下提高make的编译效率
Linux下安装程序,一般都通过包管理器安装,但是包管理器或软件商店里的软件往往不是最新版本的,安装最新版软件时通常是下载源代码进行编译. 编译安装源代码时就离不开make了,但是make是单线程的, ...
- Linux下C程序内存泄露检测
在linux下些C语言程序,最大的问题就是没有一个好的编程IDE,当然想kdevelop等工具都相当的强大,但我还是习惯使用kdevelop工具,由于没有一个习惯的编程IDE,内存检测也就成了在lin ...
- Linux下 SpringBoot jar项目后台运行、查看、停用
运行java jar: nohup java -jar **-0.0.1-SNAPSHOT.jar & 查看进程: 采用top或者ps aux命令.一般 如果后台是springboot,jar ...
- Linux下C程序的内存映像
2.Linux下C程序的内存映像 2.1. 代码段.只读数据段(1)对应着程序中的代码(函数),代码段在Linux中又叫文本段(.text)(2)只读数据段就是在程序运行期间只能读不能写的数据,con ...
- linux下c程序调用reboot函数实现直接重启【转】
转自:http://www.blog.chinaunix.net/uid-20564848-id-73878.html linux下c程序调用reboot函数实现直接重启 当然你也可以直接调用syst ...
- 位图文件(BMP)格式以及Linux下C程序实现(转)
源:位图文件(BMP)格式以及Linux下C程序实现 说到图片,位图(Bitmap)当然是最简单的,它是Windows显示图片的基本格式,其文件扩展名为*.BMP.由于没有经过任何的压缩,故BMP图 ...
随机推荐
- SQL算术数字的默认类型
select 100*100*100*100*100 --错误:将 expression 转换为数据类型 int 时出现算术溢出错误. select cast(1000 as bigint) * ...
- DataGuard主备归档存在gap的处理办法
DataGuard主备之间可能由于网络等原因,造成备库和主库之间的归档日志不一致,这样就产生了gap. 解决gap的步骤: 1.在备库获得gap的详细信息 2.将需要的归档日志从主库拷贝到备库 3.备 ...
- LTS版本的解析
LTS = Long Term Support Long Term Support:长时间支持版本(三年) ,一般的版本支持为18个月
- vi复制文字
可以对文字使用标记,在光标处使用 ma 将该行标记为a,可用`a (反引号)定位到该标记a位置,用'a (单引号)定位到该行行首. d$删除光标位置到行尾,y$取光标位置到行尾.d和y也可配合标记使用 ...
- HDU 1715 大菲波数
大菲波数 问题描述 : Fibonacci数列,定义如下: f(1)=f(2)=1 f(n)=f(n-1)+f(n-2) n>=3. 计算第n项Fibonacci数值. 输入: 输入第一行为一 ...
- YTU 3002: 出栈顺序(栈和队列)
3002: 出栈顺序(栈和队列) 时间限制: 1 Sec 内存限制: 128 MB 提交: 80 解决: 20 题目描述 给出一个入栈序列,和一个出栈序列,判断该出栈序列是否正确. 输入 输入包含 ...
- HttpClient的使用方法
使用httpClient发送请求.接收响应很简单.一般需要以下几个步骤. 第一:创建HttpClient对象: 第二:创建请求方法的实例,并指定请求URL.如果要发送GET请求,创建HttpGet对象 ...
- javaWEB国际化(jsp中使用)
在jsp页面中使用国际化方法,首先将jstl开源架包:jstl.jar,standard.jar导进去 并在src目录下建立以test开头,.properties结尾的文件:test_en_US.pr ...
- [小技巧] git: Your branch and 'origin/master' have diverged
本文参考:http://stackoverflow.com/questions/19864934/git-your-branch-and-origin-master-have-diverged-how ...
- Log4net使用指南
请在这里下载示例代码 1 简介 1.1 Log4net的优点: 几乎所有的大型应用都会有自己的用于跟踪调试的API.因为一旦程序被部署以后,就不太可能再利用专门的 ...