- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
第五章MemoryCorruption7
第五章Memory Corruption
第一部分:堆栈
有两个原因导致内存破坏成为最棘手的程序出错类型之一。首先,破坏的源头和现象可能相隔很远,很难将原因和结果关联起来。其次是由于只有在比较罕见的条件下症状才显露出来,使得要一致的重现错误比较困难。
原则上只要满足以下两个条件中的任意一个,就会发生内存破坏。
线程对一块不属于它的内存进行写操作。
线程对属于它自己的内存进行写操作时,破坏了该内存的状态。
这里有个小程序可以作为展示第一个条件的例子。
#include windows.h
#define BAD_ADDRESS 0xBAADF00D
int __cdecl wmain (int argc, wchar_t* pArgs[])
{
char* p =(char*)BAD_ADDRESS;
*p = ’A’;
return 0;
}
上面的小程序先声明了一个char型指针,然后对其初始化,赋给其一个不可访问的地址(0xBAADF00D)。运行该程序的最终结果就是程序崩溃,紧接着弹出可怕的Dr.Watson( HYPERLINK \l DrWatson 译注)。很明显这是因为这个小程序中执行了一次无效的内存访问导致,但是在很复杂的系统中要指出错误很麻烦。例如应用程序分配了一块内存,并且计划了其生命周期。如果过早的释放了它,失效的指针访问就会导致内存破坏。应用程序对不属于自己的内存进行写访问会导致程序崩溃,这是最好的情况。等等!!读者看到这里可能会问:你是说程序崩溃是最好的情况?!没错,对于内存破坏来说,发生崩溃的话也许能立即指明发生内存破坏的原因。就像上面的小程序一样,由于被写的内存无效,所以立即发生了崩溃。这是个好消息,因为我们很轻松的就看到了错误原因:一个指针指向了无效的内存地址。再看看第2种情况,如果无效指针指向的是属于程序中别的部分分配的内存的话,可能出现如下几种症状:
程序崩溃:跟前面的程序崩溃的主要区别在于发生的时间会延后一些。上面的示例程序因为尝试写一块被操作系统认为无效的内存导致了崩溃。第2种情况下,应用程序尝试写入的是操作系统认为有效的内存,所以允许其写入,没有错误发生。随后应用程序可能会试着使用被错误改写过的内存,也许就会崩溃(依赖于内存访问的性质)。
不会崩溃,但是有意料之外的行为:由于之前写了无效数据到其他部分所拥有的内存中,不一定程序就会崩溃。这种情况相当多。应用程序的其他部分会继续使用被写入异常数据的内存,甚至内存的状态都已经被修改过(通常情况下不会发生这种状况)。看个例子,假设有个线程池的类,除了能对线程池的请求排队外,还有个方法用于设置一个标志以控制流程结束。线程池周期性的检查该标志,一旦发现该标志为TRUE则停止工作。应用程序会初始化出该线程池的一个单体对象来使用。现在假设线程池正在处理200个请求(信用卡授权)时,一个线程错误的将标志设置为TRUE了。于是线程池突然间就停止工作,客户在用信用卡交易时发生错误,电话铺天盖地的响起来……这是典型的内存破坏的例子:线程破坏内存最终导致发生不可预料的行为。由于修改内存的线程已经对内存数据造成了损害,随后使用这块内存有时(通常总是)无法预料。要找到这些类型的内存破坏的根源那是相当的难啊。
译注:如果你发现没有弹出Dr.Watson对话框也不要太惊讶。实际上依赖于注册表中的一个键值:HKEY_LOCAL_MECHINE\SOFTWARE\Microsoft\Windows NT\Current Version\AeDebug。其中包括Auto,Debugger和UserDebuggerHotKey三个值。默认情况下Debugger的内容为drwtsn32 -p %ld -e %ld,指出系统的默认调试器为Dr.Watson。Auto键值为0或1。为0时表示系统不自动处理,当有应用程序崩溃时会弹出一个对话框通知用户;当Auto为1时,系统就自动调用调试器记录发生错误的程序的相关信息然后退出,不通知用户。UserDebuggerHotKey是设置一个快捷键用来发送一个DebugBreak()调用,就好像进断点了一样,前提是程序是由调试器加载起来的。
内存破坏诊断流程
本节讲述一下内存破坏问题的处理流程。下面的流程图简单描述了每一个步骤。有一点很重要:要找到内存破坏问题的根源,对于不同的状况,可能需要反复执行Figure 5.1中的流程才行。
Figure 5.1 内存破坏分析过程
步骤1:状态分析
在开始研究内存破坏的问题前,首先应该确保你当前发现到的错误确实是因为内存破坏的缘故导致的。这个步骤还可以进一步分解,如Figure 5.2
Figure 5.2 状态分析过程
如同前面提到的,内存破坏的特征无非就是这两种:程序崩
您可能关注的文档
- 第二章 鼠笼型感应电动机地调速.doc
- 第二章-高分子材料合成原理与方法-逐步聚合.ppt
- 第二章8036DX微处理器的实地址模式软件结构.ppt
- 第二章2.2方型方程.ppt
- 第二章会计对与会计要素.ppt
- 第二章会计要与会计等式.ppt
- 第二章传染病的综合防制措施3.ppt
- 第二章光学谐振腔高斯光束.ppt
- 第二章农业技术经济学地基本原理.ppt
- 第二章初等数方法建模.doc
- 2025四川天府银行社会招聘备考题库(攀枝花)含答案详解(最新).docx
- 2025四川银行首席信息官社会招聘备考题库及完整答案详解1套.docx
- 2025四川天府银行社会招聘备考题库(攀枝花)带答案详解.docx
- 2025四川天府银行社会招聘备考题库(成都)含答案详解(a卷).docx
- 2025四川广元市利州区选聘社区工作者50人备考题库及答案详解(基础+提升).docx
- 2025天津银行资产负债管理部总经理或副总经理招聘1人备考题库含答案详解(典型题).docx
- 2025四川天府银行社会招聘备考题库(西充)附答案详解(考试直接用).docx
- 2025年中国民生银行南宁分行招聘2人备考题库及答案详解(全优).docx
- 2025天津银行高级研究人才招聘备考题库附答案详解(达标题).docx
- 2025大连银行营口分行招聘2人备考题库及参考答案详解一套.docx
最近下载
- 传染病防治护理指南(最新版).docx VIP
- 内部控制与风险管理(中南财经政法大学)中国大学MOOC 慕课 章节测验 期末考试答案.pdf VIP
- 学堂在线 临床中成药应用 章节测试答案.docx VIP
- 丽声北极星分级绘本+四上Unit3The+King's+Yu+Player课件.pptx
- 山东土地发展集团真题.pdf
- 加强意识形态工作坚决维护意识形态安全(1).pptx VIP
- 注塑机设备日常点检表.xls VIP
- 2025四川川投(泸州)燃气发电有限公司第一批员工招聘18人笔试备考试题及答案解析.docx VIP
- 党课ppt+word讲稿:医疗卫健系统二十届四中全会精神宣讲党课(7900字,46张)ppt.pptx VIP
- 《经口鼻吸痰技术操作规范》课件.ppt VIP
原创力文档


文档评论(0)