收藏 分享(赏)

软件调试.doc

上传人:gnk289057 文档编号:9576645 上传时间:2019-08-16 格式:DOC 页数:31 大小:184KB
下载 相关 举报
软件调试.doc_第1页
第1页 / 共31页
软件调试.doc_第2页
第2页 / 共31页
软件调试.doc_第3页
第3页 / 共31页
软件调试.doc_第4页
第4页 / 共31页
软件调试.doc_第5页
第5页 / 共31页
点击查看更多>>
资源描述

1、软件调试目 录第 1 篇 绪论 .1第 1 章 软件调试基础 .31.1 简介 .31.1.1 定义 31.1.2 基本过程 51.2 基本特征 .61.2.1 难度大 61.2.2 难以估计完成时间 71.2.3 广泛的关联性 71.3 简要历史 .81.3.1 单步执行 81.3.2 断点指令 101.3.3 分支监视 111.4 分类 .121.4.1 按调试目标的系统环境分 121.4.2 按目标代码的执行方式分 121.4.3 按目标代码的执行模式分 131.4.4 按软件所处的阶段分 131.4.5 按调试器与调试目标的相对位置分 141.4.6 按调试目标的活动性分 141.4.

2、7 按调试工具分 151.5 调试技术概览 .151.5.1 断点 151.5.2 单步执行 161.5.3 输出调试信息 171.5.4 日志 171.5.5 事件追踪 181.5.6 转储文件 181.5.7 栈回溯 181.5.8 反汇编 19目 录软件调试xxii1.5.9 观察和修改数据 191.5.10 控制被调试进程和线程 191.5.11 学习调试技术的意义 191.6 错误与缺欠 .201.6.1 内因与表象 201.6.2 谁的 Bug.211.6.3 Bug 的生命周期 .221.6.4 软件错误的开支曲线 221.7 与软件工程的关系 .241.7.1 调试与编码的关系

3、 241.7.2 调试与测试的关系 251.7.3 调试与逆向工程的关系 251.7.4 调试尚未得到应有的重视 261.8 本章总结 .26参考文献 26第 2 篇 CPU 的调试支持 27第 2 章 CPU 基础 292.1 指令和指令集 .292.1.1 基本特征 302.1.2 寻址方式 312.1.3 指令的执行过程 312.2 IA-32 处理器 322.2.1 80386 处理器 .332.2.2 80486 处理器 .332.2.3 奔腾处理器 342.2.4 P6 系列处理器 .352.2.5 奔腾 4 处理器 372.2.6 Core 2 系列处理器 .372.3 CPU

4、的操作模式 382.4 寄存器 .402.4.1 通用数据寄存器 402.4.2 标志寄存器 EFLAGS 412.4.3 MSR 寄存器 .422.4.4 控制寄存器 422.4.5 其他寄存器 452.4.6 64 位模式时的寄存器 .46目 录软件调试xxiii2.5 理解保护模式 .462.5.1 任务间的保护机制 472.5.2 任务内的保护 472.5.3 特权级 482.5.4 特权指令 492.6 段机制 .502.6.1 段描述符 502.6.2 描述符表 522.6.3 段选择子 522.6.4 观察段寄存器 532.7 分页机制(Paging)552.7.1 页目录(Pa

5、ge Directory ) 562.7.2 页表(Page Table) 572.7.3 页目录指针表(Page-Directory-Pointer Table) .572.7.4 地址翻译 572.7.5 使用 WinDBG 观察分页机制 .582.7.6 4MB 内存页的情况 .602.7.7 WinDBG 的有关命令 612.8 系统概貌 .622.9 本章总结 .64参考文献 64第 3 章 中断和异常 653.1 概念和差异 .653.1.1 中断 653.1.2 异常 663.1.3 比较 673.2 异常的分类 .673.2.1 错误类异常 673.2.2 陷阱类异常 683.

