第6章 常用开发工具.

Slides:



Advertisements
Similar presentations
Tool Command Language --11级ACM班 金天行.
Advertisements

第三章 数据类型和数据操作 对海量数据进行有效的处理、存储和管理 3.1 数据类型 数据源 数据量 数据结构
第1讲 实验环境.
LINUX 环境下程序开发基础 曙光用户培训课程系列 课程时间:1.5小时 更新日期:2008年3月.
小学生游戏.
Oracle数据库 Oracle 子程序.
第11章 gcc的使用与开发.
C语言实验 第一课 标题:学号+姓名.
C++中的声音处理 在传统Turbo C环境中,如果想用C语言控制电脑发声,可以用Sound函数。在VC6.6环境中如果想控制电脑发声则采用Beep函数。原型为: Beep(频率,持续时间) , 单位毫秒 暂停程序执行使用Sleep函数 Sleep(持续时间), 单位毫秒 引用这两个函数时,必须包含头文件
在PHP和MYSQL中实现完美的中文显示
陈香兰 助教:陈博、李春华 Spring 2009 嵌入式操作系统 陈香兰 助教:陈博、李春华 Spring 2009.
EBNF与操作语义 请用扩展的 BNF 描述 javascript语言里语句的结构;并用操作语义的方法描述对应的语义规则
Linux环境下程序编译 曙光信息产业(北京)有限公司.
Linux Programming Prerequisite
Hadoop I/O By ShiChaojie.
EBNF 请用扩展的 BNF 描述 C语言里语句的结构; 请用扩展的 BNF 描述 C++语言里类声明的结构;
第二讲 搭建Java Web开发环境 主讲人:孙娜
学习前的准备工作 讲师:burning.
强连通分量 无向图 1、任意两顶点连通称该图为连通图 2、否则将其中的极大连通子图称为连通分量 A D C B E 有向图
第八章 菜单设计 §8.1 Visual FoxPro 系统菜单 §8.2 为自己的程序添加菜单 §8.3 创建快捷菜单.
陈香兰 助教:陈博、李春华 Spring 2009 嵌入式操作系统 陈香兰 助教:陈博、李春华 Spring 2009.
SVN服务器的搭建(Windows) 柳峰
管理信息结构SMI.
走进编程 程序的顺序结构(二).
辅导课程六.
网络常用常用命令 课件制作人:谢希仁.
DM81X 视频采集处理 ——简单采集显示例程讲解 广州创龙电子科技有限公司
Zhao4zhong1 (赵中) C语言指针与汇编语言地址.
Zhao4zhong1 (赵中) C语言指针与汇编语言地址.
第一单元 初识C程序与C程序开发平台搭建 ---观其大略
第十章 IDL访问数据库 10.1 数据库与数据库访问 1、数据库 数据库中数据的组织由低到高分为四级:字段、记录、表、数据库四种。
第17章 网站发布.
第二章 Java语言基础.
单元测试工具XUnit 任课老师:黄武 下午2时20分 25.
第四章 附件 (应用程序软件包).
中国科学技术大学计算机系 陈香兰(0551- ) Spring 2009
《编译原理与技术》 期末复习 计算机科学与技术学院 郑启龙 李 诚 25/12/2018.
用event class 从input的root文件中,由DmpDataBuffer::ReadObject读取数据的问题
Linux开发环境介绍 简介(二) GDB & Memory Leakage Detection Tools
东软集团(大连)有限公司 SVVD事业部-于忠华
Gzip编译及调试 曹益华
宁波市高校慕课联盟课程 与 进行交互 Linux 系统管理.
C++语言程序设计 C++语言程序设计 第七章 类与对象 第十一组 C++语言程序设计.
第二章 登录UNIX操作系统.
C语言程序设计 主讲教师:陆幼利.
EBNF与操作语义 请用扩展的 BNF 描述 javascript语言里语句的结构;并用操作语义的方法描述对应的语义规则
$9 泛型基础.
第1章 c++概述 1.1 C++语言的简史及特点 1.2 简单的C++程序 1.3 C++语言的基本组成
实验四、TinyOS执行机制实验 一、实验目的 1、了解tinyos执行机制,实现程序异步处理的方法。
VB与Access数据库的连接.
姚金宇 MIT SCHEME 使用说明 姚金宇
工业机器人知识要点解析 (ABB机器人) 主讲人:王老师
成绩是怎么算出来的? 16级第一学期半期考试成绩 班级 姓名 语文 数学 英语 政治 历史 地理 物理 化学 生物 总分 1 张三1 115
第4章 Excel电子表格制作软件 4.4 函数(一).
本节内容 内存复制指令 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群 : 联系电话:
第九节 赋值运算符和赋值表达式.
iSIGHT 基本培训 使用 Excel的栅栏问题
3.16 枚举算法及其程序实现 ——数组的作用.
多层循环 Private Sub Command1_Click() Dim i As Integer, j As Integer
Visual Basic程序设计 第13章 访问数据库
本节内容 C语言的汇编表示 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群 : 联系电话:
Python 环境搭建 基于Anaconda和VSCode.
C++语言程序设计 C++语言程序设计 第一章 C++语言概述 第十一组 C++语言程序设计.
本节内容 动态链接库 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群 : 联系电话:
本节内容 导出表 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群 : 联系电话:
本节内容 进程 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群 : 联系电话:
第四章 UNIX文件系统.
使用Fragment 本讲大纲: 1、创建Fragment 2、在Activity中添加Fragment
顺序结构程序设计 ——关于“字符串”和数值.
编译原理实践 6.程序设计语言PL/0.
Presentation transcript:

第6章 常用开发工具

主要内容 gcc编译系统的概念和使用 gdb程序调试工具的概念和使用 程序维护工具make 的概念和使用

6.1 gcc编译系统 6.1.1 文件名后缀 文件名后缀 文 件 类 型 .c C源文件 .F .fpp .FPP FORTRAN源文件 .i 预处理后的C源文件 .s 汇编程序文件 .ii 预处理后的C++源文件 .S 必须预处理的汇编程序文件 .m Objective-C源文件 .o 目标文件 .mi 预处理后的Objective-C源文件 .a 静态链接库 .h 头文件 .so 动态链接库 .C .cc .cp .cpp .c++ .cxx C++源文件

6.1.2 C语言编译过程 1.预处理阶段 预处理是常规编译 之前预先进行的工作, 故此得名。它读取C语言 源文件,对其中以“#” 开头的指令(伪指令) 和特殊符号进行处理。 主要包括文件包含、宏 定义和条件编译指令。

2.编译阶段 编译程序(Compiler)对预处理之后的输出文件进行词法分析和语法分析,试图找出所有不符合语法规则的部分 3.汇编过程 汇编过程是汇编程序(Assembler)把汇编语言代码翻译成目标机器代码的过程 4.连接阶段 连接程序(Linker)要解决外部符号访问地址问题 连接模式分为静态连接和动态连接

6.1.3 gcc命令行选项 1.预处理选项 ●几个预处理常用选项: 在Linux系统中,C/C++程序编译命令是gcc,例如: $ gcc f1.c f2.c (针对C语言源程序) 执行完成后,生成默认的可执行文件a.out。 1.预处理选项 C语言预处理程序通常称为cpp,它是宏处理程序,由C编译程序自动调用,在真正的编译过程之前对程序进行转换。 ●几个预处理常用选项: -C -D name -D name=definition -U name -I dir -o file -E

2.编译程序选项 gcc编译程序常用选项及其作用 选项格式 功 能 -c 只生成目标文件,不进行连接。用于对源文件的分别编译 -S 功 能 -c 只生成目标文件,不进行连接。用于对源文件的分别编译 -S 只进行编译,不做汇编,生成汇编代码文件格式,其名与源文件相同,但扩展名为.s -o file 将输出放在文件file中。如果未使用该选项,则可执行文件放在a.out中 -g 指示编译程序在目标代码中加入供调试程序gdb使用的附加信息 -v 在标准出错输出上显示编译阶段所执行的命令,即编译驱动程序及预处理程序的版本号

