《软件调试第二版上册》PDF电子书网盘资源下载地址分享!

2021-02-26 21:51:50 小八 0点热度 1人阅读

简介:《软件调试第二版上册》本书是靠前当前集中介绍软件调试主题的著作。本书第2卷分为5篇,共30章,主要围绕Windows系统展开介绍....

作  者:张银奎 著

定  价:199

出 版 社:人民邮电出版社

出版日期:2020年09月01日

页  数:888

装  帧:平装

ISBN:9787115538383

《软件调试第二版上册》PDF电子书网盘资源下载地址分享!

作者:

张银奎,靠前的调试技术专家。毕业于上海交通大学信息与控制工程系,长期从事软件开发和研究工作,曾在英特尔工作13 年,对 IA-32 架构、操作系统内核、驱动程序,尤其是对软件调试有较深入的研究。

简介:(1~4章)介绍Windows系统简史、进程和线程、架构和系统部件,以及Windows系统的启动过程,既从空间角度讲述Windows的软件世界,也从时间角度描述Windows世界的搭建过程。第二篇(第5~8章)描述特殊的过程调用、垫片、托管世界和Linux子系统。第三篇(第9~19章)深入探讨用户态调试模型、用户态调试过程、中断和异常管理、未处理异常和JIT调试、硬错误和蓝屏、错误报告、日志、事件追踪、WHEA、内核调试引擎和验证机制。第四篇(第20~25章)从编译和编译期检查、运行时库和运行期检查、栈和函数调用、堆和堆检查、异常处理代码的编译、调试符号等方面概括编译器的调试支持。第五篇(第26~30章)首先纵览调试器的发展历史、工作模型和经典架构,然后分别讨论集成在VisualStu等

目录:

第1章Windows系统简史

1.1源于DOS

1.2功在NT

1.3Windows2000彰显实力

1.4之作:WindowsXP和WindowsServer2003

1.5WindowsVista折戟沙场

1.6Windows7享利中兴

1.7Windows8革新受挫

1.8Windows10何去何从

1.9本章总结17

参考资料

第2章进程和线程

2.1任务

2.2进程资源

2.3进程空间

2.3.132位进程空间

2.3.2位进程空间

2.4EPROCESS结构

2.5PEB

2.6内核模式和用户模式

2.6.1访问模式

2.6.2使用INT2E切换到内核模式

2.6.3快速系统调用

2.6.4逆向调用

2.6.5实例分析

2.7线程

2.7.1ETHREAD

2.7.2TEB

2.8WoW进程

2.8.1架构

2.8.2工作过程

2.8.3注册表重定向

2.8.4注册表反射

2.8.5文件系统重定向

2.9创建进程

2.10小进程和Pico进程

2.10.1小进程

2.10.2Pico进程

2.11任务管理器

2.12本章总结

参考资料

第3章架构和系统部件

3.1系统概览

3.1.1内核空间

3.1.2用户空间

3.2内核和HAL模块

3.2.1内核文件

3.2.2HAL文件

3.3空闲进程

3.4系统进程

3.5内核空间的其他模块

3.6NTDLL.DLL

3.6.1角色

3.6.2调用系统服务的桩函数

3.6.3映像文件加载器

3.6.4运行时库

3.6.5其他功能

3.7环境子系统

3.8原生进程

3.8.1特点

3.8.2SMSS

3.8.3CSRSS

3.9本章总结

参考资料

第4章启动过程

4.1BootMgr

4.1.1工作过程

4.1.2调试方法

4.2WinLoad

4.3内核初始化

4.3.1NT的入口函数

4.3.2内核初始化

4.4执行体的阶段0初始化

4.4.1总体过程

4.4.2创建特殊进程

4.5执行体的阶段1初始化

4.5.1Phase1Initialization

4.5.2唤醒其他CPU

4.5.3非启动CPU的起步路线

4.5.4漫长的I/O初始化

4.5.5更新进度

4.6创建用户空间

4.6.1创建会话管理器进程

4.6.2建立环境子系统