6、2.3 中止类异常 683.3 异常例析 .693.3.1 列表 693.3.2 错误代码 703.3.3 示例 703.4 中断/异常优先级723.5 中断/异常处理73目 录软件调试xxiv3.6 本章总结 .74参考文献 74第 4 章 断点和单步执行 .754.1 软件断点 .754.1.1 感受 INT 3754.1.2 在调试器中设置断点 764.1.3 断点命中 774.1.4 恢复执行 794.1.5 特别用途 794.1.6 断点 API.804.1.7 系统对 INT 3 的优待 .804.1.8 观察调试器写入的 INT 3 指令 .824.1.9 归纳 834.2 硬件

7、断点 .834.2.1 调试寄存器概览 844.2.2 调试地址寄存器 844.2.3 调试控制寄存器 854.2.4 指令断点 874.2.5 调试异常 884.2.6 调试状态寄存器 884.2.7 示例 894.2.8 硬件断点的设置方法 924.2.9 归纳 944.3 陷阱标志 .954.3.1 单步执行标志(TF) 954.3.2 高级语言的单步执行 974.3.3 任务状态段陷阱标志 984.3.4 分支到分支单步执行标志(BTF) .984.4 实模式调试器例析 .1004.4.1 Debug.exe .1014.4.2 8086 Monitor 1024.4.3 关键实现 1

8、034.5 本章总结 .105参考文献 105第 5 章 分支记录和性能监视 1075.1 分支监视概览 .107目 录软件调试xxv5.2 使用寄存器的分支记录 .1085.2.1 LBR 1085.2.2 LBR 栈 .1105.2.3 应用示例 1105.3 使用内存的分支记录 .1135.3.1 DS 存储区 1145.3.2 启用 DS 机制 .1155.3.3 调试控制寄存器 1165.4 DS 示例:CpuWhere .1175.4.1 驱动程序 1175.4.2 应用界面 1205.4.3 局限性和扩展建议 1225.5 性能监视 .1235.5.1 奔腾处理器的性能监视机制

9、1235.5.2 P6 处理器的性能监视机制 .1245.5.3 P4 处理器的性能监视 .1265.5.4 架构性的性能监视机制 1305.5.5 Core 微架构处理器的性能监视机制 1305.5.6 资源 1315.6 本章总结 .132参考文献 132第 6 章 机器检查架构( MCA) .1336.1 奔腾处理器的机器检查机制 .1346.2 MCA .1356.2.1 概览 1356.2.2 MCA 全局寄存器 1366.2.3 MCA 错误报告寄存器 1376.2.4 扩展的机器检查状态寄存器 1396.2.5 MCA 错误编码 1406.3 编写 MCA 软件 .1416.3.

10、1 基本算法 1416.3.2 简单示例 1436.3.3 在 Windows 系统中的应用 .1446.4 本章总结 .145参考文献 145目 录软件调试xxvi第 7 章 JTAG 调试 .1477.1 简介 .1477.1.1 ICE1487.1.2 JTAG.1487.2 JTAG 原理 1497.2.1 边界扫描链路 1497.2.2 TAP 信号 1517.2.3 TAP 寄存器 1517.2.4 TAP 控制器 1527.2.5 TAP 指令 1537.3 JTAG 应用 1547.3.1 JTAG 调试 1557.3.2 调试端口(Debug Port) 1567.4 IA-

11、32 处理器的 JTAG 支持 1567.4.1 P6 处理器的 JTAG 实现 .1567.4.2 探测模式 1587.4.3 ITP 和 XDP 1587.4.4 XDP 1607.4.5 典型应用 1617.5 本章总结 .161参考文献 162第 3 篇 操作系统的调试支持 163第 8 章 Windows 概要 .1658.1 简介 .1658.2 进程和进程空间 .1678.2.1 进程和线程 1678.2.2 进程空间 1678.2.3 进程资源 1688.2.4 EPROCESS 结构 .1698.2.5 访问令牌 1728.2.6 PEB.1738.2.7 其他字段 1748