3.优化程序选项 优化程序常用的选项及其作用 选 项 格 式 功 能 -O -O1 功 能 -O -O1 试图减少代码大小和执行时间,但并不执行需要花费大量编译时间的任何优化 -O2 在-O1级别的优化之上,还进行一些额外调整工作——除不做循环展开、函数内联和寄存器重新命名外,几乎进行所有可选优化 -O3 除了完成所有-O2级别的优化之外,还进行包括循环展开和其他一些与处理器特性相关的优化工作 -O0 不执行优化 -Os 具有-O2级别的优化,同时并不特别增加代码大小

4.连接程序选项 连接程序常用的选项及其功能 选 项 格 式 功 能 object-file-name -c -S -E -llibrary 功 能 object-file-name 不以专用后缀结尾的文件名就认为是目标文件名或库名。连接程序可以根据文件内容来区分目标文件和库 -c -S -E 如果使用其中任何一个选项,那么都不运行连接程序,而且目标文件名不应该用做参数 -llibrary 连接时搜索由library命名的库。连接程序按照在命令行上给定的顺序搜索和处理库及目标文件。实际的库名是liblibrary,但按默认规则,开头的lib和后缀(.a或.so)可以被省略 -static 在支持动态连接的系统中,它强制使用静态链接库,而阻止连接动态库;而在其他系统中不起作用 -Ldir 把指定的目录dir加到连接程序搜索库文件的路径表中,即在搜索-l后面列举的库文件时,首先到dir下搜索,找不到再到标准位置下搜索 -Bprefix 该选项规定在什么地方查找可执行文件、库文件、包含文件和编译程序本身数据文件 -o file 指定连接程序最后生成的可执行文件名称为file,不是默认的a.out

Linux下库文件的命名有一个约定,所有的库名都以lib开头。形如: libx.a 其中,x是指定的库名 以.a(归档,archive)结尾的库是静态库,以.so(共享目标,shared object)结尾的库是动态库 生成静态库的方法实际上可分为两步: ① 将各函数的源文件编译成目标文件 ② 使用ar工具将目标文件收集起来,放到一个归档文件中

6.2 gdb程序调试工具 程序中的错误可按性质分为三种: (1)编译错误,即语法错误。 (2)运行错误。 (3)逻辑错误。 查找程序中的错误,诊断其准确位置,并予以改正,这就是程序调试。 程序调试分为人工查错与机器调试。

6.2.1 启动gdb和查看内部命令 当程序执行过程中忽然中止,屏幕上显示××××-core dumped消息,然后显示提示符,其中,××××表示出错原因 为了发挥gdb的全部功能,需要在编译源程序时使用-g选项 。如: $ gcc -g prog.c -o prog (针对C语言源程序prog.c) $ gcc -g program.cpp -o program (针对C++源程序program.cpp) 启动gdb的方法有以下几种: (1)直接使用shell命令gdb (2)以一个可执行程序作为gdb的参数 (3)同时以可执行程序和core文件作为gdb的参数 (4)指定一个进程号PID作为gdb的第二个参数 一旦启动gdb,就显示gdb提示符: (gdb) 并等待用户输入相应的内部命令

启动gdb

breakpoints类中的命令

6.2.2 显示源程序和数据 1.显示和搜索源程序 (1)显示源文件 利用list命令可以显示源文件中指定的函数或代码行 6.2.2 显示源程序和数据 1.显示和搜索源程序 (1)显示源文件 利用list命令可以显示源文件中指定的函数或代码行 list list - list [file:] num list start , end list [file:]function (2)模式搜索 forward-search regexp search regexp reverse-search regexp

2.查看运行时数据 (1)print命令 一般使用格式是 :print [/fmt] exp 当被调试的程序停止时,可以用print命令(简写为p)或同义命令inspect来查看当前程序中运行的数据。 (2)gdb所支持的运算符 ① 用&运算符取出变量在内存中的地址。 如print &i , print &array[i] ② { type }adrexp 表示一个数据类型为type、存放地址为adrexp的数据。 ③ @ 它是一个与数组有关的双目运算符 ④ file :: var 或者 function :: var 表示文件file(或函数function)中变量var的值。

