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基础(二十四)/多线程
1.多线程(多线程的引入) 1.什么是线程 线程是程序执行的一条路径, 一个进程中可以包含多条线程 多线程并发执行可以提高程序的效率, 可以同时完成多项工作 2.多线程的应用场景 红蜘蛛同时共享屏幕给 ...
- 《深度探索C++对象模型》3
第六章:执行期语意学 全局对象的初始化: 局部静态对象的初始化: 构建对象数组的vec_new()函数: 针对数组的new操作: placement operator new: 反聚合提高效率: 模板 ...
- linux crontab定时执行
#利用crontab定时执行url研究了两种简单方式#一利用lynx访问url yum install lynxservice crond startcrontab -einsert键* * * * ...
- 【转】MYSQL入门学习之一:基本操作
转载地址:http://www.2cto.com/database/201212/173868.html 1.登录数据库 www.2cto.com 命令:mysql -u usern ...
- IIS装好后,局域网不能访问
IIS默认安装完成后,可以通过http:\\localhost或http:\\127.0.0.1或者http:\\ip地址访问,但是局域网内却不能通过IP来访问,通常只需要将防火墙关掉就好了,也在在防 ...
- Unity-Animator深入系列---StateMachineBehaviour初始化时间测试
回到 Animator深入系列总目录 结果和想的有点出入 测试结果: 1.SMB初始化会被调用多次,次数不可控,当Animator组件重复开关则重复初始化. 2.SMB支持构造函数 MyClass p ...
- 数的n次方 s.match(reg) marquee滚动效果
一.数的n次方 <script> alert(math.pow(a,5)); /*输出a的5次方*/ </script> 二. s.match(reg); s代表一个字符串,r ...
- 基于Node的PetShop,RESTful API以及认证
前篇 - 基本认证,用户名密码 后篇 - OAuth2 认证 由于宠物店的业务发展需要,我们需要一种更加便捷的方式来管理日益增多的宠物和客户.最好的方法就是开发一个APP,我可以用这个APP来添加.更 ...
- Http 请求
public static string HttpGet(string url) { HttpWebRequest request = (HttpWebRequest)WebRequest.Creat ...
- asp.net MVC webservice 报次错解决方法
asp.net MVC webservice 报次错解决方法: 解决方法: 在 RouteConfig.cs public static void RegisterRoutes(RouteCol ...