12、.2.8 SessionId.1748.2.9 进程 ID .1758.2.10 父进程 ID .1758.2.11 页目录基地址 175目 录软件调试xxvii8.2.12 对象表格 1758.2.13 句柄数量 1768.2.14 观察进程 1768.3 内核模式和用户模式 .1768.3.1 访问模式 1778.3.2 使用 INT 2E 切换到内核模式 1778.3.3 快速系统调用 1798.3.4 逆向调用 1828.3.5 实例分析 1838.4 架构和系统部件 .1848.4.1 概览 1848.4.2 内核空间 1858.4.3 内核文件和 HAL 文件 1858.4.4 系

13、统和 IDLE 进程 .1878.4.5 用户空间 1898.4.6 NTDLL.DLL 1908.4.7 环境子系统 1908.5 本章总结 .192参考文献 192第 9 章 用户态调试模型 .1939.1 概览 .1939.1.1 参与者 1949.1.2 调试子系统 1959.1.3 调试事件驱动 1959.2 采集调试消息 .1969.2.1 消息常量 1969.2.2 进程和线程创建消息 1979.2.3 进程和线程退出消息 1979.2.4 模块映射和反映射消息 1989.2.5 异常消息 2009.3 发送调试消息 .2009.3.1 调试消息结构 2009.3.2 Dbgkp

14、SendApiMessage 函数 2019.3.3 控制被调试进程 2029.4 调试子系统服务器(XP 之后) 2039.4.1 DebugObject.203目 录软件调试xxviii9.4.2 创建调试对象 2049.4.3 设置调试对象 2049.4.4 传递调试消息 2049.4.5 杜撰的调试消息 2069.4.6 清除调试对象 2079.4.7 内核服务 2079.4.8 全景 2089.5 调试子系统服务器(XP 之前) 2109.5.1 概览 2109.5.2 Windows 会话管理器 2119.5.3 Windows 环境子系统服务器进程 2139.5.4 调用 CSR

15、SS 的服务 2149.5.5 CsrCreateProcess 服务 .2169.5.6 CsrDebugProcess 服务 .2179.6 比较两种模型 .2199.6.1 Windows 2000 调试子系统的 优点 .2199.6.2 Windows 2000 调试子系统的 安全问题 .2199.6.3 Windows XP 模型的优点 2209.6.4 Windows XP 引入的新调试功能 2219.7 NTDLL 中的调试支持例程 .2219.7.1 DbgUi 函数 2229.7.2 DbgSs 函数 .2239.7.3 Dbg 函数 2239.8 调试 API .2249.

16、9 本章总结 .226参考文献 226第 10 章 用户态调试过程 .22710.1 调试器进程 .22710.1.1 线程模型 22710.1.2 调试器的工作线程 22810.1.3 DbgSsReserved 字段 22910.2 被调试进程 .23110.2.1 特征 23110.2.2 DebugPort 字段 23110.2.3 BeingDebugged 字段 .23210.2.4 观察 DebugPort 字段和 BeingDebugged 字段 .232目 录软件调试xxix10.2.5 调试会话 23410.3 从调试器中启动被调试程序 .23410.3.1 CreateP

17、rocess API 23410.3.2 第一批调试事件 23610.3.3 初始断点 23710.3.4 自动启动调试器 23810.4 附加到已经启动的进程 .24010.4.1 DebugActiveProcess API .24010.4.2 示例:TinyDbgr 程序 24110.5 处理调试事件 .24310.5.1 DEBUG_EVENT 结构 .24410.5.2 WaitForDebugEvent API24510.5.3 调试事件循环 24610.5.4 回复调试事件 24810.5.5 定制调试器的事件处理方式 24910.6 中断到调试器 .25110.6.1 初始断

18、点 25110.6.2 编程时加入断点 25210.6.3 通过调试器设置断点 25210.6.4 通过远程线程触发断点异常 25210.6.5 在线程当前执行位置设置断点 25410.6.6 动态调用远程函数 25510.6.7 挂起中断 25610.6.8 调试热键(F12) 25710.6.9 窗口更新 25710.7 输出调试字符串 .25910.7.1 发送调试信息 25910.7.2 使用调试器接收调试信息 26010.7.3 使用工具接收调试信息 26110.8 终止调试会话 .26610.8.1 被调试进程退出 26610.8.2 调试器进程退出 26710.8.3 分离被调试

