2 Linux编程工具

Download Report

Transcript 2 Linux编程工具

操作系统接口编程——GNU/Linux编程
第1讲 Linux编程工具包
主讲: 贺金平
TM 版权所有
西南林学院计算机系 贺金平
1
本讲内容目录

1 Linux历史与版本

2 Linux操作系统安装

3 Linux常用命令

4 vi 编辑器

5 使用GNU CC(gcc)

6 Make管理项目

7 autotools

8 RCS与CVS版式本控制

9 GDB调试

10 出错处理

11使用库
西南林学院计算机系 贺金平
TM
2
2
1.1 Linux历史与版本

Linux是一种类Unix操作系统,是一个完全免费的操作系统

Linux最早是Linus Torvalds (李纳斯·托沃兹 )于1991年在
芬兰赫尔辛基大学原创开发的,并在GNU的GPL(General
Public License)原则下发行。

GNU:为推广自由软件的精神而实现一个自由的操作系统,然
后从应用程序开始,实现其内核.linux优良的内核性能使
GNU采用了linux内核并进行开发。

GPL:通用公共协议,是一个开放而又严格的许可协议,它规定
了源码必须可以无偿的获得且可修改.

Linux又称为GNU/linux,其中许多重要的工具如gcc、gdb
、make、emacs等都是GNU贡献的
西南林学院计算机系 贺金平
TM
3
3
1.2 linux的发行版本

Linux内核版本有两种:稳定版和开发版。

Linux内核的命名机制:内核版本由3部分数字构成的(主
版本号.次版本号. 修订版本号,例如:2 . 4 . 18 )

如果次版本号是偶数,那么该内核就是稳定版;若是奇数
,则是开发版。

*查看内核版本命令:cat /proc/version 或 cat /etc/issue
或 uname -a

到目前为止,linux发行版本已超过250多种,内核也从原
来的0.01发展到现在的2.6.x.x
西南林学院计算机系 贺金平
TM
4
4
国内外主要发行版本
国外:
1.Red Hat Linux (fedora
Linux)
国内:
1.红旗 Linux
2.SuSE Linux
2.中标普华 Linux
3.Debian Linux (Ubuntu
Linux)
3.共创 Linux
4.Mandrake Linux
4.冲浪 Linux
5. 蓝点 Linux
5. Gentoo Linux
西南林学院计算机系 贺金平
TM
5
5
2 Linux操作系统安装

2.1 Linux系统安装

2.2 WMware虚拟机安装

2.3 虚拟机工具(wmtools)安装

2.4 设定共享目录
西南林学院计算机系 贺金平
TM
6
6
2.1 Linux系统安装

安装光盘:red hat linux安装光盘有三张,可在网上下载
ISO文件

分区:red hat linux安装至少要三个分区:启动分区
(/boot)、交换分区(swap)、根分区(/)

SWAP分区:linux在硬盘上划出一个区域来当作临时内存
,相当于windows系统中的虚拟内存,一般将其设为内存
大的2倍

Grub:linux系统的引导装载器。

Root权限:linux是一个多用户操作系统。Root是超级用户

安装硬件要求:硬盘空间建议大于3G,内存建议大于256M
西南林学院计算机系 贺金平
TM
7
7
Linux安装步骤及注意事项

安装步骤:详见安装图解

注意事项:



作为嵌入式系统开发,建议在VMware Workstation软件中安
装虚拟机,硬盘空间建议6G~12G
分区时选择手动分区
安装过程中,切记root用户的密码
西南林学院计算机系 贺金平
TM
8
8
2.3 虚拟机及工具(wmtools)安装

安装VMware
Workstation 5.0.0 build13124虚拟机

安装WMware Tools
西南林学院计算机系 贺金平
TM
9
9
安装WMware Tools

如果不安装此工具包,鼠标进入到虚拟机后,要按下
CTRL+ALT组合键 才能将鼠标退出到windows系统,操作
起来比较麻烦。

