Stamp of Software Debugging
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
navigation bar seprate line
勘误

因为作者的水平和时间有限,本书中可能存在各种错误和偏颇,作者对此深表歉意。您可以把您发现的错误通过意见反馈栏目中列出的方式发给作者。

以下是已经发现的需要更正的地方,感谢提出这些意见的朋友,特别是楼奕华先生、北京的Thomson先生、张博民先生和icommander。

编号 章节 页码 确切位置 原文内容 更正
1 2.7.5 59 下数第5行 根据图2-11 根据图2-9
2 2.7.5 60 第13步的第6行 也就是说,页目录项的内容是0x3a6ae067,根据图2-9 也就是说,页表表项的内容是0x3a6ae067,根据图2-11
3 2.7.5 60 第14步的第1行 加上页内偏移(0xc8) 加上页内偏移(0xc88)
4 2.7.6 61 第3个自然段 PDE的高12位便是物理地址的高12位,因此将PDE的高12位加上线性地址的低24位... PDE的高10位便是物理地址的高10位,因此将PDE的高10位加上线性地址的低22位...
5 25.6.3 766 第3个自然段 其中MSF代表Microsoft Stream Format, 其中MSF代表Multi-Stream Format,
6 6.1 134 下数第1、2段和图6-1的标题 P5_MC_TPYE P5_MC_TYPE
7 12.9.3 354 第一个自然段最后一句 DNGHELP.DLL DBGHELP.DLL
8 29.6.1 893 倒数第二个自然段 Process Serer Process Server
9 24.6.3 737 本节最后一句话 感兴趣的读者可以阅读参考文献5和6 感兴趣的读者可以阅读参考文献2和3
10 30.12.2 964 本小节第2段第3行 与bp命令一样,如果指定序号,那么WinDBG会自动编排。 与bp命令一样,如果不指定序号,那么WinDBG会自动编排。
11 30.4.6 923 表30-5第4行 |*,当前进程的所有进程 |*,当前系统的所有进程
12 30.4.3 919 表30-3第6行 $ip ...x86即EIP,x64即eip $ip ...x86即EIP,x64即rip
13 30.3.1 913 最上面一段的最后一句话 Dock0又有5个子窗口,即我们打开的5个工作窗口 Dock0又有4个子窗口,即我们打开的4个工作窗口
14 30.11 955 最末一句话 使用单步(Step)一词来指代一种方式;使用跟踪(Trace)一词来指代一种方式 使用单步(Step)一词来指代一种方式;使用跟踪(Trace)一词来指代一种方式
15 28.8.4 865 最末一句话 下一节将介绍Java平台的调试器标准,JPDA。 --在缩减篇幅时,JPDA一节被删除了,因此这一句话也应该删掉--
16 28.3.1 841 下数第二自然段的第一句话 8086 Mnitor是与名为CPU Suport Card的硬件一起工作的 8086 Mnitor是与名为CPU Support Card的硬件一起工作的
17 11.4.4 295 本小节第3、4自然段的第一句话 EXCEPTION_CONTINUE_EXECUTION(1)...EXCEPTION_EXECUTE_HANDLER(-1) EXCEPTION_CONTINUE_EXECUTION(-1)...EXCEPTION_EXECUTE_HANDLER(1)
18 11.3.3 288 下数第二段的最后一句话 则说明Ccontinue失败 则说明Continue失败
19 12.8.6 349 下数第5行 Symbol Fole could not be found Symbol File could not be found
20 12.2.5 317 清单12-5上面一句话 系统在该函数也提供了一个SHE处理器 系统在该函数也提供了一个SEH处理器
21 12.3.1 321 下数第2句话 总是在默认桌面(WINST0\Default) 总是在默认桌面(Winsta0\Default)
22 4.1.1 76 图4-1中的消息文字 User breakpoint called from code at0x401038 User breakpoint called from code at0x401028
23 22.13 642 第1段第4行 栈指针省略(22.5节) 帧指针省略(22.5节)
24 22.13 642 表22-2第2行第1列 建立栈指针 建立帧指针
25 8.3.3 180 表8-2下面一段的最后一句话 SYSENTER_ESP_MSR的值是8053cad0 SYSENTER_EIP_MSR的值是8053cad0
26 10.6.1 251 最下面一段的第一句话 如果当前进程不被调试 如果当前进程不被调试
27 9.4.4 205 倒数第二段的第一句话 在调试器处理好调试事件后,它会通过ContinueDebugEvent API间接调用间接调用... 第二个简接调用该删除,重复了
28 12.4.2 332 第二自然段的第一句话 Send Erorr Report(发送错误提示 Send Error Report(发送错误报告)--另该段最后一长句中的Erorr也该为Error--
29 22.2.3 588 倒数第三行 其中,...000007c0是进程句柄 其中,...000007bc是进程句柄
30 22.3.3 592 倒数第三行 ESP寄存器总是指向位于栈的数据 ESP寄存器总是指向位于栈的数据
31 10.4.1 241 清单10-6下方第三段的第一句 DebugActiveProcess API在Windwos 2000中的工作过程... DebugActiveProcess API在Windows 2000中的工作过程...
32 12.2.2 312 清单12-3上方第4行 WinMainCRTStartup:UNICODE字符的... wWinMainCRTStartup:UNICODE字符的...
33 11.2.1 281 下部的列表(List) ...标志位有 ...标志位有--另外,最后一个黑点(bullet)应该去除,使其成为正文--
34 13.5.1 380 13.5.1节的第4行 MB_MB_ICONASTERISK MB_ICONASTERISK
35 12.9.4 354 12.9.4节的第1行 MiniDumpReadDump API MiniDumpReadDumpStream API
36 12.5.2 337 第3行 NtWaitForMultipleObject NtWaitForMultipleObjects
37 12.4.1 328 倒数第5行 enum_HARDERROR_RESPONSE enum _HARDERROR_RESPONSE--加一空格--
38 15.3.2 411 第2段第1行 那幺,... 那么,--本章406、409、417页也各有一处这样的错误--
39 4.1.8 83 上数第13、15行 开始的5个字节651c202400都是一条指令...指令的第一个字节0x65 0x68
40 4.2.3 87 第2个整段的下数第3行 会自动将起始地址0xA003的低4位屏蔽掉 2
41 4.4.3 104 第2个整段后的汇编代码 EXHG SP, BP XCHG SP, BP
42 2.4.6 46 第7行 RnD、RnW、RnB(n=8~15)来引用 RnD、RnW、RnL(n=8~15)来引用
43 7.5 161 第2行 开发阶段的主才带有 开发阶段的主才带有
44 9.6.2 220 第5段第3行 此后的Windows 2000 Service Patch 此后的Windows 2000 Service Pack
45 11.3.1 285 图11-3 调用ZwTerminateThread终止当前线 调用ZwTerminateProcess终止当前
46 11.3.3 288 第4行 那么DbgkSendApiMessage会返回FALSE 那么DbgkForwardException会返回FALSE
47 11.3.3 289 下数第3段第2行 那么KiDispatchException会终止当前线 那么KiDispatchException会终止当前并调用KeBugCheckEx发起蓝屏
48 11.4.2 291 下数第6行 没有下线的关键字……加双下线的关键字 没有下线的关键字……加双下线的关键字
49 11.5.3 307 第4段第4行 要求的Windows版本定义为0x500或更高的值(_WIN32_WINNT=0x0500 要求的Windows版本定义为0x0501或更高的值(_WIN32_WINNT=0x0501
50 16.8.4 439 图下方第2行 Bext Boot+Driver Delays Next Boot+Driver Delays
51 18.1.5 465 下数第5行 除非特别指出“内核调试”,都是指...... 除非特别指出,“内核调试”都是指......
52 23.4.1 655 图23-2下第6行 位于HeapAlloc函数...... 位于HeapCreate函数......
53 23.12.3 696 第5行 如果定义了WINHEAP标志 没有定义WINHEAP标志
54 23.15.2 705 小节标题下第1行 从上面对_CrtMemDumpAllObjectsSince函数 从上面对_CrtDumpMemoryLeaks函数
55 24.4.2 722 倒数第2行 ExecutePPHandler ExecuteHandler
56 25.6.6 768 第3段第2行 PEB_HEADER70 PDB_HEADER70
57 27.4.1 816 清单27-4上方第2行 交给SHE去处理 交给SEH去处理
58 30.6.4 929 第6行 调用操作系统的TerminateProcess API来终止当前线 调用操作系统的TerminateProcess API来终止当前
59 30.6.4 929 清单30-1下方第2行 会收到线程退出事件 会收到线程和进程退出事件
60 12.9.4 355 图12-14上方第2行 读取转文件的过程 读取转文件的过程
61 - 833 下数第8行 没有明确的标准呢? 没有明确的标准
62 9.2.2 197 第3段第5行和第7行 DbgKmCreate-ProcessApi ... CREATE_THREAD_ DEBUG_EVENT DbgKmCreateProcessApi...CREATE_THREAD_DEBUG_EVENT(不该有换行符和空格)
63 8.3.1 177 第4段第3-5行 ,有时也被称为上下文切换(Context Switch)。在每个线程的KTHREAD结构中,有一个名为ContextSwitches的字段,专门用来记录这个线程的模式切换次数。 。在线程的KTHREAD结构中,定义了UserTime和KernelTime两个字段,分别用来记录这个线程在用户模式和内核模式的运行时间(以时钟中断次数为单位)。
64 8.3.3 182 表8-3第4行 SYSRETURN SYSRET
65 22.1.1 582 下数第4自然段第3行 (这个切换过程通常被称为 Context Switch (这个切换过程通常被称为 模式切换
66 12.3.2 326 代码清单中行号为266的那行后 [增加一行代码] return EXCEPTION_CONTINUE_SEARCH;
67 2.4.4 43 表2-2第3行 详见2.11节 详见参考文献6
68 29.3.2 877 第2段第1句话 从图29-3可以看出 从图29-4可以看出
69 29.2.1 873 关于Emx86.dll的那段的第2行 接到被调试系统 接到被调试系统
70 22.3.4 594 下数第4行,步骤7 段选子 段选择子
71 23.4.1 655 倒数第6行 管理器 管理器
72 23.8.1 672 图23-4下第3行 管理器 管理器
73 23.6.2 664 第3段最后一行 HeapValidat HeapValidate
74 23.6.2 665 第一整段第2行 对于调试版本也适用 对于发布版本也适用
75 23.7.3 669 清单23-7下第1行 比较两次采用中的每个UST记录,必将 比较两次采样中的每个UST记录,并将
76 27.3.1 809 下数第4行 RtlCpatureContext RtlCaptureContext,另外,用一行GetThreadContext中的t不该为粗体
77 27.3.1 810 第4行 栈帧基地 栈帧基地
78 26.5.2 796 页中间位置 /DEBU /DEBUG
80 30.4.2 917 页中间位置 也可以写为?? const_cast 也可以写为?? reinterpret_cast
81 30.4.2 918 第19行 ##CONTAINING_RECORD #CONTAINING_RECORD
82 30.15.7 985 第3行 PAGE_READONLY PAGE_NOACCESS[原本PAGE_READONLY重复]
83 30.18.3 996 清单30-22行号7、8 行7等号后的部分意外换到下一行 [应该在同一行,后面的行号该递减1]
84 8.3.3 180 下数第16行 u ntdll... u ntdll!NtReadFile
85 8.3.3 180 下数第5行 u ... u SharedUserData!SystemCallStub
86 20.4.2 551 表格下第10行 ...4385; error:164 ...4385; error:4164
87 24.3.1 719 行号为62的那行代码 ...( hLog, Disposition); ...( hLog, nDisposition);
88 24.4.2 722 倒数第2行 ExecutePPHandler退化为只是... ExecuteHandler退化为只是...
89 9.4.5 207 第3行 的进程和线程来创建消息。... 的进程和线程创建消息。...
90 23.2.1 647 第14行 CStructXXX *pStruct=HeapAlloc(... CStructXXX *pStruct=(CStructXXX *)HeapAlloc(...
91 22.2.3 588 本小节第6行 ...,键入kv ...,键入knL
92 22.3.3 593 第2行 ...,即清单20-2的第2行,... ...,即清单22-4的第2行,...
93 23.1 645 倒数第3行 23.10~23.12节详细介绍... 23.11~23.15节详细介绍...
94 23.1 645 第7行 ExFreePool-WithTag ExFreePoolWithTag
95 11.1.1 274 第1行 LIDT和SIDT指令... LIDT指令...
96 24.1 712 第7行 的异常分发函数的密切配合。 的异常分发函数相配合。
97 9.5.6 218 下数第3、4行 NtWaitForSingle-Object...NtRe-questWaitReplyPort... 换行符号该去掉
98 9.3.3 202 下数第3段最后一句 KeThawAll-Threads... 换行符号该去掉
99 10.6.9 258 第5行 Broke Window... Broken Window...
100 22.1 581 倒数第6行 (第20.4节和20.5节详细讨论)。 (第22.4节和22.5节详细讨论)。
101 19.1.1 514 本小节最后一句 我们将在第19.2节详细介绍... 我们将在第19.2和19.3节详细介绍...
102 19.1.2 514 本页最后一句 我们将在第19.3节详细介绍... 我们将在第19.4和19.5节详细介绍...
103 2.5.3 48 倒数第5行 ,所以当CPU访问DPL于CPL(数值上)的一致代码段时,CPL保持不变。 ,所以当CPU访问DPL于CPL(数值上)的一致代码段时,CPL保持不变。
104 17.1.2 448 倒数第3、4行 0x124,是常量WHEA_INTERNAL_ERROR,...相关的还有WHEA_UNCORRECTABLE_ERROR,... 0x124,是常量WHEA_UNCORRECTABLE_ERROR,...相关的还有WHEA_INTERNAL_ERROR,...(二者颠倒了)
106 22.7.9 616 表22-1第7行,第3列 EAX、EDX ECX、EDX
107 4.2.8 94 中间一段倒数第3行 当错误类异常发生时,CPU会将机器状态恢复到执行导致异常的指令被执行前的状态 当错误类异常发生时,CPU会将机器状态恢复到导致异常的指令被执行前的状态
108 4.2.1 84 图4-4下第2行 ...都会导致一个非法指令异常(#UD), ...都会导致一个无效指令异常(#UD),
109 4.1.7 82 4.1.8上第5行 00401040,因此减1后... 0040103a,因此减1后...
110 22.8.3 622 汇编清单下第2段最后两个字 值: 值:
111 22.9 623 本节第1段第4行 栈底(stack base)下的... 栈底(stack base)下的...
112 附录A 999 表中第4行第二列 应用程序代码不可以直接修改段寄存器 应用程序加载无效段寄存器导致异常
113 2.3 39 图2.2下方第一句倒数第一个单词 供系统固件(firmare)执行 供系统固件(firmware)执行
114 2.4.5 45 下数第6段 一个32位的中断描述符表寄存器IDTR 一个48位的中断描述符表寄存器IDTR
115 2.4.5 45 下数第5段 一个32位的全局描述符表寄存器GDTR 一个48位的全局描述符表寄存器GDTR

navigation bar seprate line
Copyright (C) 2008-2013 Raymond Zhang, All Rights Reserved