嵌入式系统调试原理
4
Quotes About Debug
I can remember the exact instant when I realized that
a large part of my life from then on was going to be spent in finding mistakes in my own programs—— Maurice Wilkes(1967年图灵奖)
first place. Therefore, if you write the code as cleverly as possible, you are–by definition–not smart enough to debug it——Brian Kernighan
5
History's Worst Software Bugs(1/5)
每1000行程序中,潜在bug数量约1~10个。
国际空间站
——软件系统规模大于1,000,000行
NASA太空飞船——船载代码量500,000行,地面3,500,000行
神舟5号飞船 ——船载软件模块60余个,代码量数十万行
美国每年由于软件bugs导致600亿美元的经济损失,占
GDP的0.6%
状态寄存器(陷阱标志):TF
调试地址寄存器:DR0~DR3
调试控制寄存器:DR7
调试状态寄存器:DR6
25
软件调试器是如何工作的?-断点设置
断点如何设置?
26
软件调试器是如何工作的?-异常处理
调试器如何接管被调试软件?
断点物理地址确定后,需插入调试异常指令,如:
I386:int 3、ARM:BKPT
源代码级别的软件断点是如何设置,并与物理地址对应?
0x400984 0x400A32
0x400AB8
0x400AE0
编译后目标代码 源程序: Dwarfread.c
19
关于软件调试器的几个疑问(2/2)
关于软件调试的几个疑问
调试器与被调试软件是如何关联的?
调试指令(单步、step in、step out等)是如何实现的? 被调试软件的全局变量、局部变量、寄存器信息是如何查看的?
断点的主要分类
代码断点:指OM断点:只读断点
通常意义的断点是指:RAM型代码断点
嵌入式系统调试中的常用断点:ROM型代码断点
24
体系结构对软件调试的支持
Intel体系结构对软件调试的支持
断点指令:INT 3
用VS2005创建一个基于MFC的工程项目
加入 _asm INT 3,观察一下现象
看下 _asm INT 3的机器代码
未分配空间的指针地址是什么?
能否发现一 些关联关系?
18
关于软件调试器的几个疑问(1/2)
关于软件调试的几个疑问
为什么软件要分为调试版(Debug)与发行版(Release),它 们两者间的差异何在?
的儿童抚养费未收款,积压的待办事件达23.9万,3.6万 件新案子“卡”在系统中。
原因:EDS系统与津贴系统不兼容,至少有500个bug。
9
History's Worst Software Bugs(5/5)
2007年8月11日,美国洛杉矶国际机场电脑当机超过8小
时,17000个航班受影响,20000名乘客滞留机场。
RTEMS BUG分布
HTTPD BUG分布
PostgreSQL BUG分布
15
课程大纲
软件调试原理概述
嵌入式软件调试概述 GDB Server分析 KGDB简介
16
软件调试器基本功能
单步执行 step in step out 全局变量 局部变量 寄存器查看
设置断点
17
关于软件调试原理的两个小实验
28
软件调试器是如何工作的?-单步执行
单步越过执行算法
29
软件调试器是如何工作的?-单步执行
单步进入执行算法
30
软件调试器是如何工作的?-信息查看
被调试软件的信息查看
全局、静态变量:符号表 寄存器信息 :被调试任务上下文
局部变量
:被调试任务上下文、符号表
31
哪些软件难以调试?
原因:惯性制导系统中的水平偏差量,由64位浮点数转
换为16位带符号整数运算中发生溢出。
8
History's Worst Software Bugs(4/5)
2004年,美国EDS公司为英国儿童抚养机构CSA研制的
信息化系统上线,与此同时,津贴系统正在重构。
系统给190万人多付了款,给70万人少付了款,35亿英镑
系统底层软件:如系统初始化程序(bootloader)、底层 软件(如设备驱动程序)、复杂软件核心(如操作系统 内核)等; 非确定性软件:如多任务并发程序、实时应用系统、分 布式系统等。
14
多次释放
缓冲区溢出 内存耗尽
计算错误
输入输出错误 控制流错误 数据处理解释错误 竞争类错误 操作系统、体系结构、 编译器相关错误 其他错误
bug分布特点实例分析
通过对RTEMS、Apache HTTPD、PostgreSQL等大型开 源软件系统7年多来的近1000个bug分析,bug分布如下:
在自然界里bug是人类的主要竞争者。 圣经“十灾”的故事
其中三种是由bug(虱灾、蝇灾、蝗灾)所引起的灾难
2
软件系统bug/debug的起源
Grace Hopper(COBOL语言的发明者),在“Annals
of the History of Computing“(Vol.3,No.3(July 1981),p285—286)一书中,记载了这段历史„„
嵌入式系统
An Introduction to Embedded System
第十课、嵌入式系统的调试
教师:蔡铭 助教:吴仁科
cm@
546082253@
浙江大学计算机学院人工智能研究所 航天科技-浙江大学基础软件研发中心
1
关于bug
bug用以指代昆虫及节肢动物。
调试器接管被调试软件方式
操作系统接管调试异常,并转交调试器 调试器直接接管调试异常
触发异常
0xA03248 0x0483
0xCC3248 0x0483
0x400AB8
0x400AE0
0x400AB8
0x400AE0 27
软件调试器是如何工作的?-单步执行
单步执行
单步执行在调试行为中,具备非常重要的作用,调试者通过 单步执行观测程序执行状态。 在程序出现异常时,通过单步执行,分析程序出现异常的过 程和原因。 单步执行存在多种形式,如:单步进入、单步越过等。
1962年7月22日,携带着金星探测器水手1号的大力神火
箭从美国卡那维拉尔角空军基地发射升空。起飞后5分钟, 火箭偏离预定轨道。在离星箭分离只有6秒钟时发出了自 毁指令,在大西洋上空将整个火箭摧毁。
这次事故使美国损失了1850万美元,导致美国太空探险
史上首次太阳系飞行计划化为泡影。
原因:遗漏了对火箭飞行速度取平均值。
软件调试的一般过程 观察故障现象
推断故障假设
确定故障位置 修正故障代码
上述四个步骤不断迭代进行,直至消除故障。其中,根据故障现象 进行故障定位,是软件调试的关键环节。
11
软件调试的重要性(1/2)
从软件系统发展历程看(Purdue,2006)
20年前——如何编制出满足用户需求的软件 10年前——如何提高软件的运行性能 而现在——如何使软件的运行更稳定、可靠
13
bug种类繁多
bug分类体系:ANSI/IEEE 1044-1994、QJ3026-1998
内存相关错误 初始化错误 堆栈溢出 内存泄漏 条件逻辑错误 循环边界错误 条件比较错误 函数调用错误 执行顺序错误 状态转化错误 字节对齐错误 宏扩展错误 浮点精度损失 本地化错误 内存泄漏 权限错误
原因:网卡设备驱动程序存在bug,导致网络瘫痪。
如何使软件运行稳定、可靠是重要研究课题,而 软件调试、软件测试技术是基本保障手段!
10
关于软件调试
软件测试与软件调试的区别
软件测试的目的是找出软件实现中与预定义的规格不符合的问题, 即错误;
软件调试的目的是定位错误,并进行修改;
软件测试中发现的错误,需要通过调试来进行定位。
the first bug - 1947.9.9
3
软件系统开发面临的严峻挑战
软件部分在系统中所占有的比例越来越高,由于软件错
误直接造成系统失效的比率持续递增。
据1986年的统计数据表明,系统失效事件中诱因是软件错误的 比率约占25%,而到2000年,该比率已超过40%。
嵌入式软件规模越来越大,功能越来越复杂。据统计,
7
History's Worst Software Bugs(3/5)
1996年6月4日,欧洲航空航天局耗资67亿美元,历时10
年研制的Ariane501火箭带着四颗卫星在法属圭亚那库鲁 航天中心第三发射场首次升空。
起飞后37秒,火箭发生倾斜,大幅度偏离轨道,箭体结
构断裂,随后火箭安全系统自动炸毁。
20
支持软件调试的几个方面
编译器的支持
调试信息的注入
计算机体系结构的支持
调试指令的支持 调试寄存器的支持
21
编译器的支持-调试版(Debug) vs 发行版(Release)