第五讲-Linux操作系统环境下的C程序开发技术PPT课件_第1页
第五讲-Linux操作系统环境下的C程序开发技术PPT课件_第2页
第五讲-Linux操作系统环境下的C程序开发技术PPT课件_第3页
第五讲-Linux操作系统环境下的C程序开发技术PPT课件_第4页
第五讲-Linux操作系统环境下的C程序开发技术PPT课件_第5页
已阅读5页,还剩51页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第五讲Linux操作系统环境下的C程序开发技术 Linux系统及程序设计 韦勇信息安全教研室7236727 主要内容 编译器GCC简介编译器GCC使用make工具使用程序调试 教学要求 理解GCC概念 掌握GCC使用方法 学会编写makefile 掌握GDB调试方法 GCC简介 名称 GNUprojectCandC CompilerGNUCompilerCollection管理与维护GNU项目 GCC简介 GCC能工作在多种平台上Intelx86 Linux Windows Alpha Linux PowerPC AIX Sparc Solaris GCC可以编译多种语言CC Objective C 标准C的派生 FortranJavaAda GCC简介 C语言编译过程预处理阶段 Preprocess 开头的指令 伪指令 宏指令 和特殊符号进行处理 编译阶段 Compile 预处理之后的输出文件进行词法分析和语法分析汇编过程 Assemble 把汇编语言代码翻译成目标机器代码连接阶段 Link 解决外部符号访问地址问题 库函数 GCC的使用 gcc 选项 输入文件输入文件包括源程序文件 编译中间文件等如果没有指定选项 Linux下生成的可执行文件是a outgcc的选项主要分为四组 预处理选项编译选项优化选项连接选项 GCC的常用选项 GCC的常用选项 GCC的常用选项 GCC文件扩展名规范 使用gcc编译代码 源代码 示例源程序 hello c includeintmain void printf hellogcc r n return0 生成预处理文件 gcc Ehello c ohello i 预处理文件hello i的部分内容 externvoidfunlockfile FILE stream 679 usr include stdio h 3 2 hello c 2intmain void printf hellogcc n return0 生成汇编文件 gcc Shello c ohello s 汇编文件hello s的部分内容 main pushl ebpmovl esp ebp addl 16 espmovl 0 eaxleaveret 生成二进制文件 生成目标文件命令 gcc chello c ohello o生成可执行文件命令 gcchello c ohello运行程序 hellohellogcc 编译多个文件 编译多个文件 目录结构 1 编译命令 gccmy app cgreeting c omy app目录结构 2 编译方式 1 gccmy app cfunctions greeting c omy app Ifunctions 编译多个文件 目录结构 2 编译方式 2 分步编译命令 1 gcc cmy app c Ifunctions2 gcc cfunctions greeting c3 gccmy app ogreeting o omy app思路 编译每一个 c文件 得到 o的目标文件 将每一个 o的目标文件链接成一个可执行的文件 使用make工具 适用场合 多个文件组成的软件项目基本格式 目标 欲生成的目标文件依赖项 生成目标需要的文件原理 判断依赖项是否为最新 否则 生成新的目标 目标 依赖项列表 Tab缩进 命令 使用make工具 make工具的使用格式 make 命令选项 命令参数 通常使用make就可以了 make会寻找Makefile作为编译指导文件 使用make工具 Makefile示例 使用make工具 目标的依赖关系 使用make工具 target OBJgcc otargetclean rm install remove Makefile实例 调试 静态调试在程序编译阶段查错并修正错误 主要为语法错误 输入错误 类型匹配错误 排错方式 利用错误 警告信息 并结合源文件环境排错 静态调试举例 动态调试 在程序运行阶段差错并修正错误 主要错误类型 算法错误 输入错误 排错方式 利用调试工具定位并修正错误 静态调试举例 静态调试举例 分块编译greeting c gcc g Wall cfunctions greeting c g 将调试信息加入到编译的目标文件中 Wall 将编译过程中的所有级别的警告都打印出来 无错误my app c gcc g Wall cmy app c Ifunctions参数含义同上错误信息 静态调试举例 错误信息 错误记录格式 文件名 行号 错误描述 my app c Infunction main my app c 6 n undeclared firstuseinthisfunction my app c 6 Eachundeclaredidentifierisreportedonlyoncemy app c 6 foreachfunctionitappearsin my app c 9 parseerrorbefore greeting my app c 6 warning unusedvariable name 静态调试举例 分析 定位错误 警告 my app c的第6行 描述含义 n是一个没有声明的变量 分析 声明数字name时用到了变量n 但变量n在之前没有声明 改正 声明一个新变量n 或者将n改为宏N这里取第2种改正方法 静态调试举例 my app c的第9行 描述含义 在 greeting 之前出现解析错误 分析 c中每行程序以 结束 第9行greeting之前的程序行没有以 结束 改正 第8行末尾增加 重新编译错误信息 my app c Infunction main my app c 11 warning controlreachesendofnon voidfunction 静态调试举例 分析 定位错误 警告 警告 my app c的11行描述含义 控制以非空函数结束 分析 main函数返回类型为int 源程序没有以return整数形式结束 改正 将main改为返回void类型 或者 在main程序后增加return返回语句 采用第2种解决方式 重新编译 无错误或警告信息 完成静态调试 静态调试举例 静态调试总结主要为语法错误 输入错误 类型匹配错误 分析信息 主要来自gcc编译时产生的提示信息错误警告定位 不一定在提示信息描述的地方 综合分析提示信息及提示行的上下文环境 定位并修正错误 警告 有的警告可以不用修复 动态调试 常见的动态调试方法 增加调试语句 记录程序的执行状况 观察内存变化 使用调试工具 GNUDebuger的功能 启动程序 设置程序执行的上下文环境 在指定的条件下停止程序 程序停止时 检查程序的状态 在程序运行时 改变程序状态 使其按照改变后的状态继续执行 GDB的使用 基本命令显示源程序查看运行时数据改变和显示目录或路径控制程序的执行其他命令获得帮助启动gdb后使用help命令 GDB的使用 GDB的使用 显示源程序Listlist显示当前行后面的程序list 显示当前行前面的程序list file linenum显示linenum行周围的程序liststartline endlinelist file function显示函数名为function的程序showlistsize显示listsize设置setlistsizenum设置listsize设置源代码搜索forward search search reverse search GDB的使用 查看运行时数据printp p为变量名 printfunction 1 0 print pwhatisp GDB的使用 改变和显示目录和路径directorycdpathpwdshowdirectoriesshowpath GDB的使用 控制程序的执行设置 显示断点break infobreak维护断点deletebreakpoint deletebreakpoint1 enable disablebreakpoint1 clearlinenum 运行程序run单步调试和连续执行step next continue函数调用call return GDB的使用 其他命令执行shell命令其格式是 shellcommand string修改变量值printx 10setvariablex 10跳转执行jumplinenumjump addr 动态调试举例 对静态调试中的例子继续进行动态调试工具 gdb启动gdb 动态调试举例 调试指定程序 my app 问题 期望的输出和实际输出不一致 动态调试举例 初次错误定位 输出有错误错误定位重新开始一次调试 启动gdb 加载调试程序 my app 查看程序源代码命令 list文件名 动态调试举例 gdb listmy app c 1 201 include2 include greeting h 3 defineN104intmain void 5 6charname N 7printf YourName Please 8scanf s name 9greeting name 10return0 11 gdb break7BreakPoint1at0 x8048384 filemy app c line7 在程序第7行设置断点命令 gdb break7 动态调试举例 错误详细定位 动态调试举例 动态调试举例 分析 11行说明name变量被正确赋值 tom 13行说明name变量值被正确赋予greeting的参数变量name16说明打印出现了错误 即错误出现在函数greeting中 综合分析错误出现在greeting c的第5行 原因 没有输出字符串的格式不对 改正错误 动态调试举例 动态调试总结主要错误类型 算法错误 输入错误 定位方法 设置断点 单步步进执行 查看变量取值变化 反复执行 逐步缩小错误范围 动态调试举例 include include defineBIGNUM1000voidindex m intary floatfary intmain intintary 100 floatfltary 100 index m intary fltary exit EXIT SUCCESS voidindex m intary floatfary inti floatf 3 14 for i 0 i BIGNUM i ary i i fary i i f 动态调试举例 使用gcc g选项编译dbme c调试dbme运行dbme列出源代码打印变量单步调试设置断点 动态调试举例 调试

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论