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图 ...
随机推荐
- ServiceStack.Redis常用操作 - 事务、并发锁_转
一.事务 使用IRedisClient执行事务示例: using (IRedisClient RClient = prcm.GetClient()) { RClient.Add("key&q ...
- STM32F0系列MCU中断向量表的重映射
最近使用了一款Cortex-M0内核的芯片STM32F030CC,发现它中断向量表的重映射方法与STM32F10x系列的有所区别,在这里记录与分享一下. 由于需要通过IAP进行固件升级,所以芯片的FL ...
- Hibernate,JPA注解@ManyToMany
@ManyToMany默认处理机制,当双向多对多关联中没有定义任何物理映射时, Hibernate根据以下规则生成相应的值: 关联表名: 主表表名+_下划线+从表表名: 关联到主表的外键名:从表用于关 ...
- Android应用插件式开发解决方法
转自:http://blog.csdn.net/arui319/article/details/8109650 一.现实需求描述 一般的,一个Android应用在开发到了一定阶段以后,功能模块将会越来 ...
- ectouch第十讲 之ecshop中 dwt, lbi 文件详解
原文:http://www.yunmoban.cn/article-241.html Ecshop包括的文件夹有admin.api.cert.data.images.includes.js. lang ...
- jquery函数和javascript函数的区别
一.窗口加载:http://www.w3school.com.cn/js/js_library_jquery.asp 在 JavaScript 中,您可以分配一个函数以处理窗口加载事件: JavaSc ...
- StringBuffer类的方法
public class Page116 { /** * StringBuffer类的练习 * @param args * @throws IOException */ public static v ...
- AngularJS 用 Interceptors 来统一处理 HTTP 请求和响应
Web 开发中,除了数据操作之外,最频繁的就是发起和处理各种 HTTP 请求了,加上 HTTP 请求又是异步的,如果在每个请求中来单独捕获各种常规错误,处理各类自定义错误,那将会有大量的功能类似的代码 ...
- layer
一款实用的web提示框架!下面是实用这款框架的实例 html代码 <p class='layer_notice'>我们是否是好惹的</p> <input type=&qu ...
- 收藏的Android非常好用的组件或者框架。
博客分类: android android框架 先说两个网站: http://www.androidviews.net/ http://www.theultimateandroidlibrary.co ...