安装方法如下:
西南林学院计算机系 贺金平
TM
10
10
安装方法如下
#tar zxf vmware-linux-tools.tar.gz
#cd vmware-linux-tools
//注:此工具包在安装光盘中就有
//进入解压后的目录
#./vmware-install.pl (运行安装脚本)
这时install提示你是否需要备份以前的配置文件,建议选择"y"
vmware安装完成之后:
#service vmware-tools start
//启动vmware-tools服务
运行vmware-config.pl的时候,会有一步是询问内核的头文件在哪里,
解决方法从安装光盘中copy kernel-xen-devel-2.6.18-8.el5.i686.rpm
# rpm -ivh kernel-xen-devel-2.6.18-8.el5.i686.rpm
重新执行vmware-config.pl,可以解决这个问题。
西南林学院计算机系 贺金平
TM
11
11
2.4 设定共享目录
西南林学院计算机系 贺金平
TM
12
12
西南林学院计算机系 贺金平
TM
13
13
查看共享目录

共享设置完毕后,linux系统中会有
# /mnt/hgfs/hjp/
此目录,把windows中的文件拷贝到E:\vmshare目录,再
去虚拟机的/mnt/hgfs/hjp看看文件是否在那里了,如果操
作无误,则共享目录设置成功。
西南林学院计算机系 贺金平
TM
14
14
3 Linux常用命令
//进入上一级目录

#cd ..

#ls -l

#mkdir filepath
//建立目录

#rm –rf filepath
//删除目录

#touch helloworld.c

#cp helloworld.c /root/hello.c

#cp –a filepath /root

#mv helloworld.c /root/hello.c

# rm –f helloworld.c
ls -a
西南林学院计算机系 贺金平
//显示文件-l详细,-a显示隐藏
vi helloworld.c //建立新文件
//拷贝文件并改名
//拷贝目录(带链接)
//移动文件并改名
//删除文件
TM
15
15
Linux常用命令(续)

#find . –name hello.c
//在当前目录及子目录查找文件

#grep –R “printf” .
//查看当前目录中包含printf的文件

#file helloworld.c

#uname –r
//显示当前内核版本

#who
//显示当前登录用户

#tar zxvf filepath.tar.gz

#tar zcvf filepath.tar.gz filepath

#tar jxvf filepath.tar.bz2

#tar jcvf filepath.tar.bz2 filepath
西南林学院计算机系 贺金平
//显示文件属性
//解压.tar.gz文件
//压缩.tar.gz
//解压.tar.bz2文件
TM
//压缩.tar.bz2
16
16
Linux常用命令(续)
//显示文件内容

#cat hello.c

#chmod 755 hello //为hello文件设置权限

#pwd

#mount

#unmount

#export
//声明环境变量

#exit
//关闭当前终端

#man find

#help
西南林学院计算机系 贺金平
//查看当前目录的绝对路径
//挂载设备到目录
//卸载
TM
17
17
Linux常用命令(续)

#insmod //加载模块

#lsmod
//查看已加载模块

#rmmod
//卸载模块

#ps –e
//查看当前所有运行的进程

#kill
//结束某进行

#reboot
//重启系统

#halt
//关机

#ifconfig //查看(配置)IP地址

#ping
西南林学院计算机系 贺金平
TM
18
18
4 vi编辑器

Vi是一个高级文本编辑器。它可以执行输出、删除、查找、
替换等众多文本操作而且用户可以根据自己的需要对其进
行定制,这是其他编辑程序所没有的。

Vi有三种基本工作模式:命令行模式,文本输入模式,末行
模式。
西南林学院计算机系 贺金平
TM
19
19
Vi三种工作模式

命令行模式:不管处于何种模式,只要按一下ESC键即可
使vim进入命令行模式;此时从键盘上输入的任何字符都被
当作编辑命令来解释。

文本输入模式:在命令模式下输入插入命令i等都可以进入
文本输入模式;在该模式下输入的任何字符都被当做文件
内容保存起来。

末行模式:在命令模式下按“: 键”即可进入末行模式;此
时会在显示窗口的末行显示一个冒号作为末行模式的提示
符,等待用户输入命令。
西南林学院计算机系 贺金平
TM
20
20
vi的进入与退出

进入vi:在shell模式下键入vi及需要编辑的文件名即可。例
如:vi example.txt

退出vi:首先按ESC键进入命令模式,然后输入:进入末行
模式,末行模式下输入q直接退出;wq(或x)保存后退出
;q!不保存强制退出。
西南林学院计算机系 贺金平
TM
21
21
光标移动操作

