出版时间:2009-1 出版社:电子工业出版社 作者:罗克露,陈云川 页数:482
Tag标签:无
前言
在程序开发过程中,一个公认的事实是编写代码并不难,但是如何写出正确的代码、如何排除代码中的错误,却并不是一件简单的事情。如何排除代码中的错误,这就涉及软件的调试。调试技术的理论基础并不复杂,但是调试本身却是一门实践性非常强的技术。需要说明的是,嵌入式系统中的软件调试与桌面软件的调试有很大的不同。调试嵌入式系统时,调试器和被调试程序往往是物理上分离的。调试器运行在宿主机上,而被调试程序运行在目标机上,宿主机与目标机之间通过某种媒介进行通信。同时,还要在目标机上运行一个称为调试代理(Debug Agent)的监控程序,由它来负责与运行在宿主机上的调试器进行通信,控制被调试程序的执行,并将被调试程序的执行情况及时反馈给调试器。这进一步增加了调试的复杂性。当前图书市场上有关调试技术的书籍并不多。但是,对于从事实际开发的工程人员而言,尤其是对广大的嵌入式系统程序员而言,调试是一个无法回避的永恒话题。因此本书以嵌入式开发中的调试技术和调试手段作为全书的核心,在当前众多的计算机编程开发书籍中另辟蹊径,独树一帜,对于刚接触嵌入式程序开发的读者而言,必将大有裨益。同时,对于经验丰富的程序员而言,本书也具有较大的参考价值。本书所用平台本书采用的嵌入式硬件平台为Intel公司的Sitsang评估板,其上运行的操作系统为ARM-Linux 2.4.19。本书宿主机端软件平台采用Red Hat 9.0(Linux 2.4.20-8),本地调试器为GDB 5.3(Red Hat 9.0默认配置),交叉调试器在GDB 6.4的基础上构建。另外,在本书写作的后期,作者换到了一台笔记本电脑上工作,为了与时俱进,其上运行的是Fedora Core操作系统。本质上讲,Fedora Core源自Red Hat,两者并无根本不同。为消除读者对此存疑,特此予以澄清。尽管本书采用的软硬件平台是固定的,但是书中演示的大部分实例都不依赖于具体的软硬件环境。因此如果读者所采用的软硬件平台与作者书中采用的有所不同,也无须多虑,大部分功能和操作都是相同的。本书内容组织本书共分为3篇。上篇基础篇,包括第1~2章。主要对调试的基础知识进行了大致的概览,对各种调试手段进行了简单的说明和对比。中篇系统篇,包括第3~7章。第3章介绍GDB调试器的使用;第4章主要介绍如何通过GDB进行远程调试,同时也涉及了远程调试可能要用到的一些工具,如NFS、minicom等;第5~7章主要介绍在一些特定开发场景下所采用的调试技术,包括网络环境下的调试、多线程与多进程环境下的调试、静态库与动态库的调试,等等。下篇应用篇,包括第8~9章。这部分内容属于较综合的话题,运用到了前述章节中所讲述的一些内容。第8章围绕MPEG-4视频流的解码和播放展开,而第9章则给出了一个基于GPS的移动定位终端的开发。本书配套光盘内容及使用方法本书配套光盘包含书中相关的补充资料、与Sitsang评估板相关的工具链和源代码、本书第3~9章的源代码,以及书中使用到的工具和软件库等。使用时只需将本光盘放入光盘驱动器中,选择各文件夹浏览即可。
内容概要
本书兼顾理论与实践。全书首先对调试技术及嵌入式调试手段进行一个概览,然后重点对linux环境下的嵌入式调试技术进行详细的讲解,最后给出两个综合应用实例:MPEG-4视频播放器的设计和基于GPS的移动定位终端。在编写思路上,本书以理论为先、实践为重;具体到调试技巧和手段上,则全部结合具体实例展开。书中各个实例之间采取从前至后逐步深入的方式,既衔接有序,又便于读者学习。 本书配套光盘包含书中相关的补充资料、与Sitsang评估板相关的工具链和源代码、本书第3~9章的源代码,以及书中使用到的工具和软件等。 本书既可作为Linux环境下嵌入式软件调试技术从入门到精通的学习用书,也可供从事Linux环境下的嵌入式软件调试的工程人员参考使用。
书籍目录
上篇 基础篇第1章 软件调试概述 21.1 什么是软件调试 21.2 软件调试的分类 61.2.1 静态调试和动态调试 61.2.2 机器级调试与源码级调试 71.2.3 任务级调试与系统级调试 71.2.4 本地调试与远程(交叉)调试 81.3 软件调试的关键技术·断点 81.3.1 软件断点 81.3.2 硬件断点 81.4 调试器应当遵循的原则 91.4.1 调试器必须反映真实信息 91.4.2 提供尽可能多的程序上下文信息 91.4.3 Heisenberg原则·尽可能减少对被测系统的影响 101.5 嵌入式软件调试手段 101.5.1 软件仿真调试·模拟器 101.5.2 ICE·早期手段 111.5.3 BDM·M68K系列及PowerPC等采用的技术 121.5.4 JTAG·调试领域的后起之秀 131.5.5 调试代理·嵌入式调试的基石 151.6 本章小结 15第2章 边界扫描测试技术(JTAG) 162.1 JTAG的背景和原理 162.2 JTAG接口的结构 192.3 测试访问端口(TAP) 202.3.1 测试时钟输入TCK 202.3.2 测试模式输入TMS 202.3.3 测试数据输入TDI 212.3.4 测试数据输出TDO 212.3.5 测试复位输入TRST* 212.3.6 TAP的互联方式 212.4 测试访问端口控制器(TAP controller) 222.5 指令寄存器 272.6 JTAG指令 272.6.1 公共指令(public)与私有指令(private) 272.6.2 BYPASS指令 282.6.3 SAMPLE指令 292.6.4 PRELOAD指令 292.6.5 EXTEST指令 292.6.6 其他指令 292.7 数据寄存器组 302.7.1 BYPASS寄存器 312.7.2 边界扫描寄存器 312.7.3 设备ID寄存器 322.7.4 其他数据寄存器 322.8 ARM7TDMI的JTAG调试 322.8.1 调试架构 332.8.2 ARM7TDMI处理器结构 332.8.3 进入调试状态 342.8.4 JTAG指令 352.8.5 EmbeddedICE-RT逻辑 362.8.6 访问寄存器和存储器 382.9 本章小结 41中篇 系统篇第3章 学习使用GDB调试器 443.1 GDB简介 443.1 1 GDB的启动和退出 453.1.2 GDB的启动步骤 503.1.3 GDB的多语言支持 503.2 在编译时加入调试信息 513.2.1 打开GCC的调试选项-g 513.2.2 代码优化对调试的影响 523.3 在GDB下运行程序 533.3.1 指定要运行的程序 533.3.2 设置程序的运行环境 543.3.3 停止运行 603.4 断点、监视点与捕捉点 603.4.1 断点、监视点与捕捉点的设置 613.4.2 断点的删除、禁用和使能 753.4.3 条件断点 823.4.4 断点命令列表 873.4.5 断点菜单·对函数重载的支持 893.5 继续(continuing)与单步(stepping) 903.5.1 继续运行 913.5.2 单步运行 913.5.3 与单步有关的命令 943.5.4 指令级单步命令 973.6 查看数据 993.6.1 用print命令查看数据 993.6.2 查看数据类型 1033.6.3 人为数组·查看内存中的连续对象 1053.6.4 查看存储器和寄存器 1083.6.5 自动显示列表 1113.6.6 使用快捷变量(convenience variable) 1143.6.7 处理C语言宏定义 1153.6.8 产生转储文件 1163.7 栈帧的回溯与选定 1173.7.1 栈帧回溯(backtrace) 1183.7.2 栈帧选定 1203.7.3 栈帧状态 1213.8 改变程序的执行流程 1223.8.1 给变量赋值 1223.8.2 使程序从另外的地址继续执行 1243.8.3 向程序发送信号 1253.8.4 调用函数 1273.9 其他常用命令 1283.9.1 源代码查看命令 1283.9.2 反汇编命令 1293.10 实例:Framebuffer与libjpeg混合编程 1313.10.1 Framebuffer简介 1313.10.2 libjpeg简介 1333.10.3 程序说明 1353.10.4 调试 1433.11 GDB命令汇总 1463.12 本章小结 148第4章 GDB远程调试技术 1494.1 目标平台简介 1494.2 准备工作 1514.2.1 minicom终端仿真程序 1514.2.2 NFS文件系统 1544.2.3 联合使用minicom和NFS 1574.3 两种远程调试方式 1594.3.1 gdbserver 1594.3.2 远程插桩(stub) 1604.4 编译arm-linux-gdb 1604.5 编译gdbserver 1624.6 连接到远程目标 1634.6.1 启动gdbserver 1634.6.2 串行连接方式 1644.6.3 TCP连接方式 1654.6.4 UDP连接方式 1664.6.5 与远程目标断开连接 1664.6.6 GDB的远程调试选项 1664.7 实例:调试误用内存的程序 1684.7.1 段错误 1684.7.2 野指针 1714.7.3 内存泄漏 1744.7.4 处理内存问题的对策 1764.8 实例:音频采集与回放程序的调试 1764.8.1 Linux下的音频接口 1764.8.2 OSS的编程接口 1774.8.3 OSS的编程机制 1784.8.4 OSS的一般框架 1814.8.5 源程序SndKit.c说明 1814.8.6 SndKit调试过程 1904.9 本章小结 193第5章 网络应用程序调试 1945.1 套接口编程简介 1945.1.1 基本TCP套接口编程 1985.1.2 基本UDP套接口编程 2035.2 网络调试和诊断工具 2065.2.1 tcpdump 2075.2.2 其他工具 2105.3 实例:远程获取加速度 2125.3.1 加速度传感器ADXL202JE简介 2125.3.2 服务端程序 2135.3.3 客户端程序 2185.3.4 小结 2245.4 实例:通过CDMA发送短消息 2245.4.1 Linux串口编程概览 2245.4.2 发送英文短消息 2295.4.3 发送中文短消息 2405.4.4 小结 2475.5 本章小结 248第6章 多进程与多线程调试 2496.1 Linux下的多进程程序调试 2496.1.1 进程的创建 2496.1.2 GDB对多进程调试的支持 2516.1.3 实例:调试simple_fork 2536.2 Linux多线程程序调试 2556.2.1 线程的创建、终止和取消 2566.2.2 线程互斥锁 2616.2.3 条件变量(condition variable) 2636.2.4 线程的cleanup handler 2676.2.5 线程特定数据 2686.2.6 线程引入的问题 2726.2.7 GDB对多线程调试的支持 2726.2.8 实例:调试simple_thread 2756.3 本章小结 279第7章 静态库与动态库的调试 2807.1 静态链接库的构建和调试 2807.2 动态共享库的优点和代价 2877.3 动态共享库的命名·soname 2897.4 动态共享库的构建和安装 2917.5 动态共享库的使用 2927.6 动态共享库的调试方法 2927.7 实例:解析AVI文件 2987.7.1 AVI文件格式介绍 2987.7.2 OpenDML所做之扩展 3037.7.3 AVI解析之代码实现 3097.7.4 编译共享库并安装到目标板 3307.7.5 远程调试共享库 3307.8 本章小结 334下篇 应用篇第8章 MPEG-4视频播放器的设计及调试 3368.1 概述 3368.2 XviD与SDL的构建 3378.3 XviD编程接口说明 3398.3.1 版本 3398.3.2 错误码 3408.3.3 色场空间 3408.3.4 profile和level定义 3418.3.5 像素幅型比(Pixel Aspect Ration) 3418.3.6 帧类型 3418.3.7 xvid_global()函数 3428.3.8 xvid_decore()函数 3448.3.9 小结 3508.4 SDL编程接口说明 3508.4.1 SDL的初始化和退出 3508.4.2 SDL视频子系统函数接口 3518.4.3 SDL事件处理子系统函数接口 3558.5 整体结构 3598.6 辅助模块:event和ping/pong双缓冲区 3618.7 解码模块设计 3758.8 播放模块设计 3938.9 驱动模块设计 4078.10 本章小结 410第9章 基于GPS的移动定位终端 4119.1 功能概述 4119.2 GPS介绍 4129.2.1 GPS定位原理 4129.2.2 GPS数据格式 4149.3 MiniGUI介绍 4179.3.1 MiniGUI体系结构与模型 4189.3.2 交叉编译MiniGUI 4199.3.3 为触摸屏编写IAL驱动层 4219.3.4 改写MiniGUI服务器程序mginit 4329.4 在单独的线程中读取和解析GPS数据 4379.4.1 经纬度坐标到像素坐标的映射 4379.4.2 双精度浮点数字节序的问题 4419.4.3 通过异步串口读写GPS数据 4439.4.4 解析GPS数据 4449.4.5 计算归一化坐标 4479.4.6 GPS线程 4489.4.7 与GUI前端交换数据 4519.4.8 GPS接收机模拟程序 4539.5 用到的MiniGUI元素 4549.5.1 主窗口 4559.5.2 控件 4579.5.3 静态框 4609.5.4 按钮 4619.5.5 编辑框 4659.5.6 GDI接口与位图操作 4689.5.7 定时器 4739.5.8 消息处理过程 4749.6 本章小结 479参考文献 480
章节摘录
插图:
编辑推荐
《嵌入式软件调试技术》既可作为Linux环境下嵌入式软件调试技术从入门到精通的学习用书,也可供从事Linux环境下的嵌入式软件调试的工程人员参考使用。
图书封面
图书标签Tags
无
评论、评分、阅读与下载