(3)输出格式 在print /fmt exp命令中,“/”之后的fmt是表示输出格式的字母,它由表示格式的字母和表示数据长度的字母组成 。如: 表示格式的字母:o x d u t f a i c s 表示长度的字母: b w h g (4)whatis命令显示出变量的数据类型 (5)x命令可以查看内存地址中数据的值 。其使用格式是: x [/fmt] address (6)display命令可以预先设置一些要显示的表达式。其一般格式是: display [/fmt] exp 要取消对先前设置的某些表达式的自动显示功能,可以使用以下命令: undisplay [disnum] delete display [disnum]

(7)显示函数调用栈信息 显示函数调用栈信息的命令 格 式 功 能 backtrace [n | -n] bt [n | -n] 格 式 功 能 backtrace [n | -n] bt [n | -n] where [n | -n] 打印当前的函数调用栈的所有信息。如果有参数n(正整数),则只打印栈顶上n层帧的信息;如果是- n的形式,则只打印栈底n层帧的信息 frame [n] f [n] 其中,n是栈中帧的编号,从0(表示栈顶)开始递增。如果不带参数,则显示出当前栈帧的信息;如果给出参数n,则选定帧号为n的帧作为当前帧 up [n] 表示向上移动n层栈帧。如果没有参数,则表示向上移动一层 down [n] 表示向下移动n层栈帧。如果没有参数,则表示向下移动一层 info frame info f 显示出当前栈帧的所有信息,如函数地址,调用函数的地址,被调用函数的地址,目前函数的程序语言、函数参数地址及值、局部变量的地址等。

6.2.3 改变和显示目录或路径 (1)directory命令一般格式是: directory [dir] 或者 dir [dir] 6.2.3 改变和显示目录或路径 (1)directory命令一般格式是: directory [dir] 或者 dir [dir] (2)cd命令使用格式为: cd dir (3)path命令使用格式是: path dirs (4)pwd命令 (5)show directories (6)show paths

6.2.4 控制程序的执行 断点(breakpoint),观察点(watchpoint),捕捉点(catchpoint) 它们统称为停止点 6.2.4 控制程序的执行 断点(breakpoint),观察点(watchpoint),捕捉点(catchpoint) 它们统称为停止点 1.设置和显示断点 (1)设置断点:用break命令(其缩写形式为b)设置断点: break linenum break linenum if condition break function break file:linenum break file:function break *address break (2)显示断点 info breakpoints [num] info break [num]

2.设置和显示观察点 (1)设置观察点 watch expr rwatch expr awatch expr (2)显示观察点 info breakpoints info watchpoints 3.设置捕捉点 命令catch的格式是: catch event 另一个命令是tcatch event 4.维护停止点 delete clear disable enable 5.运行程序 run命令的格式: run [args]

6.程序的单步跟踪和连续执行 (1)单步跟踪 实行单步跟踪的命令是step和next,其格式是: step [N] next [N] (2)连续执行 continue,c或fg命令 7.函数调用 call expr return [expr]

6.2.5 其他常用命令 1.执行shell命令 其格式是: shell command-string 2.修改变量值 6.2.5 其他常用命令 1.执行shell命令 其格式是: shell command-string 2.修改变量值 (gdb) print x=10 (gdb) set variable x=10 3.跳转执行 jump linenum jump *addr

6.2.6 应用示例 示例程序源代码

(1)使用带-g选项的gcc命令对该程序进行编译,然后运行: (2)用程序名dbme作为参数启动gdb。 (3)在gdb环境下使用run命令运行该程序 。

(4)为了了解代码中可能出错的行,使用list命令显示第1~25行的内容(其实该程序只有22行): (gdb) list 1,25 (5)设置断点,让程序在文件dbme.c的第21行停止执行,然后运行该程序。

(6)利用print命令可以打印任何合法表达式的值。 (7)再查看数组fary元素地址的情况