4.6.3创建窗口站和桌面

4.6.4用户登录

4.7本章总结

参考资料

第二篇探微

第5章特殊的过程调用

5.1异步过程调用

5.2中断请求级别

5.2.1设计初衷

5.2.2基本原理

5.2.3析疑

5.3延迟过程调用

5.3.1使用模式

5.3.2黏滞在DPC

5.4本地过程调用

5.5远程过程调用

5.5.1工作模型

5.5.2RPC子系统服务

5.5.3端点和协议串

5.5.4蜂巢

5.5.5案例和调试方法

5.6本章总结

参考资料

第6章垫片

6.1垫片数据库

6.1.1认识SDB文件

6.1.2定制的SDB文件

6.1.3修补模式

6.2AppHelp

6.2.1SDB功能

6.2.2垫片引擎

6.2.3AD挂钩

6.2.4穿山甲挂钩

6.3垫片动态库

6.3.1AcLayers.DLL

6.3.2AcGenral.DLL和AcSpecfc.DLL

6.3.3其他垫片模块

6.4应用程序垫片的工作过程

6.4.1在父进程中准备垫片数据

6.4.2在新进程中加载和初始化垫片引擎

6.4.3加载垫片模块

6.4.4落实挂钩

6.4.5执行垫片

6.5内核垫片引擎

6.5.1数据和配置

6.5.2初始化

6.5.3KSE垫片结构

6.5.4注册垫片

6.5.5部署垫片

6.5.6执行垫片

6.6本章总结

参考资料

第7章托管世界

7.1简要历史

7.2宏伟蓝图

7.3类和方法表

7.4辅助调试线程

7.4.1托管调试模型

7.4.2RCThread

7.4.3刺探线程

7.5CLR4的调试模型重构

7.6SOS扩展

7.6.1加载SOS

7.6.2设置断点

7.6.3简要原理

7.7本章总结

参考资料

第8章Linux子系统

8.1源于Drawbridge

8.2融入NT

8.3总体架构

8.4子系统内核模块

8.5微软版Linux内核

8.6Linux子系统服务器

8.7WSL启动器

8.8交开发

8.9WSL2

8.10本章总结

参考资料

第三篇操作系统的调试支持

第9章用户态调试模型

9.1概览

9.1.1参与者

9.1.2调试子系统

9.1.3调试事件驱动

9.2采集调试消息

9.2.1消息常量

9.2.2进程和线程创建消息

9.2.3进程和线程退出消息

9.2.4模块映射和反映射消息

9.2.5异常消息

9.3发送调试消息

9.3.1调试消息结构

9.3.2DbgkpSendApiMessage函数

9.3.3控制被调试进程

9.4调试子系统服务器(WindowsXP之后)

9.4.1DebugObject

9.4.2创建调试对象

9.4.3设置调试对象

9.4.4传递调试消息

9.4.5杜撰的调试消息

9.4.6清除调试对象

9.4.7内核服务

9.4.8全景

9.5调试子系统服务器(WindowsXP之前)

9.5.1概览

9.5.2Windows会话管理器

9.5.3Windows环境子系统服务器进程

9.5.4调用CSRSS的服务

9.5.5CsrCreateProcess服务

9.5.6CsrDebugProcess服务

9.6比较两种模型

9.6.1Windows2000调试子系统的优点

9.6.2Windows2000调试子系统的安全问题

9.6.3WindowsXP的调试模型的优点

9.6.4WindowsXP引入的新调试功能

9.7NTDLL.DLL中的调试支持例程

9.7.1DbgUi函数

9.7.2DbgSs函数

9.7.3Dbg函数

9.8调试API

9.9本章总结

参考资料

0章用户态调试过程

10.1调试器进程

10.1.1线程模型

10.1.2调试器的工作线程

10.1.3DbgSsReserved字段

10.2被调试进程

10.2.1特征

10.2.2DebugPort字段

10.2.3BeingDebugged字段

10.2.4观察DebugPort字段和BeingDebugged字段

10.2.5调试会话

10.3从调试器中启动被调试程序