vi 中的光标移动既可以在命令模式,下也可以在文本输入
模式下。

在文本输入模式下可直接使用键盘上的四个方向键移动光
标。

在命令模式下除了使用四个方向键还可以用h(左)、l(右
)、j(上)、k(下)这四个键来移动光标。(熟练后可以
达到手不离键,从而提高工作效率)

快速移动命令:0(零)光标移到行首;$光标移到行尾;
nG光标移到第n行;H光标移到屏幕上显示的第一行;L光
标移到屏幕上显示的最后一行;M光标移到屏幕的中间一行
。
西南林学院计算机系 贺金平
TM
22
22
文本插入操作

1. 插入命令:i命令,插入文本从光标所在位置前开始,屏
幕末行显示“--INSERT --”提示字样。I 移到该行行首,在
其前插入文本。

2. 附加命令:a命令,该命令用于在光标当前所在位置之后
追加新文本,新输入的文本被放在光标之后。A 移到行尾,
在其后插入文本。

3. 添行命令:o命令,该命令将在光标所在行的下面新开一
行,并将光标置于该行的行首,等待输入文本;O 是在光
标所在行的上面插入一行。
西南林学院计算机系 贺金平
TM
23
23
文本修改操作

1. 文本删除/移动;

删除单个字符:x删除光标处的字符;nx删除从光标所在位
置开始向右的n个字符;X删除光标前面的那个字符; nX删
除从光标前面开始向左的n个字符。

删除多个字符:dd删除光标所在的整行;dw删除一个单词
;d0删除从光标前一个字符开始到行首的内容;d$(或D)删
除从光标所在处开始到行尾的内容。

2. 文本复制命令;yy复制光标所在的整行,可以使用p命令
粘贴。(dd类似与剪切)

3. 撤销与重做命令:u支持多次撤销,U单次撤销。在命令
模式下按“.”(点号)键既可重做。
西南林学院计算机系 贺金平
TM
24
24
文本搜索与替换
1. 模式搜索命令:
“/”命令,从光标位置向文件尾部搜索键入的模式,搜索下一
个匹配使用n,搜索上一个匹配使用N;
“?”命令,从光标位置向文件头部搜索。
2. 文本替换命令:(必须在末行模式下操作)
:s/text1/text2 将光标所在段落搜索到的第一个text1替换为
text2;
:s/text1/text2/g 将光标所在段落的所有text1替换为text2;
:1,$s/text1/text2/g 替换所有符合条件的字符( 1,$ 表示搜索
范围是从首行到末行)
西南林学院计算机系 贺金平
TM
25
25
5 使用GNU CC(gcc)编译器

GNU CC(简称为Gcc)是GNU项目中符合ANSI C标准的编
译系统,能编译C、C++等语言编写的程序。
西南林学院计算机系 贺金平
TM
26
26
GCC编译流程解析

GCC编译流程分为4个步骤:
(1)预处理(pre-processing)
(2)编译(compiling)
(3)汇编(assembling)
(4)链接(linking)
GCC指令的一般格式:
Gcc [选项] 源文件 [选项] 目标文件
其中,目标文件可缺省,Gcc默认生成可执行的文件,名为”编译文件
.out”
西南林学院计算机系 贺金平
TM
27
27
GCC例子

Helloworld.c程序(vi编译器编辑程序):
#include <stdio.h>
Int main(){
printf(“hello,this is our embedded world!\n”);
return 0;
}

编译: gcc helloworld.c –o helloworld.o

运行: ./helloworld.o
西南林学院计算机系 贺金平
TM
28
28
GCC编译选项分析(1)
西南林学院计算机系 贺金平
TM
29
29
GCC编译选项分析(2)
西南林学院计算机系 贺金平
TM
30
30
GCC编译选项分析(3)
西南林学院计算机系 贺金平
TM
31
31
6 Make管理项目

6.1 Make工程管理器

6.2 Makefile文件格式及规则
西南林学院计算机系 贺金平
TM
32
32
6.1Make工程管理器