19、进程 26910.8.4 退出时分离 27110.9 本章总结 .271参考文献 271目 录软件调试xxx第 11 章 中断和异常管理 .27311.1 中断描述符表 .27311.1.1 概况 27311.1.2 门描述符 27511.1.3 执行中断和异常处理函数 27611.1.4 IDT 表一览 .27911.2 异常的描述和登记 .28011.2.1 EXCEPTION_RECORD 结构 .28111.2.2 登记 CPU 异常 28311.2.3 登记软件异常 28311.3 异常分发过程 .28411.3.1 KiDispatchException 函数 .28411.3.2

20、 内核态异常的分发过程 28611.3.3 用户态异常的分发过程 28711.3.4 归纳 28911.4 结构化异常处理(SEH) .29011.4.1 SEH 简介 29111.4.2 SEH 的终结处理 29111.4.3 SEH 的异常处理 29411.4.4 过滤表达式 29511.4.5 异常处理块 29911.4.6 嵌套使用终结处理和异常处理 30111.5 向量化异常处理(VEH) 30211.5.1 登记和注销 30211.5.2 调用 VEH .30311.5.3 示例 30411.6 本章总结 .308参考文献 308第 12 章 未处理异常和 JIT 调试 .3091

21、2.1 简介 .30912.2 默认的异常处理器 .31112.2.1 BaseProcessStart 函数中的 SEH 处理器 31112.2.2 编译器插入的 SEH 处理器 .31212.2.3 基于信号的异常处理 31412.2.4 试验:观察默认的异常处理器 31512.2.5 BaseThreadStart 函数中的 SEH 处理器 .317目 录软件调试xxxi12.3 未处理异常过滤函数 .31812.3.1 Windows XP 之前 31912.3.2 Windows XP.32212.4 应用程序错误对话框 .32812.4.1 用 HardError 机制提示应用程序

22、错误 32812.4.2 使用 ReportFault API 提示应用程序错误 33012.5 JIT 调试和 Dr. Watson.33412.5.1 配置 JIT 调试器 .33412.5.2 启动 JIT 调试器 .33612.5.3 自己编写 JIT 调试器 .33812.6 顶层异常过滤函数 .34012.6.1 注册 34012.6.2 C 运行时库的顶层过滤函数 .34112.6.3 执行 34212.6.4 调试 34212.7 Dr. Watson 34312.7.1 配置和察看模式 34412.7.2 安装为 JIT 调试器模式 .34612.7.3 JIT 调试模式 3

23、4612.8 DRWTSN32 的日志文件 .34712.8.1 异常信息 34712.8.2 系统信息 34812.8.3 任务列表 34812.8.4 模块列表 34812.8.5 线程状态 34912.8.6 函数调用序列 34912.8.7 原始栈数据 35012.9 用户态转储文件 .35112.9.1 文件格式概览 35112.9.2 数据流 35212.9.3 产生转储文件 35312.9.4 读取转储文件 35412.9.5 利用转储文件分析问题 35512.10 本章总结 .357参考文献 357目 录软件调试xxxii第 13 章 硬错误和蓝屏 .35913.1 硬错误提示

24、 .35913.1.1 缺盘错误 36013.1.2 NtRaiseHardError.36013.1.3 ExpRaiseHardError.36113.1.4 CSRSS 中的分发过程 .36313.2 蓝屏终止(BSOD) 36613.2.1 简介 36713.2.2 发起和产生过程 36813.2.3 诊断蓝屏错误 37013.2.4 手工触发蓝屏 37113.3 系统转储文件 .37113.3.1 分类 37113.3.2 文件格式 37213.3.3 产生方法 37313.4 分析系统转储文件 .37413.4.1 初步分析 37413.4.2 线程和栈回溯 37513.4.3 陷