10.3.1CreateProcessAPI

10.3.2批调试事件

10.3.3初始断点

10.3.4自动启动调试器

10.4附加到已经启动的进程中

10.4.1DebugActiveProcessAPI

10.4.2示例:TinyDbgr程序

10.5处理调试事件

10.5.1DEBUG_EVENT结构

10.5.2WaitForDebugEventAPI

10.5.3调试事件循环

10.5.4回复调试事件

10.5.5定制调试器的事件处理方式

10.6中断到调试器

10.6.1初始断点

10.6.2编程时加入断点

10.6.3通过调试器设置断点

10.6.4通过远程线程触发断点异常

10.6.5在线程当前执行位置设置断点

10.6.6动态调用远程函数

10.6.7挂起中断

10.6.8调试快捷键(F12键)

10.6.9窗口更新

10.7输出调试字符串

10.7.1发送调试信息

10.7.2使用调试器接收调试信息

10.7.3使用工具接收调试信息

10.8终止调试会话

10.8.1被调试进程退出

10.8.2调试器进程退出

10.8.3分离被调试进程

10.8.4退出时分离

10.9本章总结

参考资料

1章中断和异常管理

11.1中断描述符表

11.1.1概况

11.1.2门描述符

11.1.3执行中断和异常处理函数

11.1.4IDT一览

11.2异常的描述和登记

11.2.1EXCEPTION_RECORD结构

11.2.2登记CPU异常

11.2.3登记软件异常

11.3异常分发过程

11.3.1KiDispatchException函数

11.3.2内核态异常的分发过程

11.3.3用户态异常的分发过程

11.3.4归纳

11.4结构化异常处理

11.4.1SEH简介

11.4.2SHE机制的终结处理

11.4.3SEH机制的异常处理

11.4.4过滤表达式

11.4.5异常处理块

11.4.6嵌套使用终结处理和异常处理

11.5向量化异常处理

11.5.1登记和注销

11.5.2调用结构化异常处理器

11.5.3示例

11.6本章总结

参考资料

2章未处理异常和JIT调试

12.1简介

12.2默认的异常处理器

12.2.1BaseProcessStart函数中的结构化异常处理器

12.2.2编译器插入的SEH处理器

12.2.3基于信号的异常处理

12.2.4实验:观察默认的异常处理器

12.2.5BaseThreadStart函数中的结构化异常处理器

12.3未处理异常过滤函数

12.3.1WindowsXP之前的异常处理机制

12.3.2WindowsXP中的异常处理机制

12.4“应用程序错误”对话框

12.4.1用HardError机制提示应用程序错误

12.4.2使用ReportFaultAPI提示应用程序错误

12.5JIT调试和Dr.Watson

12.5.1配置JIT调试器

12.5.2启动JIT调试器

12.5.3自己编写JIT调试器

12.6顶层异常过滤函数

12.6.1注册

12.6.2C运行时库的顶层过滤函数

12.6.3执行

12.6.4调试

12.7Dr.Watson

12.7.1配置和查看模式

12.7.2设置为默认的JIT调试器

12.7.3JIT调试模式

12.8DRWTSN32的日志文件

12.8.1异常信息

12.8.2系统信息

12.8.3任务列表

12.8.4模块列表

12.8.5线程状态

12.8.6函数调用序列

12.8.7原始栈数据

12.9用户态转储文件

12.9.1文件格式概览

12.9.2数据流

12.9.3产生转储文件

12.9.4读取转储文件

12.9.5利用转储文件分析问题

12.10本章总结

参考资料

3章硬错误和蓝屏

13.1硬错误提示

13.1.1缺盘错误

13.1.2NtRaiseHardError

13.1.3ExpRaiseHardError

13.1.4CSRSS中的分发过程

13.2蓝屏终止

13.2.1简介

13.2.2发起和产生过程

13.2.3诊断蓝屏错误

13.2.4手工触发蓝屏

13.3系统转储文件

13.3.1分类

13.3.2文件格式

13.3.3产生方法

