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图 ...
随机推荐
- Oracle之主键的创建、添加、删除操作
一.创建表的同时创建主键约束 1.1.无命名 SQL)); Table created SQL> select table_name,index_name from user_indexes w ...
- 【PHP设计模式 07_ZeRenLian.php】责任链模式
<?php /** * [责任链模式] * 情景设置:根据不同的需求,去找相应级别的责任人解决问题 */ header("Content-type: text/html; charse ...
- 26、Oracle(二)
1)掌握多行函数与分组操作 2)掌握多表查询与子查询 3)理解集合查询与掌握Oracle分页语法 4)理解创建.修改和删除表和表约束 --------------------------------- ...
- CGRectGet系列
CGRectGetHeight返回label本身的高度 CGRectGetMinY返回label顶部的坐标 CGRectGetMaxY 返回label底部的坐标 CGRectGetMinX 返回lab ...
- 在PostgreSQL中使用oracle_fdw访问Oracle
本文讲述如何在PostgreSQL中使用oracle_fdw访问Oracle上的数据. 1. 安装oracle_fdw 可以参照:oracle_fdw in github 编译安装oracle_fdw ...
- word 排版问题
1.wps word为何设置了页边距后下面的页边距不变呢 在章节选项卡中,查看章节导航,有可能是文档分节了,光标所在的节已经调整,而你看到页是另一节 2.分栏 选中你要进行分栏的内容,进行分栏,也可以 ...
- Serializable接口使用纪实
这两天依领导要求使用sonar工具测试了一下项目代码,其中有一个问题是 而这个类的结构大概是这样的: public class Demo<T> implements Serializabl ...
- 上传图片到阿里云OSS和获取上传图片的外网url的步骤
啥都不说 直接上代码 1.html: <form action="/bcis/api/headImgUpload.json" method="post" ...
- [团队项目]第二个冲刺 看板和燃尽图 Sprint2 6.8/6.9/6.10/6.11/6.12/6.13/6.14
1.开始一个新的冲刺: 起止:2016.6.1~2016.6.14 按照以下过程进行 ProductBacklog:继续向下细化 Sprint 计划会议:确定此次冲刺要完成的目标 Sprint Bac ...
- Unity-Animator深入系列---deltaPosition&deltaRotation
回到 Animator深入系列总目录 官方文档给出的信息非常含糊 Gets the avatar delta position for the last evaluated frame. 测试了一下, ...