Make工程管理器:顾名思义,是指管理较多的文件的。如
果一个应用要涉及很多个程序文件,手工用GCC一个个去
编译将是一件很麻烦的事情;另外,编译一次后,根据需
要如果只部分程序做了改动,则应只需重新编译改过后的
文件,人们希望有一个工程管理器能自动识别更新了的文
件代码,同时又不需要重复输入冗长的命令长,于是,
make工程管理器就应运而生了。
西南林学院计算机系 贺金平
TM
33
33
6.2 Makefile文件格式及规则

Makefile是make读入的惟一的配置文件,本节要讲的实际上就是
makefile文件的编写规则。

一个Makefile中通常包含如下内容:




需要由make工具创建的目标体(target),通常是目标文件或可执行文件
要创建的目标体所依赖的文件(dependency_file)
创建每个目标体时需要运行的命令(command)
Makefile是格式为:
target : dependency_file
command
注意: (1)每个command前必须有Tab符
(2)Makefile中使用”#” 注释程序
西南林学院计算机系 贺金平
TM
34
34
一个简单的例子
#the simplest example
Hello.o:hello.c hello.h
gcc –c hello.c -o hello.o
注意:gcc前是一个tab符
西南林学院计算机系 贺金平
TM
35
35
Makefile中使用变量

为了简化编辑和维护Makefile,允许在Makefile中创建和使
用变量,变量是在Makefile中定义的名字,用来代替一个文
本字符串,该文本字符串称为该变量的值。在具体要求下
,这些值可以代替目标体、依赖文件、命令以及Makefile文
件中的其他部分。

Makefile中的变量有两种方式:递归展开方式和简单方式。
递归展开方式是指定义的变量又在引用其他的变量,在使
用该变量时一次性将内嵌的变量全部展开,这种方式的缺
点是有时会导致变量的循环引用。简单展开方式定义的变
量在定义处展开,并且只展开一次,因此它不含任何其他
变量的引用。
西南林学院计算机系 贺金平
TM
36
36
关于变量名

递归展开方式为: VAR=var

简单展开方式为: VAR:=var

Make中引用变量均使用格式:

变量名是不包括”:”、”#”、“=”结尾空格的任何字符。同
时变量名中包含字母、数字和下划线以外的情况尽量避免
,因为它们可能存在特定的含义

变量名是区分大小写的。即foo和Foo代表不同的变量。
西南林学院计算机系 贺金平
$(VAR)
TM
37
37
例子:Makefile中使用变量
OBJS=he.o jin.o ping.o
CC=gcc
CFLAGS=-Wall –o –g
Hjp:$(OBJS)
$(CC) $(OBJS) -o hjp
He.o: he.c he.h
$(CC) $(CFLAGS) –c he.c –o he.o
Jin.o:jin.c jin.h
$(CC) $(CFLAGS) –c jin.c –o jin.o
Ping.o : ping.c ping.h
$(CC) $(CFLAGS) –c ping.c –o ping.o
西南林学院计算机系 贺金平
TM
38
38
Makefile变量的分类

Makefile中的变量分为用户自定义变量、预定义变量、自动变量及
环境变量。

上例中OBJS就是用户自定义变量,由用户自行设定,而预定义变
量和自动变量为通常在Makefile中都会出现的变量,其中部分有默
认值,当然用户也可以对其进行修改。

自动变量:由于常见的GCC编译语句中通常包含了目标文件和依
赖文件,为了简化Makefile的编写,就引入了自动变量。自动变量
通常可以代表编译语句中出现的目标文件和依赖文件,并且具有本
地含义(即下一语句出现的相同变量代表的是下一句的目标文件和
依赖文件)

环境变量:系统自动读取当前系统环境变量。如果用户自定义变量
与之重名,则用户自定义变量将覆盖同名的环境变量.
西南林学院计算机系 贺金平
TM
39
39
Makefile中常见的预定义变量
西南林学院计算机系 贺金平
TM
40
40
Makefile中常见的自动变量
西南林学院计算机系 贺金平
TM
41
41
例子:自动变量使用
OBJS=he.o jin.o ping.o
CC=gcc
CFLAGS=-Wall –o –g
Hjp:$(OBJS)
$(CC) $(OBJS) -o hjp
He.o: he.c he.h
$(CC) $(CFLAGS) –c $^ –o $@
Jin.o:jin.c jin.h
$(CC) $(CFLAGS) –c $< –o $@
Ping.o : ping.c ping.h
$(CC) $(CFLAGS) –c $< –o $@
西南林学院计算机系 贺金平
TM
42
42
Makefile规则