13.4分析系统转储文件

13.4.1初步分析

13.4.2线程和栈回溯

13.4.3陷阱帧

13.4.4自动分析

13.5辅助的错误提示方法

13.5.1MessageBeep

13.5.2Beep函数

13.5.3闪动窗口

13.6配置错误提示机制

13.6.1SetErrorModeAPI

13.6.2IoSetThreadHardErrorMode

13.6.3蓝屏后自动重启

13.7防止滥用错误提示机制

13.8本章总结

参考资料

4章错误报告

14.1WER1.0

14.1.1客户端

14.1.2报告模式

14.1.3传输方式

14.2系统错误报告

14.3WER服务器端

14.3.1WER服务

14.3.2错误报告分类方法

14.3.3报告回应

14.4WER2.0

14.4.1模块变化

14.4.2创建报告

14.4.3提交报告

14.4.4典型应用

14.5CER

14.6本章总结

参考资料

5章日志

15.1日志简介

15.2ELF的架构

15.2.1ELF的日志文件

15.2.2事件源

15.2.3ELF服务

15.3ELF的数据组织350

15.3.1日志记录

15.3.2添加日志记录

15.3.3API一览

15.4查看和使用ELF日志

15.5CLFS的组成和原理

15.5.1组成

15.5.2存储结构

15.5.3LSN

15.6CLFS的使用方法

15.6.1创建日志文件

15.6.2添加CLFS容器

15.6.3创建编组区

15.6.4添加日志记录

15.6.5读日志记录

15.6.6查询信息

15.6.7管理和备份

15.7本章总结

参考资料

6章事件追踪

16.1简介

16.2ETW的架构

16.3提供ETW消息

16.4控制ETW会话

16.5消耗ETW消息

16.6格式描述

16.6.1MOF文件

16.6.2WPP

16.7NT内核记录器

16.7.1观察NKL的追踪事件

16.7.2编写代码控制NKL

16.7.3NKL的实现

16.8GlobalLoggerSession

16.8.1启动GLS会话

16.8.2配置GLS

16.8.3在驱动程序中使用GLS

16.8.4自动记录器

16.8.5BootVis工具

16.9CrimsonAPI

16.9.1发布事件

16.9.2消耗事件

16.9.3格式描述

16.9.4收集和观察事件

16.9.5CrimsonAPI的实现

16.10本章总结

参考资料

7章WHEA

17.1目标、架构和PSHED.DLL

17.1.1目标

17.1.2架构

17.1.3PSHED.DLL

17.2错误源

17.2.1标准的错误源

17.2.2通过ACPI表来定义错误源

17.2.3通过PSHED插件来报告错误源

17.3错误处理过程

17.3.1WHEA_ERROR_PACKET结构

17.3.2处理过程

17.3.3WHEA_ERROR_RECORD结构

17.3.4固件优先模式

17.4错误持久化

17.4.1ERST

17.4.2工作过程

17.5注入错误

17.6本章总结

参考资料

8章内核调试引擎

18.1概览

18.1.1KD

18.1.2角色

18.1.3组成

18.1.4模块文件

18.1.5版本差异

18.2连接

18.2.1串行端口

18.2.21394

18.2.3USB2.0

18.2.4管道

18.2.5选择连接方式

18.2.6解决连接问题

18.3启用

18.3.1BOOT.INI

18.3.2BCD

18.3.3不错启动选项

18.4初始化

18.4.1Windows系统启动过程概述

18.4.2次调用KdInitSystem

18.4.3第二次调用KdInitSystem

18.4.4通信扩展模块的阶段1初始化

18.5内核调试协议

18.5.1数据包

18.5.2报告状态变化

18.5.3访问目标系统

18.5.4恢复目标系统执行

18.5.5版本

18.5.6典型对话过程

18.5.7KdTalker

18.6与内核交互

18.6.1中断到调试器

18.6.2KdpSendWaitContinue

18.6.出调试器

18.6.4轮询中断包

18.6.5接收和报告异常事件

18.6.6调试服务

18.6.7打印调试信息

