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图 ...
随机推荐
- JavaEE基础(二十)/IO流
1.IO流(IO流概述及其分类) 1.概念 IO流用来处理设备之间的数据传输 Java对数据的操作是通过流的方式 Java用于操作流的类都在IO包中 流按流向分为两种:输入流,输出流. 流按操作类型分 ...
- iOS身份证的正则验证
在ios项目的开发中可能很多地方都需要用到身份证校验,一般在开发的时候很多人都是直接百度去网上荡相关的正则表达式和校验代码,但是网上疯狂粘贴复制的校验代码本身也可能并不准确,可能会有风险,比如2013 ...
- [BIM]STEP标准和EXPRESS语言
参考:http://blog.sina.com.cn/s/blog_620be62e0100iqyb.html (BIM名词和术语(四)- IFC/STEP/EXPRESS) IFC标准使用形式化的数 ...
- win7里边使用telnet命令提示telnet不是内部或外部命令
Win7默认没有安装telnet功能,所以你直接用telnet命令是用不了的: 你可以去“控制面板”-->“程序”(在左下角)--->“打开或关闭Windows功能”,勾上“telnet客 ...
- 局域网 其它主机ping不通win7, 解决
默认情况下,Windows 7出于安全考虑不允许外部主机对其进行Ping测试. 允许ICMP回显 设置如下: 1. 打开win7防火墙设置界面 2. 左边的菜单中选择 [高级设置] 3. 在弹出的 [ ...
- Database
1.Mysql 本地计算机登陆mysql,(DOC界面)mysql -h 127.0.0.1 -u root -p
- 如何修改配置以修复ThinkPad 小红帽滚轮失效?
本人使用ThinkPad X1 Carbon超级本,由于近期安装了遨游浏览器(Maxthon),发现其总体体验还是不错,但是在本机器上有个明显的Bug:就是小红帽的滚轮不管用. 由于就查了网上相关资料 ...
- U3D刚体测试2(ForceMode,AddForce,RelativeAddForce)
摘自圣典的一段翻译: ForceAdd a continuous force to the rigidbody, using its mass.添加一个可持续力到刚体,使用它的质量.Accelerat ...
- Solr开发文档
转载:http://www.cnblogs.com/hoojo/archive/2011/10/21/2220431.html Solr 是一种可供企业使用的.基于 Lucene 的搜索服务器,它支持 ...
- [cdoj1380] Xiper的奇妙历险(3) (八数码问题 bfs + 预处理)
快要NOIP 2016 了,现在已经停课集训了.计划用10天来复习以前学习过的所有内容.首先就是搜索. 八数码是一道很经典的搜索题,普通的bfs就可求出.为了优化效率,我曾经用过康托展开来优化空间,甚 ...