Makefile规则是make进行处理的依据,它包括了目标体、
依赖文件及其之间的命令语句。一般来说,Makefile中的一
条语句就是一个规则。如上例中都显示地指出了Makefile中
的规则关系,如“$(CC) $(CFLAGS) –c $^ –o $@“,为了
简化Makefile的编写,make还定义了隐式规则和模式规则
。
西南林学院计算机系 贺金平
TM
43
43
(1)隐式规则

隐式规则能告诉make怎样使用传统的技术完成任务,当用
户使用它们时不必详细指定编译的具体细节,而只需把目
标文件列出即可。Make会自动搜索隐式规则目录来确定如
何生成目标文件。

上例可写成:
OBJS=he.o jin.o ping.o
CC=gcc
CFLAGS=-Wall –o –g
Hjp:$(OBJS)
$(CC) $^ -o $@
西南林学院计算机系 贺金平
TM
44
44
为什么可以省略后面几句?

因为make的隐式规则指出:所有的”.o”文件都可自动由
”.c”文件生成,使用命令:
$(CC) $(CPPFLAGS) $(CFLAGS) –c file.c –o file.o
这样he.o、jin.o、ping.o就会分别调用如下生成:
$(CC) $(CFLAGS) –c he.c –o he.o
$(CC) $(CFLAGS) –c jin.c –o jin.o
$(CC) $(CFLAGS) –c ping.c –o ping.o

隐式规则只能查找到相同文件名的不同后缀名文件,如he.o文件必须
由he.c文件生成
西南林学院计算机系 贺金平
TM
45
45
Makefile中常见的隐式规则目录
西南林学院计算机系 贺金平
TM
46
46
(2)模式规则

模式规则是用来定义相同处理规则的多个文件的。它不同于隐式规则,隐式
规则仅仅能够用make默认的变量来进行操作,而模式规则还能引入用户自定
义变量,为多个文件建立相同的规则,从而简化Makefile的编写。

这个规则的相关文件前必须用”%”标明。

使用模式规则修改上例为如下:
OBJS=he.o jin.o ping.o
CC=gcc
CFLAGS=-Wall –o –g
Hjp:$(OBJS)
$(CC) $^ -o $@
%.o : %.c
$(CC) $(CFLAGS) –c $< -o $@
西南林学院计算机系 贺金平
TM
47
47
Make管理器的使用

Make使用时其后输入目标名即可建立指定的目标,如果直
接运行make,建立Makefile中的第一个目标。Make命令有
丰富的选项以完成不同的功能。
西南林学院计算机系 贺金平
TM
48
48
例子

/*main.c*/

#include "mytool1.h"

#include "mytool2.h"

int main(){

mytool1_print("hello");

mytool2_print("hello");

}
西南林学院计算机系 贺金平
TM
49
49

/*mytool1.h*/

#ifndef _MYTOOL_1_H

#define _MYTOOL_1_H

void mytool1_print(char *print_str);

#endif

/*mytool2.h*/

#ifndef _MYTOOL_2_H

#define _MYTOOL_2_H

void myrootl2_print(char *print_str);

#endif
西南林学院计算机系 贺金平
TM
50
50

/*mytool1.c*/

#include "mytool1.h"

void mytool1_print(char *print_str){

printf("This is mytool1 print %s\n",print_str);

}

/*mytool2.c*/

#include "mytool2.h"

void mytool2_print(char *print_str){


printf("This is mytool2 print %s\n",print_str);
}
西南林学院计算机系 贺金平
TM
51
51
编写Makefile文件

#this is Makefile

main:main.o mytool1.o mytool2.o









gcc -o main main.o mytool1.o mytool2.o
main.o:main.c mytool1.h mytool2.h
gcc -c main.c
mytool1.o :mytool1.c mytool1.h
gcc -c mytool1.c
mytool2.o:mytool2.c mytool2.h
gcc -c mytool2.c
clean:
rm -f *.o main
西南林学院计算机系 贺金平
TM
52
52
简化后的Makefile文件

#this is Makefile

main:main.o mytool1.o mytool2.o