18.6.8加载调试符号

18.6.9更新系统文件

18.7建立和维持连接

18.7.1早的调试机会

18.7.2初始断点

18.7.3断开和重新建立连接

18.8本地内核调试

18.8.1LiveKD

18.8.2Windows系统自己的本地内核调试支持

18.8.3安全问题

18.9本章总结

参考资料

9章验证机制

19.1简介

19.1.1驱动程序验证器

19.1.2应用程序验证器

19.1.3WHQL测试

19.2驱动验证器的工作原理

19.2.1设计原理

19.2.2初始化

19.2.3挂接验证函数

19.2.4验证函数的执行过程

19.2.5报告验证失败

19.3使用驱动验证器

19.3.1验证项目

19.3.2启用驱动验证器

19.3.3开始验证

19.3.4观察验证情况

19.3.5WinDBG的扩展命令

19.4应用程序验证器的工作原理

19.4.1原理和组成

19.4.2初始化

19.4.3挂接API

19.4.4验证函数的执行过程

19.4.5报告验证失败

19.4.6验证停顿

19.5使用应用程序验证器

19.5.1应用验证管理器

19.5.2验证项目

19.5.3配置验证属性

19.5.4配置验证停顿

19.5.5编程调用

19.5.6调试扩展

19.6本章总结

参考资料

第四篇编译器的调试支持

第20章编译和编译期检查

20.1程序的构建过程

20.1.1链接器

20.1.2加载器

20.2编译

20.2.1前端

20.2.2后端

20.3VisualC++编译器

20.3.1MSVC简史

20.3.2MSVC6

20.3.3VS7和VS8

20.3.4构建程序

20.3.5调试

20.4编译错误和警告

20.4.1错误ID和来源

20.4.2编译警告

20.5编译期检查

20.5.1未初始化的局部变量

20.5.2类型不匹配

20.5.3使用编译器指令

20.5.4标注

20.5.5驱动程序静态验证器

20.6标准标注语言

20.6.1缓冲区标注符

20.6.2不错标注符

20.7本章总结

参考资料.

第21章运行时库和运行期检查

21.1C/C++运行时库

21.1.1C运行时库

21.1.2C++标准库

21.2链接运行时库

21.2.1静态链接和动态链接

21.2.2lib文件

21.3运行时库的初始化和清理

21.3.1介入方法

21.3.2初始化

21.3.3多个运行时库实例

21.4运行期检查

21.4.1自动的运行期检查

21.4.2断言

21.4.3_RPT宏

21.5报告运行期检查错误

21.5.1_CrtDbgReport

21.5.2_CrtSetReportMode

21.5.3_CrtSetReportFile

21.5.4_CrtSetReportHook493

21.5.5_CrtSetReportHook2

21.5.6使用其他函数报告RTC错误

21.6本章总结

参考资料

第22章栈和函数调用

22.1简介

22.1.1用户态栈和内核态栈

22.1.2函数、过程和方法

22.2栈的创建过程

22.2.1内核态栈的创建

22.2.2用户态栈的创建

22.2.3跟踪用户态栈的创建过程

22.3CALL和RET指令

22.3.1CALL指令

22.3.2RET指令

22.3.3观察函数调用和返回过程

22.3.4跨特权级调用

22.4局部变量和栈帧

22.4.1局部变量的分配和释放

22.4.2EBP寄存器和栈帧

22.4.3帧指针和栈帧的遍历

22.5帧指针省略

22.6栈指针检查

22.7调用协定

22.7.1C调用协定

22.7.2标准调用协定

22.7.3快速调用协定

22.7.4This调用协定

22.7.5CLR调用协定

22.7.6x调用协定

22.7.7通过编译器开关改变默认调用协定

22.7.8函数返回值

22.7.9归纳和补充

22.8栈空间的增长和溢出

22.8.1栈空间的自动增长

22.8.2栈溢出

22.8.3分配检查

22.9栈下溢

22.10缓冲区溢出

22.10.1感受缓冲区溢出

22.10.2缓冲区溢出攻击