25、阱帧 37613.4.4 自动分析 37713.5 辅助的错误提示方法 .38013.5.1 MessageBeep 38013.5.2 Beep 函数 .38313.5.3 闪动窗口 38413.6 配置错误提示机制 .38413.6.1 SetErrorMode API38513.6.2 IoSetThreadHardErrorMode.38713.6.3 蓝屏后自动重启 38713.7 防止滥用错误提示机制 .38913.8 本章总结 .390参考文献 390第 14 章 错误报告 39114.1 WER 1.039214.1.1 客户端 39214.1.2 报告模式 39314.1.3

26、 传输方式 394目 录软件调试xxxiii14.2 系统错误报告 .39514.3 WER 服务器端 .39714.3.1 WER 服务 39814.3.2 错误报告分类方法 39814.3.3 报告回应(Response) .39914.4 WER 2.039914.4.1 模块变化 39914.4.2 创建报告 40014.4.3 提交报告 40114.4.4 典型应用 40214.5 CER.40314.6 本章总结 .404参考文献 404第 15 章 日志 .40515.1 日志简介 .40515.2 ELF 的架构.40615.2.1 ELF 的日志文件 40715.2.2 事件

27、源 40815.2.3 ELF 服务 40915.3 ELF 的数据组织.40915.3.1 日志记录 40915.3.2 添加日志记录 41015.3.3 API 一览 .41215.4 察看和使用 ELF 日志41315.5 CLFS 的组成和原理 41415.5.1 组成 41415.5.2 存储结构 41515.5.3 LSN.41615.6 CLFS 的使用方法 41615.6.1 创建日志文件 41615.6.2 添加 CLFS 容器 .41715.6.3 创建编组区 41715.6.4 添加日志记录 41815.6.5 读日志记录 41815.6.6 查询信息 41915.6.7

28、 管理和备份 420目 录软件调试xxxiv15.7 本章总结 .420参考文献 420第 16 章 事件追踪 42116.1 简介 .42116.2 ETW 的架构 .42216.3 提供 ETW 消息 42416.4 控制 ETW 会话 42516.5 消耗 ETW 消息 42716.6 格式描述 .42816.6.1 MOF 文件 .42916.6.2 WPP 43016.7 NT Kernel Logger.43216.7.1 观察 NKL 的追踪事件 43216.7.2 编写代码控制 NKL .43416.7.3 NKL 的实现 .43516.8 Global Logger Sess

29、ion43616.8.1 启动 GLS 会话 .43616.8.2 配置 GLS43716.8.3 在驱动程序中使用 GLS43816.8.4 Autologgers.43816.8.5 BootVis 工具 43916.9 Crimson API .44016.9.1 发布事件 44016.9.2 消耗事件 44116.9.3 格式描述 44116.9.4 收集和观察事件 44216.9.5 Crimson API 的实现 44316.10 本章总结 .443参考文献 444第 17 章 WHEA .44517.1 目标和架构 .44517.1.1 目标 44517.1.2 架构 44617

30、.1.3 PSHED44817.2 错误源 .45017.2.1 标准的错误源 450目 录软件调试xxxv17.2.2 通过 ACPI 表来定义错误源 .45017.2.3 通过 PSHED 插件来报告错误源 45117.3 错误处理过程 .45217.3.1 WHEA_ERROR_PACKET 结构 45217.3.2 处理过程 45417.3.3 WHEA_ERROR_RECORD 结构 45517.3.4 Firmware First Model.45717.4 错误持久化 .45717.4.1 ERST 45717.4.2 工作过程 45817.5 注入错误 .45917.6 本章总

31、结 .459参考文献 460第 18 章 内核调试引擎 .46118.1 概览 .46218.1.1 KD.46218.1.2 角色 46218.1.3 组成 46318.1.4 模块文件 46418.1.5 版本差异 46518.2 连接 .46518.2.1 串行口 46618.2.2 1394 46718.2.3 USB 2.0 47018.2.4 管道 47218.2.5 选择连接方式 47318.2.6 解决连接问题 47418.3 启用 .47518.3.1 BOOT.INI.47518.3.2 BCD 47618.3.3 高级启动选项 47818.4 初始化 .47818.4.1