gcc -o $@ $^
main.o:main.c mytool1.h mytool2.h
gcc –c $<
mytool1.o :mytool1.c mytool1.h
gcc –c $<
mytool2.o:mytool2.c mytool2.h
gcc –c $<
clean:
rm -f *.o main
西南林学院计算机系 贺金平
TM
53
53
再次简化后的Makefile文件

#this is Makefile

main:main.o mytool1.o mytool2.o





gcc -o $@ $^
%.o:%.c %.h
gcc –c $<
clean:
rm -f *.o main
西南林学院计算机系 贺金平
TM
54
54
7 autotools使用

上一节中,我们了解到Makefile可以帮助make完成它的使
命,但要承认的一点是,编写Makefile确实不是一件容易的
事,特别是较大的项目更是如此。那么有没有一种轻松的
手段生成Makefile而同时又能让用户享受make的优越性呢
?

本节讲到的autotools系列工具正是为此而设计的,它只需
用户输入简单的目标文件、依赖文件、文件目录等就可以
轻松地生成Makefile了,这无疑是广大用户所希望的。
西南林学院计算机系 贺金平
TM
55
55
Autotools系列工具

首先要确认系统是否安装了以下工具(可用which命令查看
)






Autoscan
Aclocal
Autoconf
Autoheader
Automake
具体使用方法见:autotools使用.doc
西南林学院计算机系 贺金平
TM
56
56
8 RCS与CVS版本控制
版本控制是指跟踪和管理源代码文件变化的自动过程。
主要应用在多人协作完成一个项目时,实现程序的集中化
管理。便于项目的整体控制、单元调试和整体调试。

8.1 RCS版本控制

8.2 CVS版本控制
西南林学院计算机系 贺金平
TM
57
57
8.1 RCS版本控制

RCS版本控制主要涉及两个命令:ci 和 co
概念理解

检入: 把修改后的程序上传到服务器

检出:把服务器上的程序下载到客户端
西南林学院计算机系 贺金平
TM
58
58
RCS版本控制例子
例:A用户和B用户都在操作包含yo.c文件的一个项目;
A操作:

# ci -i yo.c //(初次)检入文件 得到ci.c,v工作文件 V1.1

#co –l yo.c //检出文件

修改文件yo.c,保存退出

#ci yo.c
//检入后得到yo.c的第二个版本V1.2: ci.c,v
B操作:

#co –l yo.c

修改文件yo.c,保存退出

#ci yo.c
//检入后得到yo.c的第三个版本V1.3: ci.c,v
西南林学院计算机系 贺金平
TM
59
59
RCS版本控制:注意事项
注意事项

1 不要删除yo.c,v工作文件;

2 检出时须加上-l参数,否则修改的将会是只读文件,而且
修改完以后不能检入;

3 如果检出时忘记加-l参数了,可直接将yo.c删除,重新带
参数检出;

4 如果对方正检出并打开文件在修改,自已不能再次检出,
只能以只读方式打开。如果操作不慎,可能会产生交换文
件(.swp),注意交换文件是隐藏文件,通过ls –a查看,最
好将其删除。
西南林学院计算机系 贺金平
TM
60
60
8.2 CVS版本控制

CVS是建立在RCS基础之上的,是对RCS的功能扩展。

CVS优点:

1 比RCS更适合于管理多目录的项目

2 能处理分布式项目。分别处理地理位置不同的多名开发人
员在访问和操作同一个代码库。
而RCS通过其加加锁机制,一个时刻只能允许一个人编辑
某个文件,CVS却没有这样的限制。
注意:CVS版本控制不能以root用户进行操作,否则不能检入
(即cvs commit file会失败)
西南林学院计算机系 贺金平
TM
61
61
(CVS)具体方法如下:

创建源代码库,用cvs init初始化该库。
#cvs –d $HOME/cvs init

设置环境变量

#export CVSROOT=$HOME/cvs

源码导入cvs

#cd c08

#cvs import –m “ok” c08 lpu2 start
西南林学院计算机系 贺金平
TM
62
62
(CVS)具体方法(续)

#ls $CVSROOT/c08 –l

#cd ..

#mv c08 c09

#cvs checkout c08

#rm –rf c09

修改c08中的文件,完毕后保存,退出。

#cvs update //查看更新的文件
M yo.c