22.11变量检查

22.12基于Cookie的安全检查

22.12.1安全Cookie的产生、植入和检查

22.12.2报告安全检查失败

22.12.3编写安全的代码

22.13本章总结

参考资料

第23章堆和堆检查

23.1理解堆

23.2堆的创建和销毁

23.2.1进程的默认堆

23.2.2创建私有堆

23.2.3堆列表

23.2.4销毁堆

23.3分配和释放堆块

23.3.1HeapAlloc

23.3.2CRT分配函数

23.3.3释放从堆中分配的内存

23.3.4GlobalAlloc和LocalAlloc

23.3.5解除提交

23.4堆的内部结构

23.4.1结构和布局

23.4.2HEAP结构

23.4.3HEAP_SEGMENT结构

23.4.4HEAP_ENTRY结构

23.4.5分析堆块的分配和释放过程

23.4.6使用!heap命令观察堆块信息

23.5低碎片堆

23.6堆的调试支持

23.6.1全局标志

23.6.2堆释放检查

23.7栈回溯数据库

23.7.1工作原理

23.7.2DH和UMDH工具

23.7.3定位内存泄漏

23.8堆溢出和检测

23.8.1堆缓冲区溢出

23.8.2调用时验证

23.8.3堆尾检查

23.9页堆

23.9.1总体结构

23.9.2启用和观察页堆

23.9.3堆块结构

23.9.4检测溢出

23.10准页堆

23.10.1启用准页堆

23.10.2结构布局

23.10.3检测溢出

23.11CRT堆

23.11.1CRT堆的3种模式

23.11.2SBH简介

23.11.3创建和选择模式

23.11.4CRT堆的终止

23.12CRT堆的调试堆块

23.12.1_CrtMemBlockHeader结构

23.12.2块类型

23.12.3分配堆块

23.13CRT堆的调试功能

23.13.1内存分配序号断点

23.13.2分配挂钩

23.13.3自动和手动检查

23.14堆块转储

23.14.1内存状态和检查点

23.14.2_CrtMemDumpAllObjectsSince

23.14.3转储挂钩

23.15泄漏转储

23.15.1_CrtDumpMemoryLeaks

23.15.2何时调用

23.15.3定位导致泄漏的源代码

23.16本章总结

参考资料

第24章异常处理代码的编译

24.1概览

24.2FS:[0]链条

24.2.1TEB和TIB结构

24.2.2ExceptionList字段

24.2.3登记异常处理器

24.3遍历FS:[0]链条

24.3.1RtlDispatchException

24.3.2KiUserExceptionDispatcher

24.4执行异常处理函数

24.4.1SehRaw实例

24.4.2执行异常处理函数

24.5__try{}__except()结构

24.5.1与手工方法的对应关系

24.5.2__try{}__except()结构的编译

24.5.3范围表

24.5.4TryLevel

24.5.5__try{}__except()结构的执行

24.5.6_SEH_prolog和_SEH_epilog

24.6安全问题

24.6.1安全Cookie

24.6.2SAFESEH

24.6.3基于表的异常处理

24.7本章总结

参考资料

第25章调试符号

25.1名称修饰

25.1.1C和C++

25.1.2C的名称修饰规则

25.1.3C++的名称修饰规则

25.2调试信息的存储格式

25.2.1COFF格式

25.2.2CodeView格式

25.2.3PDB格式

25.2.4DWARF格式

25.3目标文件中的调试信息

25.3.1IMAGE_FILE_HEADER结构

25.3.2IMAGE_SECTION_HEADER结构

25.3.3节的重定位信息和行号信息

25.3.4存储调试数据的节

25.3.5调试符号表

25.3.6COFF字符串表

25.3.7COFF符号例析

25.4PE文件中的调试信息

25.4.1PE文件布局

25.4.2IMAGE_OPTIONAL_HEADER结构

25.4.3调试数据目录

25.4.4调试数据

25.4.5使用WinDBG观察PE文件中的调试信息

25.4.6调试信息的产生过程