32、 Windows 启动过程概述 47818.4.2 第一次调用 KdInitSystem .48118.4.3 第二次调用 KdInitSystem .48218.4.4 通信扩展模块的阶段 1 初始化 482目 录软件调试xxxvi18.5 内核调试协议 .48318.5.1 数据包 48318.5.2 报告状态变化 48518.5.3 访问目标系统 48618.5.4 恢复目标系统执行 48818.5.5 版本 48918.5.6 典型对话过程 49018.5.7 KdTalker.49218.6 与内核交互 .49218.6.1 中断到调试器 49318.6.2 KdpSendWaitC

33、ontinue.49318.6.3 退出调试器 49518.6.4 轮询中断包 49518.6.5 接收和报告异常事件 49618.6.6 调试服务 49718.6.7 打印调试信息 49918.6.8 加载调试符号 50018.6.9 更新系统文件 50118.7 建立和维持连接 .50218.7.1 最早的调试机会 50218.7.2 初始断点 50518.7.3 断开和重新建立连接 50818.8 本地内核调试 .50918.8.1 LiveKD .50918.8.2 Windows 自己的本地内核调试支持 50918.8.3 安全问题 51118.9 本章总结 .511参考文献 512

34、第 19 章 Windows 的验证机制 .51319.1 简介 .51419.1.1 驱动程序验证器 51419.1.2 应用程序验证器 51419.1.3 WHQL 测试 .51519.2 驱动验证器的工作原理 .51519.2.1 设计原理 51519.2.2 初始化 516目 录软件调试xxxvii19.2.3 挂接验证函数 51719.2.4 验证函数的执行过程 51919.2.5 报告验证失败 52019.3 使用驱动验证器 .52119.3.1 验证项目 52119.3.2 启用驱动验证 52219.3.3 开始验证 52319.3.4 观察验证情况 52419.3.5 WinD

35、BG 的扩展命令 52519.4 应用程序验证器的工作原理 .52619.4.1 原理和组成 52619.4.2 初始化 52719.4.3 挂接 API.52919.4.4 验证函数的执行过程 53119.4.5 报告验证失败 53219.4.6 验证停顿 53319.5 使用应用程序验证器 .53319.5.1 应用验证管理器 53319.5.2 验证项目 53519.5.3 配置验证属性 53619.5.4 配置验证停顿 53619.5.5 编程调用 53619.5.6 调试扩展 53719.6 本章总结 .537参考文献 538第 4 篇 编译器的调试支持 539第 20 章 编译和编

36、译期检查 .54120.1 程序的构建过程 .54120.1.1 链接器 54220.1.2 加载器 54320.2 编译 .54320.2.1 前端 54320.2.2 后端 54420.3 Visual C+编译器 54420.3.1 MSVC 简史 54420.3.2 MSVC6.545目 录软件调试xxxviii20.3.3 VS7 和 VS8 54620.3.4 构建程序 54820.3.5 调试 54920.4 编译错误和警告 .54920.4.1 错误 ID 和来源 54920.4.2 编译警告 55020.5 编译期检查 .55120.5.1 未初始化的局部变量 55220.5

37、.2 类型不匹配 55320.5.3 使用编译器指令 55320.5.4 标注 55420.5.5 驱动程序静态验证器(SDV) 55420.6 标准标注语言 .55520.6.1 缓冲区标注符 55520.6.2 高级标注符 55720.7 本章总结 .558参考文献 558第 21 章 运行库和运行期检查 55921.1 C/C+运行库 55921.1.1 C 运行库 .56021.1.2 C+标准库 .56121.2 链接运行库 .56221.2.1 静态链接和动态链接 56321.2.2 Lib 文件 56421.3 运行库的初始化和清理 .56521.3.1 介入方法 56521.3

