vi、gdb --linux

1、屏幕编辑程序Vi的使用
vi是Unix系统中使用最广泛的文件编辑器。
启动vi的方法很简单:直接输入“vi”或直接输入“vi 文件名”命令。
启动vi时,处于命令状态,不能够输入字符,只能输入命令: a:“新增文本”(即Append)命令,执行后将进入输入模式,在当前光标之后新增文本。
I:“插入文本”(即Insert)命令,执行后将进入输入模式,在当前光标位置处新增文本。
d+d:“删除一行”命令。
x:“删除当前字符”命令。
P:“粘贴”命令,将复制的内容粘贴在目前光标所在的位置,若复制内容为整行文字,则会粘贴在光标所在位置的下一行。
:q:“退出vi”命令,不过如果在执行这个命令之前修改过内容,则无法退出。
:q!:“不存盘退出”命令,即是放弃所有的修改,强行退出。
:w:“存盘”命令。
:wq:“存盘退出”命令。
当我们使用“a”或“I”命令进行输入模式后,如果要回到命令模式,只需按一下ESC键即可。
注:现在的桌面系统可使用命令:sudo gedit 文件名 对文件进行图形化界面编辑(代替VI)。

2、Linux环境下的gcc的使用
格式:gcc [选项][要编译的源程序文件名]
当不用任何选项编译一个程序时,gcc将会生成(假定编译成功)一个名为a.out的可执行文件。例如:下面的命令将在当前目录下产生一个叫a.out的文件:
gcc mytest.c
可以用-o编译选项为将产生的可执行文件指定一个文件名来代替a.out,例如,将一个叫mytest.c的C程序编译为名叫mytest的可执行文件:
gcc –o mytest mytest.c
注意,当使用-o选项时,-o后面必须跟一个文件名。
例如:显示“hello,test world”的程序test.c如下:
#include <stdio.h>
int main
{ printf(“hello,test world\n”);
}
在命令行上输入以下命令,编译和运行该程序并观察输出。
gcc –o test test.c
./test(注意:./test表示执行test文件)
为了更好的理解gcc的工作过程,可以把以上的编译过程分为几个步骤进行观察:
(1)gcc –E test.c –o test.i
-E可以使gcc在预处理后停止编译,并生成test.c文件,如果观察test.i文件的内容,会发现stdio.h上的内容和其它被预处理的文件都被包含进来;
(2)gcc –c test.i –o test.o
-c选项将test.i编译为目标代码,由于gcc识别.i为预处理后的c语言文件,因此gcc将自动跳过预处理步骤而开始执行编译过程。
(3)gcc –o testo test.o
把目标代码test.o生成了可执行文件,并用-o指定可执行文件名为testo。
gcc中常用选项及其含义
-c :只预处理、编译和汇编源程序,不进行连接,为每个源程序生成一个目标代码;
-o file :指定输出的文件名为file,当不指定时,默认的文件名是a.out;
-g :在可执行程序中包含标准调试信息,以利于以后的调试工作;

实验步骤:

1、使用gcc编译并运行程序
(1)先用vi编辑hello.c文件,内容如下:

(2)gcc指令的一般格式为:gcc [选项] 要编译的文件 [选项] [目标文件]
例:使用gcc编译命令,编译hello.c生成可执行文件hello,并运行hello

上面的命令一步由.c文件生成了可执行文件,将gcc的四个编译流程:预处理、编译、汇编、连接一步完成,下面将介绍四个流程分别做了什么工作
(3)-E选项的作用:只进行预处理,不做其他处理。
例:只对hello.c文件进行预处理,生成文件hello.i,并查看

通过查看可以看到头文件包含部分代码#include <stdio.h>经过预处理阶段之后,编译器已将stdio.h的内容贴了进来。
(4)-S选项的使用
-S选项的作用:只是编译不汇编,生成汇编代码
例:将hello.i文件只进行编译而不进行汇编,生成汇编代码hello.s

(5)-c选项的使用
-c选项的作用:只是编译不连接,生成目标文件.o
例:将汇编代码hello.s只编译不链接成hello.o文件

(6)将编译好的hello.o链接库,生成可执行文件hello,并运行文件。

2、使用gdb调试程序
1、先用vi(gedit)编辑文件test.c用于gdb调试器调试,内容如下
#include <stdio.h>
int main(void)
{
int sum(int sum);
int i,result=0;
sum(100);
for(i=1;i<=100;i++){
result+=i;
}
printf(“The sum in main function is %d\n”,result);
return 0;
}
int sum(int num)
{
int i,n=0;
for(i=0;i<=num;i++){
n+=i;
}
printf(“The sum in sum function is %d\n”,n);
}

(2)将test.c文件编译成包含标准调试信息的文件test

(3)启动gdb进行调试

可以看到gdb启动界面中显示了gdb的版本、自由软件等信息,然后进入了有”gdb”开头的命令行界面。
也可使用如下命令打开调试文件。

先使用 #sudo gcc –g test.c –o test
#gdb –tui

然后在命令行中输入: (gdb)file test,就可以看到输入的程序文件了。
(4)l(list)命令
l命令用于查看文件

可以看到每行代码面前都有对应的行号,这样方便我们设置断点。
(5)b(breakpoint)命令
b用于设置断点,断点调试时调试程序的一个非常重要的手段,设置方法:在”b”命令之后加上对应的行号,如下图

在gdb中可以设置多个断点。代码运行时会到断点对应的行之前暂停,上图中,代码就会运行到第7行之前暂停(并没有运行第7行)。
(6)info命令
info命令用于查看断点情况,设置好断点后可以用它来查看

(7)(run)命令
r命令用于运行代码,默认是从首行开始运行,也可以在r后面加上行号,从程序中指定行开始运行。

可以看到程序运行到断点处就停止了
(8)p(print)命令
p命令用于查看变量的值,在调试的时候我们经常要查看某个变量当前的值与我们逻辑设定的值是否相同,输入p+变量名即可

可以看到result在第6行已被赋值为零,而i目前还没有被赋值所以是一个随机数,在主函数里看不到num的值,只有进入子函数才能看到
(9)s(step)命令
s命令用于单步运行,另外n(next)命令也用于单步运行,他们的区别在于:如果有函数调用的时候,s会进入该函数而n不会进入该函数。

可以看到进入了sum子函数,这时候就能看到num的值为100。
(10)n(next)命令
n命令用于单步运行,下面是n命令的使用:

和s命令的运行效果对比会发现,使用n命令后,程序显示函数sum的运行结果并向下执行,而使用s命令后则会进入到sum函数之中单步运行
(11)finish命令
finish命令用于运行程序,直到当前函数结束。例如我们进入了sum函数,使用finish命令的情况

当我们调试的时候如果觉得某个函数存在问题,进入函数调试之后发现问题不在这个函数,那么我们就可以使用finish命令运行程序,知道当前函数结束。
(12)q(quit)命令
q命令用于退出gdb调试器

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值