25.5DBG文件

25.5.1从PE文件产生DBG文件

25.5.2DBG文件的布局

25.6PDB文件

25.6.1复合文件

25.6.2PDB文件布局

25.6.3PDB签名

25.6.4Magic代码

25.6.5PDB_HEADER

25.6.6根数据流——流目录

25.6.7页分配表

25.6.8访问PDB文件的方式

25.6.9PDB文件的产生过程

25.7有关的编译和链接选项

25.7.1控制调试信息的编译选项

25.7.2控制调试信息的链接选项

25.7.3不同链接和编译选项的比较

25.8PDB文件中的数据表

25.8.1符号表

25.8.2源文件表

25.8.3节贡献表

25.8.4段信息表

25.8.5注入源代码表

25.8.6帧数据表

25.9本章总结

参考资料

第五篇调试器

第26章调试器概览

26.1TX-0计算机和FLIT调试器

26.2小型机和DDT调试器

26.2.1PDP-1

26.2.2TOPS-10操作系统和

DDT-10

26.3个人计算机和它的调试器

26.3.18086Monitor

26.3.2SYMDEB

26.3.3CodeView调试器

26.3.4TurboDebugger

26.3.5SoftICE

26.4调试器的功能

26.4.1建立和终止调试会话

26.4.2控制被调试程序执行

26.4.3访问内存

26.4.4访问寄存器

26.4.5断点

26.4.6跟踪执行

26.4.7观察栈和栈回溯

26.4.8汇编和反汇编

26.4.9源代码级调试

26.4.10EnC

26.4.11文件管理

26.4.12接收和显示调试信息

26.4.13转储

26.5分类标准

26.5.1特权级别

26.5.2操作系统

26.5.3执行方式

26.5.4处理器架构

26.5.5编程语言688

26.6实现模型

26.6.1进程内调试模型

26.6.2进程外调试模型

26.6.3混合调试模型

26.6.4内核调试模型

26.7经典架构

26.7.1基本单元

26.7.2远程调试

26.7.3多语言和多处理器架构调试

26.8HPD标准

26.8.1HPD标准简介

26.8.2动作点

26.8.3进程和线程的表示和命名

26.8.4命令

26.9本章总结

参考资料

第27章VsDebug

27.1架构和调试模型

27.1.1架构概览

27.1.2远程调试器

27.1.3本地调试器

27.2VS调试引擎

27.2.1一套接口,多种实现

27.2.2核心类

27.3工作过程

27.3.1开始调试32位本地程序

27.3.2开始调试位本地程序

27.3.3访问调试目标

27.4使用断点

27.4.1根据名称设置断点

27.4.2数据断点

27.4.3附加条件

27.4.4附加操作

27.5多线程调试

27.5.1并行栈回溯

27.5.2并行监视

27.5.3冻结线程

27.6EnC

27.6.1应用过程

27.6.2要求/ZI编译选项

27.6.3下次调用生效

27.6.4应用失败

27.7设计期调试

27.8使用符号服务器

27.9定制调试事件

27.9.1初始断点

27.9.2异常设置

27.10本章总结

参考资料

第28章VSCode的调试扩展

28.1简介

28.2四大技术

28.3理解“扩展包”

28.3.1包类型

28.3.2安装

28.3.3工作原理

28.4扩展包API

28.4.1贡献点

28.4.2命令

28.4.3激活事件

28.5调试模型

28.5.1贡献调试器

28.5.2宏观架构

28.6调试适配器

28.6.1DA描述符工厂

28.6.2进程内DA

28.6.3vsdbg

28.6.4OpenDebugAD7

28.7机器接口

28.7.1启用用法

28.7.2对话示例

28.7.3MIEngine

28.8调试Python程序

28.8.1PTVSD

28.8.2发起异常时中断

28.9本章总结

参考资料

第29章WinDBG及其实现

29.1WinDBG溯源

29.1.1KD和NTSD诞生

29.1.2WinDBG诞生

29.1.3发行方式

29.1.4版本历史

29.2C阶段的架构

