软件调试2ed vol.2 Windows平台调试
Book information
Description
第一篇大局观 章Windows系统简史 1.1源于DOS 1.2功在NT 1.3Windows2000彰显实力 1 .4之作:WindowsXP和WindowsServer 1.5WindowsVista折戟沙场 1.6Windows7享利中兴 1.7Windows8革新受挫 1.8Windows10何去何从 1 .9本章总结 参考资料 第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 .9WSL 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. 14.1.1客户端 14.1.2报告模式 14.1.3传输方式 14.2系统错误报告 14.3WER服务器端 14.3.1WER服务 14.3.2错误报告分类方法 14.3.3报告回应 14 .4WER2. 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的数据组织 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. 18 .2.3USB2. 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本章总结 参考资料 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 第四篇编译器的调试支持 第20章编译和编译期检查 20.1程序的构建过程 20.1.1链接器 20.1.2加载器 20.2编译 20.2.1前端 20.2.2后端 20.3VisualC++编译器 20.3.1MSVC简史 20 .3.2MSVC 20 .3.3VS7和VS 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_CrtSetReportHook 21 .5.5_CrtSetReportHook 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- 26.2.2TOPS-10操作系统和 DDT- 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编程语言 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.4OpenDebugAD 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控制线程执行 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内核部件缩写列表 持之若痴——代跋 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858
Similar books
软件调试 第2版 卷2
2020 · PDF
软件调试 第2版: 卷1:硬件基础
2018 · PDF
格蠹汇编: 软件调试案例集锦
2013 · PDF
格蠹汇编: 软件调试案例集锦
2013 · PDF
软件调试: Software Debugging
2008 · PDF
中国建筑西南设计研究院:成都嘉煜金融科技中心方案深化设计(高新区名都路166号)
2012 · PDF
尤安设计:北京市朝阳区 望京绿地中心-A座 深化设计文本( 启阳路)【超高层办公楼】
2011 · PDF
鏖战北海:挪威战役
2023 · PDF