Linux教程:第六章 编译与调试解析

需积分: 16 20 下载量 78 浏览量 更新于2024-09-10 收藏 36KB DOC 举报
"Linux教程第三版孟庆昌第六章讲解了GCC编译过程、C语言程序编译选项、程序错误分类以及GDB调试工具的使用等内容。" 在Linux系统中,GCC(GNU Compiler Collection)是广泛使用的编译器,用于将源代码转换为可执行文件。在第六章中,孟庆昌详细介绍了GCC编译过程的四个主要阶段: 1. **预处理阶段**:在这个阶段,GCC读取C语言源文件,并处理所有的预处理器指令(如`#include`和`#define`),同时处理特殊符号。预处理器会扩展宏定义,处理条件编译指令,并生成.i扩展名的预处理文件。 2. **编译阶段**:接着,GCC对预处理后的文件进行词法分析和语法分析,确保代码符合C语言的语法规则。如果代码正确,编译器会将其转化为抽象语法树(AST)或者中间代码,通常是三地址码,便于优化和后续的汇编步骤。 3. **汇编过程**:在这一阶段,中间代码被转换为目标机器语言,生成.o扩展名的目标文件。这个阶段是将高级语言指令转换为特定硬件平台的机器指令。 4. **连接阶段**:最后,链接器负责将多个目标文件和库文件中的函数及变量引用进行解析和绑定,生成可执行文件。它可以处理不同文件间的符号引用,使得程序成为一个完整的可执行实体。 在编译C语言程序时,可以使用不同的GCC命令行选项来控制编译过程: - `-c`:只进行编译,不进行链接,生成目标文件。 - `-C`:保留预处理后的源文件中的注释。 - `-o file`:指定输出文件名为`file`。 - `-g`:生成调试信息,便于使用GDB等调试工具。 - `-l library`:在连接时搜索名为`library`的库。 程序错误通常分为三种类型: 1. **编译错误**:这是语法层面的错误,如拼写错误、括号不匹配等,编译器在编译阶段就能检测到。 2. **运行错误**:这类错误在程序运行时才会暴露,如除以零、数组越界等。 3. **逻辑错误**:程序能正常运行,但结果不符合预期,例如算法错误或条件判断错误。 GDB(GNU Debugger)是一个强大的调试工具,它允许程序员: 1. **启动程序**:可以按照用户设定的方式运行程序,包括设置断点等。 2. **控制程序运行**:在特定条件满足时暂停程序,如遇到特定行号或表达式值变化。 3. **检查程序状态**:在程序停止时查看变量值、堆栈信息等,帮助定位问题。 4. **动态改变执行环境**:在调试过程中修改变量值,便于测试和修复错误。 在提供的代码示例`badprog.c`中,程序试图访问分配的内存之外的区域,这是一个典型的运行时错误,可能造成未定义的行为。通过GDB,可以设置断点在`strcpy`之后,检查`p`指针的值,确保没有越界访问。如果`argc`为2且`argv[1]`等于`"-b"`,GDB还可以用来观察`p[50]`的修改是否导致了问题。