29.2.1功能模块

29.2.2远程调试

29.3重构

29.3.1版本历史

29.3.2界面变化

29.3.3模块变化

29.3.4发布方式和NTSD问题

29.3.5文件

29.4调试器引擎的架构

29.4.1概览

29.4.2对外接口

29.4.3DebugClient类

29.4.4中间层

29.4.5服务层

29.4.6传输和连接层

29.5调试目标

29.5.1TargetInfo类

29.5.2用户态目标

29.5.3内核态目标

29.5.4转储文件目标

29.6调试会话

29.6.1建立调试会话

29.6.2调试循环

29.6.3等待和处理调试事件

29.6.4继续调试事件

29.6.5结束调试会话

29.7接收和处理命令

29.7.1调试器的两种工作状态

29.7.2进入命令状态

29.7.3执行命令

29.7.4结束命令状态

29.8扩展命令的工作原理

29.9本章总结

参考资料

第30章WinDBG用法详解

30.1工作空间

30.2命令概览

30.2.1标准命令

30.2.2元命令

30.2.3扩展命令

30.3用户界面

30.3.1窗口概览

30.3.2命令窗口和命令提示符

30.4输入和执行命令

30.4.1要点

30.4.2表达式

30.4.3伪寄存器

30.4.4别名

30.4.5循环和条件执行

30.4.6进程限定符和线程限定符

30.4.7记录到文件

30.5建立调试会话

30.5.1附加到已经运行的进程

30.5.2创建并调试新的进程

30.5.3非入侵式调试

30.5.4双机内核调试

30.5.5本地内核调试

30.5.6调试转储文件

30.5.7远程调试

30.6终止调试会话

30.6.1停止调试

30.6.2分离调试目标

30.6.3抛弃被调试进程

30.6.4终止被调试进程

30.6.5调试器终止或僵死

30.6.6重新开始调试

30.7理解上下文

30.7.1登录会话上下文

30.7.2进程上下文

30.7.3寄存器上下文

30.7.4局部(变量)上下文

30.8调试符号

30.8.1重要意义

30.8.2符号搜索路径

30.8.3符号服务器

30.8.4加载符号文件

30.8.5观察模块信息

30.8.6检查符号

30.8.7搜索符号

30.8.8设置符号选项

30.8.9加载不严格匹配的符号文件

30.9事件处理

30.9.1调试事件与异常的关系

30.9.2两轮机会

30.9.3定制事件处理方式

30.9.4GH和GN命令

30.9.5实验

30.10控制调试目标

30.10.1初始断点

30.10.2俘获调试目标

30.10.3继续运行

30.11单步执行

30.11.1概览

30.11.2单步执行到指定地址

30.11.3单步执行到下一个函数调用

30.11.4单步执行到下一分支

30.11.5追踪并监视

30.11.6程序指针飞跃

30.11.7归纳

30.12使用断点

30.12.1软件断点

30.12.2硬件断点

30.12.3条件断点

30.12.4地址表达方法

30.12.5设置针对线程的断点

30.12.6管理断点

30.13控制进程和线程

30.13.1lThrds程序

30.13.2控制线程执行824

30.13.3多进程调试

30.14观察栈

30.14.1显示栈回溯

30.14.2观察栈变量

30.15分析内存

30.15.1显示内存区域

30.15.2显示字符串

30.15.3显示数据类型

30.15.4搜索内存

30.15.5修改内存

30.15.6使用物理内存地址

30.15.7观察内存属性

30.16遍历链表

30.16.1结构定义

30.16.2双向链表示例

30.16.3单向链表示例

30.16.4dl命令

30.16.5!list命令

30.17调用目标程序的函数

30.17.1调用示例

30.17.2工作原理

30.17.3条件和常见错误.

30.18命令程序

30.18.1流程控制符号

30.18.2变量

30.18.3命令程序示例

30.18.4执行命令程序

30.19本章总结

参考资料

附录A示例程序列表

附录BWinDBG标准命令列表

附录CNT内核部件缩写列表

持之若痴——代跋