38、.2 初始化 56621.3.3 多个运行库实例 56821.4 运行期检查 .56921.4.1 自动的运行期检查 57021.4.2 断言(ASSERT ) .57121.4.3 _RPT 宏 57421.5 报告运行期检查错误 .57421.5.1 _CrtDbgReport .57421.5.2 _CrtSetReportMode57721.5.3 _CrtSetReportFile.578目 录软件调试xxxix21.5.4 _CrtSetReportHook 57821.5.5 _CrtSetReportHook2 57921.5.6 使用其他函数报告 RTC 错误 57921.6

39、 本章总结 .580参考文献 580第 22 章 栈和函数调用 .58122.1 简介 .58122.1.1 用户态栈和内核态栈 58222.1.2 函数、过程和方法 58422.2 栈的创建过程 .58522.2.1 内核态栈的创建 58522.2.2 用户态栈的创建 58622.2.3 跟踪用户态栈的创建过程 58822.3 CALL 和 RET 指令 59022.3.1 CALL 指令 .59022.3.2 RET 指令 59122.3.3 观察函数调用和返回过程 59122.3.4 跨特权级调用 59422.4 局部变量和栈帧 .59522.4.1 局部变量的分配和释放 59522.4

40、.2 EBP 寄存器和栈帧 59822.4.3 帧指针和栈帧的遍历 60222.5 帧指针省略(FPO) .60422.6 栈指针检查 .60622.7 调用协定 .60922.7.1 C 调用协定 .60922.7.2 标准调用协定 61022.7.3 快速调用协定 61022.7.4 This 调用协定 61122.7.5 CLR 调用协定 .61222.7.6 X64 调用协定 61222.7.7 通过编译器开关改变默认调用协定 61322.7.8 函数返回值 61322.7.9 归纳和补充 61522.8 栈空间的增长和溢出 .61622.8.1 栈空间的自动增长 617目 录软件调试

41、xl22.8.2 栈溢出 61722.8.3 分配检查 62022.9 栈下溢 .62322.10 缓冲区溢出 .62422.10.1 感受缓冲区溢出 62422.10.2 缓冲区溢出攻击 62622.11 变量检查 .62822.12 基于 Cookie 的安全检查 .63622.12.1 安全 Cookie 的产生、植入和检查 .63622.12.2 报告安全检查失败 63822.12.3 编写安全的代码 64022.13 本章总结 .642参考文献 642第 23 章 堆和堆检查 64323.1 理解堆 .64423.2 堆的创建和销毁 .64623.2.1 进程的默认堆 64623.2

42、.2 创建私有堆 64723.2.3 堆列表 64823.2.4 销毁堆 64823.3 分配和释放堆块 .64923.3.1 HeapAlloc.64923.3.2 CRT 分配函数 .65023.3.3 释放从堆中分配的内存 65123.3.4 GlobalAlloc 和 LocalAlloc.65223.3.5 解除提交 65323.4 堆的内部结构 .65423.4.1 结构和布局 65423.4.2 HEAP 结构 .65623.4.3 HEAP_SEGMENT 结构 65723.4.4 HEAP_ENTRY 结构 65823.4.5 分析堆块的分配和释放过程 65823.4.6 使

43、用!heap 命令观察堆块信息 66023.5 低碎片堆(LFH) .66123.6 堆的调试支持 .66223.6.1 全局标志 662目 录软件调试xli23.6.2 释放检查 66323.7 栈回溯数据库 .66623.7.1 工作原理 66623.7.2 DH 和 UMDH 工具 .66823.7.3 定位内存泄漏 66823.8 堆溢出和检测 .67023.8.1 堆缓冲区溢出 67023.8.2 调用时验证 67323.8.3 堆尾检查(Tail Check) .67423.9 页堆 .67723.9.1 总体结构 67723.9.2 启用和观察页堆 67823.9.3 堆块结构