//见如下提示,说明yo.c有改动
#cvs commit yo.c
西南林学院计算机系 贺金平
//检出
//检入
TM
63
63
9 GDB调试

GDB功能:对程序进行跟踪调试。

1 能判断是程序出错的行数

2 能设置断点(增加和删除断点、按行或按函数名设置断点
、按条件设置断点)

3 能单步调试程序(即单步运行)

4 能实时打印变量的值

5 能显示变量的数据类型,函数的返回值类型

6 程序运行中能设置变量的值
西南林学院计算机系 贺金平
TM
64
64
示例:

以debugme.c程序为例

编译程序: #gcc debugme.c –o debugme -g

注意:加上-g参数是为了在debugme目标文件中加入调试
信息,以便于GDB调试

开始GDB调试
# gdb debugme

结束GDB调试
(gdb)quit
西南林学院计算机系 贺金平
TM
65
65
具体方法

1 判断是程序出错的行数:如果程序中有段错误,则程序会
自动显示出错误的行数。

2 设置断点
按行添加断点 (gdb) break 24
//在程序24行中添加断点
按函数名添加断点 (gdb) break func //func函数处设断点
按条件设置断点 (gdb) break 24 if i==15 //24行代码中如果
i=15,则程序停在此断点处
查点断点信息 (gdb) info break
删除断点
西南林学院计算机系 贺金平
//每个断点都会有个编号
//n为第几个断点
(gdb) delete n
TM
66
66
具体方法(续)

3 单步调试程序(即单步运行) (gdb) step

4 能实时打印变量的值
(gdb) print i
//显示变量i的值
(gdb) print ary[0]@10

//显示ary[0]至ary[10]的值
5 能显示变量的数据类型,函数的返回值类型
(gdb)whatis i
//显示变量i的数据类型
(gdb)whatis ary //显示数组ary的数据类型
(gdb)whatis func //显示函数func的返回类型

6 程序运行中能设置变量的值

(gdb) set variable i=10
西南林学院计算机系 贺金平
TM
67
67
10 出错处理

程序中对库函数以及用户函数的调用设置错误检测,确保
函数调用返回值错误导致程序异常中止时能向用户报告出
错信息。

本节将简要介绍一下出错处理函数。
西南林学院计算机系 贺金平
TM
68
68
10.1 assert宏

#include <assert.h>

Void assert(int expression);

作用:先计算表达式expression,如果其值为假(0),那么它
首先向stderr打印一条出错信息,然后通过abort函数来终
止程序运行。

示例见教材P123 例9.1
西南林学院计算机系 贺金平
TM
69
69
__LINE__和__FILE__宏

作用:提示用户程序出错的行。

详见教材P125 例9.2,9.3,9.4
西南林学院计算机系 贺金平
TM
70
70
标准库函数

#stdlib.h
void abort(void);

#stdlib.h
void exit(int status);

#stdlib.h
int atexit(void (*fcn)(void));

#stdio.h
void perror(const char *s);

#string.h
char *strerror(int errnum);

#errno.h
int errno;

这些函数的作用基本上都是提示出错信息的。具体用法就
不讲了,自已去看书上的例子,或要用到的时候再去网上
查个示例程序就知道了。这里主要看看errno的常见值及其
含义。
西南林学院计算机系 贺金平
TM
71
71
Error常见值(教材P129 表9.1)

EPERM
1
操作不被允许

ENOENT
2
文件或目录不存在

ESRCH
3
进程不存在

EINTR
4
系统调用中断

EIO
5
I/O错误

ENXIO
6
设备或地址不存在

E2BIG
7
参数太长

EBADF
9
错误的文件号

ECHILD
10
子进程不存在

EAGAIN
11
重试

ENOMEM
12
没有内存

EACCES
13
没有权限

EFAULT
14
西南林学院计算机系 贺金平
地址错误
TM
72
72
Error常见值(续)

EBUSY
16
设备或资源忙

EEXIST
17
文件存在

ENODEV
19
设备不存在

ENOTDIR
20
不是目录

EISDIR
21
目录

EINVAL
22
无效参数

EMFILE
24
打开的文件太多

ENOTTY
25
不是打印机

EFBIG
27
文件太大

ENOSPC
28
磁盘上没有空间