再查看ary数组后面10个元素的数值。

6.3 程序维护工具make 6.3.1 make的工作机制 GNU的make的工作过程如下: ① 依次读入各makefile文件; ② 初始化文件中的变量; ③ 推导隐式规则,并分析所有规则; ④ 为所有的目标文件创建依赖关系链; ⑤ 根据依赖关系和时间数据,确定哪些目标文件要重新生成; ⑥ 执行相应的生成命令。

1.makefile文件 make被调用后会依次查找名为GNUmakefile,makefile和Makefile的描述文件 一个示例 : prog: x.o y.o z.o assmb.o gcc x.o y.o z.o assmb.o -L/home/mqc/lib -lm -o prog x.o:x.c defs.h gcc -c x.c y.o: y.c defs.h gcc -c y.c z.o:z.c gcc -c z.c assmb.o:assmb.s as -o assmb.o assmb.s clean: rm prog *.o

Makefile规则有以下通用形式: 目标文件:[相依文件…] <tab>命令1[#注释] … <tab>命令n[#注释] 在格式上应注意: 依赖行从一行的开头开始书写 各命令行单独占一行,每个命令行的第一个字符必须是制表符<tab>,而不能使用8个空格 #号后的内容为注释 在依赖行上,目标文件和相依文件之间要用一个或两个冒号分开

2.依赖关系图 使用make的一个核心问题是确定好各文件之间的依赖关系。一般来说,生成一个目标文件可能有多个不同的途径,根据这些途径能够指定不同的依赖关系。

make是依据“关系图深度优先搜索”的算法来核查目标文件及相依文件的修改时间,深度相等时,可由左到右依次进行。 适当地引入中间结果,合理地构造依赖关系图,可以省去一部分编译工作量。但并非层次越多越好,要考虑目标文件的生成过程及其所起的作用。

6.3.2 使用变量 1.变量定义和引用 make的变量(又称做宏定义)一般均由大写字母和数字组成。 定义变量的一般格式是: 6.3.2 使用变量 1.变量定义和引用 make的变量(又称做宏定义)一般均由大写字母和数字组成。 定义变量的一般格式是: <变量名>=<字符串> 例如,下面都是合法的变量定义: OBJECT=x.o y.o z.o LIBES=-lm 引用make变量的方式与引用shell变量类似,即:把变量用圆括号括起来,并在前面加上“$”符号。例如: $(OBJECT) $(LIBES)

2.自动变量 除了用户定义的变量外,make也可以使用环境变量、自动变量和预定义变量。 $@ 表示规则中的目标文件集合 $? 所有比目标文件还新的那些相依文件的集合,以空格分开 $< 规则中的第一个相依文件名 $^ 规则中所有相依文件的集合,以空格分开 $% 仅当目标文件是一个静态库成员时,表示规则中的目标成员 名,而此时$@表示相应库文件的名称 $* 如果目标文件的后缀是make所识别的,则$*就是去掉后缀的目标文件名,但该引用只有用在隐含规则中才有意义

3.预定义变量 归档库: AR ARFLAGS 汇编命令: AS ASFLAGS C编译命令: CC CPP CFLAGS CPPFLAGS C++编译命令: CXX CXXFLAGS

6.3.3 隐式规则 在makefile文件中显式地指定了一些规则,称为显式规则。 6.3.3 隐式规则 在makefile文件中显式地指定了一些规则,称为显式规则。 隐式规则就是一种惯例,即预先约定好了,不需要在makefile文件中写出来的规则。 几个常用的隐式规则: ① 编译C语言程序的隐式规则 ② 编译C++程序的隐式规则 ③ 汇编和汇编预处理的隐式规则

6.3.4 make命令常用选项 make命令有丰富的命令行选项。 例如: -C dir 把目录改到dir -d 输出所有的调试信息 -e 指明环境变量优先于makefile文件中的变量 -f file 使用file文件作为makefile文件 -I 忽略在执行重新生成文件的命令的过程中出现的所有错误 -I dir 或 –Idir 指定一个包含makefile文件的搜索目录