44、67923.9.4 检测溢出 68223.10 准页堆 .68323.10.1 启用准页堆 68323.10.2 结构布局 68423.10.3 检测溢出 68723.11 CRT 堆 68823.11.1 CRT 堆的三种模式 .68823.11.2 SBH 简介 .68923.11.3 创建和选择模式 69023.11.4 CRT 堆的终止 .69123.12 CRT 堆的调试堆块 69223.12.1 _CrtMemBlockHeader 结构 .69223.12.2 块类型 69323.12.3 分配堆块 69423.13 CRT 堆的调试功能 69823.13.1 内存分配序号断点

45、69823.13.2 分配挂钩 69923.13.3 自动和手动检查 69923.14 堆块转储 .70023.14.1 内存状态和检查点 70023.14.2 _CrtMemDumpAllObjectsSince.70123.14.3 转储挂钩 70223.15 泄漏转储 .70423.15.1 _CrtDumpMemoryLeaks704目 录软件调试xlii23.15.2 何时调用 70523.15.3 定位导致泄漏的源代码 70623.16 本章总结 .709参考文献 710第 24 章 异常处理代码的编译 71124.1 概览 .71124.2 FS:0链条 71324.2.1 TE

46、B 和 TIB 结构 .71324.2.2 ExceptionList 字段 .71424.2.3 登记异常处理器 71524.3 遍历 FS:0链条 .71624.3.1 RtlDispatchException.71624.3.2 KiUserExceptionDispatcher .72024.4 执行异常处理函数 .72124.4.1 SehRaw 实例 72124.4.2 执行异常处理函数 72224.5 _try_except()结构 .72424.5.1 与手工方法的对应关系 72424.5.2 _try_except()结构的编译 .72524.5.3 范围表 72724.5.

47、4 TryLevel .72824.5.5 _try_except()结构的执行 .73024.5.6 _SEH_prolog 和_SEH_epilog 73124.6 安全问题 .73224.6.1 安全 Cookie73224.6.2 SAFESEH.73524.6.3 基于表的异常处理 73724.7 本章总结 .737参考文献 738第 25 章 调试符号 73925.1 名称修饰 .73925.1.1 C 和 C+ 74025.1.2 C 的名称修饰规则 .74125.1.3 C+的名称修饰规则 .74125.2 调试信息的存储格式 .74225.2.1 COFF 格式 .742目

48、录软件调试xliii25.2.2 CodeView(CV )格式 74325.2.3 PDB 格式 .74425.2.4 DWARF 格式 .74525.3 目标文件中的调试信息 .74525.3.1 IMAGE_FILE_HEADER 结构 74625.3.2 IMAGE_SECTION_HEADER 结构 .74725.3.3 节的重定位信息和行号信息 74725.3.4 存储调试数据的节 74825.3.5 调试符号表 75025.3.6 COFF 字符串表 .75125.3.7 COFF 符号例析 .75125.4 PE 文件中的调试信息 .75325.4.1 PE 文件布局 .753

49、25.4.2 IMAGE_OPTIONAL_HEADER 结构 75525.4.3 调试数据目录 75725.4.4 调试数据 75825.4.5 使用 WinDBG 观察 PE 文件中的调试信息 76025.4.6 调试信息的产生过程 76125.5 DBG 文件 .76225.5.1 从 PE 文件产生 DBG 文件 .76225.5.2 DBG 文件的布局 .76225.6 PDB 文件 76425.6.1 复合文件 76425.6.2 PDB 文件布局 .76525.6.3 PDB 签名 .76525.6.4 Magic 代码 .76625.6.5 PDB_HEADER 76725.6.6 根数据流流目录 76825.6.7 页分配表 76825.6.8 访问 PDB 文件的方式 76925.6.9 PDB 文件的产生过程 .77025.7 有关的编译和链接选项 .77125.7.1 控制调试信息的编译选项 77125.7.2 控制调试信息的链接选项 77125.7.3 不同链接和编译选项的比较 77325.8 PDB 文件中的数据表 77525.8.1 符号表 775目 录软件调试xliv25.8.2 源文件表 77725.8.3 节贡献表 77725.8.4 段信息表 77825.8.5 注入源代码表 77825.8.6 帧

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报