EPIPE
32
管道中断

EDOM
33
数学参数超出函数定义域

ERANNGE
34
数学结果不可表示

EILSEQ
84
非法字节序列

ERESTART 85
中断的系统调用应该重启

EUSERS
用户数太多
87
西南林学院计算机系 贺金平
TM
73
73
11使用库

编程库有两个主要优点:它们能够实现代码重用。
本节将介绍以下内容:

11.1 命名和编号约定

11.2 库操作工具

11.3 环境变量和配置文件

11.4 编写并使用静态库

11.5 编写并使用共享库
西南林学院计算机系 贺金平
TM
74
74
11.1 命名和编号约定

约定1:库名都以lib开头

约定2:静态库以.a结尾;共享库以.so结尾

约定3:版本约定。
示例libgdbm.so.2.1.0
库名:libgdbm.so
主版本号:2
次版本号:1
补丁号:
0 (又名:发行号)
西南林学院计算机系 贺金平
TM
75
75
约定3 补充说明

当库的变化达到了和以前的版本不能兼容时,要增加主版
本号;

当库有了新变化,但能和以前的版本兼容时,要增加次版
本号;

修正库中错误而进行的改动时,改变补丁号;
西南林学院计算机系 贺金平
TM
76
76
11.2 库操作工具

1 nm命令
功能:例出编入目标文件或二进制文件的所有符号。可查
看程序调用了什么函数;也可查看一个给定的库或目标文
件是否提供了所需的函数。
用法: nm fileName

2 ar命令
功能:创建静态库
用法: ar rcs
西南林学院计算机系 贺金平
liberr.a liberr.o
TM
77
77
库操作工具(续)

3 ldd命令
功能:例出程序正常运行所依赖(需要)的共享库
用法: ldd fileName

4 ldconfig命令
功能:创建和维护对最新版本共享库的链接
用法: ldconfig libs
西南林学院计算机系 贺金平
TM
78
78
11.3 环境变量和配置文件

动态链接器/加载器ld.so使用两个环境变量。

LD_LIBRARY_PATH
//一般都使用该变量
以冒号分隔的目录清单,在这些目录下可搜索运行时的共
享库
对应配置文件: /etc/ld.so.conf

LD_PRELOAD
以空格分隔的目录清单,它需要在其他所有库加载之前加
载
对应配置文件: /etc/ld.so.preload
西南林学院计算机系 贺金平
TM
79
79
11.4 编写并使用静态库

目的:编译一个静态库,并用测试程序测试该静态库

具体步骤如下:
1 编辑源程序 (liberr.c liberr.h)
2 编译
#gcc –c liberr.c –o liberr.o
3 创建静态库
#ar rcs liberr.a liberr.o
4 缩写测试程序 (errtest.c)
5静态编译测试程序
#gcc errtest.c –o errtest –static –L. –lerr
注:此时可用nm,file查看文件属性
6 运行测试程序
西南林学院计算机系 贺金平
#./errtest
TM
80
80
静态编译选项说明

#gcc errtest.c –o errtest –static –L. –lerr

其中注意红色字体部分
-static是指静态编译
-L. -L是指定库路径,“点”代表当前路径
-lerr -l是指定哪个库,意思是指定去找liberr库
西南林学院计算机系 贺金平
TM
81
81
11.4 编写并使用共享库

目的:编译一个共享库,并用测试程序测试该共享库

具体步骤如下:
1 编辑源程序 (liberr.c liberr.h)
2 编译
#gcc –c liberr.c –o liberr.o
3 链接库
#gcc –shared –W1,-soname,liberr.so –o liberr.so.1.0.0 liberr.o
4 建立符号链接
Ln –s liberr.so.1.0.0 liberr.so.1
Ln-s liberr.so.1.0.0 liberr.so
西南林学院计算机系 贺金平
TM
82
82
5 缩写测试程序 (errtest.c)
6 动态编译测试程序(默认即为动态编译)
#gcc errtest.c –o errtest –L. –lerr
注:此时可用ldd,nm,file查看文件属性
7 运行测试程序
#LD_LIBRARY_PATH=$(pwd) ./errtest
西南林学院计算机系 贺金平
TM
83
83

本章结束,谢谢!
西南林学院计算机系 贺金平
TM
84
84