Windows用户态程序高效排错 目录草稿

Windows用户态程序高效排错
思路 技巧 案例 方法

前言 8
0.1 本书介绍什么? 8
0.2 本书的组织结构 8
0.3 本书的适合人群 9
0.4 本书叙述上的特点 9
0.5 您的反馈和最新动态 10
第一部分,比工具,技巧和经验都重要的是你的思考 -- 从四个风格迥异的案例说起 11
1.0 热身运动 11
1.1绝望的性能问题, ADO.net 2.0竟然比 1.0要慢! 12
问题描述 12
悲观和绝望 12
换位思考 13
排错 14
结论和收获 15
题外话和相关讨论 16
Safehandle的更多讨论 16
平衡,取舍,双赢和RFC 1925 16
Profiler的下载地址和相关资源: 17
1.2 不可思议:一个 API同时打开了两个文件? 17
问题描述 17
第一映像 17
深入分析 18
革命尚未成功 19
结论 22
题外话和相关讨论 22
MSDN是最值得信赖的吗 22
你敢说CPU坏了? 22
[DWORD和文件长度] 23
[程序输出0xcdcdcdcd,想到了什么] 23
1.3 简单的问题最棘手:稀疏平常的ASP.NET Session Lost问题 25
问题描述 25
制定策略 25
具体操作和结论 26
题外话和相关讨论 27
排查session lost的经验: 27
1.4本可以做得更好:SharePoint中文界面变英文 28
问题描述 28
排错步骤 28
错过的线索 30
第二部分,汇编,异常,内存,同步和调试器 -- 重要的知识点和神兵利器 31
2.1排错的工具:调试器Windbg 31
调试器的功能:检查代码和数据,保存dump文件,用断点控制程序的执行 32
符号文件 (Symbol file),把二进制和源代码对应起来 33
一个简单的上手程序 33
用Internet Explorer来操练调试器的基本命令 43
Vertarget 检查进程概况 44
!peb 显示Process Environment Block 44
Lmvm 检查模块的加载信息 44
.relad / !sym 加载符号文件 45
Lmf 列出当前进程中加载的所有模块 46
r,d,e 寄存器,内存的检查和修改 46
S 搜索内存 47
!runaway 检查线程的CPU消耗 48
~ 切换目标线程 49
k,kb,kp,kv,kn 检查call stack 50
U 反汇编 50
X 查找符号的二进制地质 50
dds 对应二进制地址到符号 51
检查程序数据的小例子 52
.frame 在栈中切换以便检查局部变量 54
Dt 格式化显示数据 55
用windbg控制程序进行实时调试(Live Debug) 56
Wt Watch and Trace, 跟踪执行的强大命令 56
条件断点 (condition breakpoint),高效地控制观测目标 58
伪寄存器,帮助保存调试的中间信息 61
Step Out的实现 61
远程调试(Remote debug) 62
如何通过windbg命令行让中文魔兽争霸运行在英文系统上 62
Adplus的常见用法 63
Debugger Extension,扩展Windbg的功能 64
2.2读懂机器的语言:汇编,CPU执行指令的最小单元 64
需要用汇编来排错的常见情况 64
案例研究,用汇编读懂VC编译器的优化 65
问题描述 65
我的分析 65
案例研究,VC2003 编译器的bug, debug模式正常,release模式会崩溃 66
例子程序 66
跟踪汇编指令来分析 68
案例研究,臭名昭著的DLL Hell如何导致ASP.NET出现Server Unavailable 69
[题外话和相关讨论] 70
Release比 Debug快吗 70
2.3理解操作系统对程序的反馈:异常(Exception)和通知(Debug Event) 72
异常(Exception)的方方面面和一篇字字珠玑的文章 72
案例研究,如何让C++像C#一样打印出函数调用栈(callstack) 73
案例研究,华生医生(Dr. Watson)在什么情况下不能记录Dump文件 74
问题描述 74
背景知识 74
问题分析 74
新的做法 75
问题解决了,可是为什么华生医生(Dr. Watson)抓不到dump呢 76
通知(Debug Event)是操作系统跟调试器交流的一种方法 79
案例研究,VB6的版本问题 79
题外话和相关讨论 81
错过第一现场后还从dump中分析出线索吗 81
Adplus,天天都用的工具 82
未处理异常发生后的主动退出 83
如何调试UnhandledExceptionFilter 83
2.4平坦内存空间中的层次结构:Heap和Stack 85
Heap是对平坦空间的高效管理和利用 85
PageHeap,调试Heap问题的工具 87
简单例子的多种情况 87
Heap上的内存泄露和内存碎片 88
Stack overrun/corruption 90
题外话和相关讨论: 92
PageHeap的/unaligned参数 92
Heap trace,系统帮你记录下每次Heap的操作 93
为何才分配了300MB内存,就报告Out of memory 96
2.5 找准排查问题的对应层次 98
从C运行库看层次 98
简单的_CRTDBG_MAP_ALLOC定义就可以让内存泄漏无可遁形 99
BSTR Cache,建立在Heap之上的COM字符串内存管理 100
题外话和相关讨论 100
CRT Debug Heap一定对Debug有帮助吗? 101
C++中new操作符的尴尬 101
2.6理清多个线程对资源的竞争:同步和锁 101
句柄泄漏,死锁和线程争用,三个典型问题 101
句柄泄漏(Handle Leak) 102
死锁(Deadlock) 102
线程争用 (contention) 104
Windbg中的对应排错 104
!handle 检查句柄信息 105
!htrace 检查操作句柄的历史纪录 106
!cs 列出CriticalSection的详细信息 107
排查CriticalSection leak( Orphan CriticalSection) 109
Invalid handle exception 111
案例研究, ArrayList.Add的时候发生IndexOutOfRangeException 112
问题描述 112
这个异常不简单 112
具体操作 113
结论 114
2.7 调试和设计 116
热心朋友的提问 116
案例分析,反被聪明误 117
第三部分  .NET Framework的原理和SOS调试 --剖析CLR程序和CLR本身 119
3.1 MetaData(元数据),JIT(编译引擎),GC(内存管理),Exception(异常处理)的关键点 119
MetaData(元数据)和引擎初始化 119
JIT 动态编译 120
GC 内存管理 121
Exception Handling 异常处理 122
3.2 用Windbg探索CLR的实现 122
开源的CLR实现:Rotor 122
对一个Hello world的WinForm程序庖丁解牛 123
mscoree!_CorExeMain CLR引擎的入口 124
EEStartupHelper 重要的引擎初始化函数 124
mscorwks!SystemDomain::ExecuteMainMethod 执行托管代码的入口 126
CallDescr /MakeJitWorker Jit引擎发动的地方 127
NtUserWaitMessage 托管程序完成加载 130
gc_heap::allocate_more_space/ GCHeap::GarbageCollect 通过GC管理内存的分配和释放 132
AppDomain,ThreadPool,Exception,StackWalk,Security都是有趣的话题 135
3.3 通过SOS快捷方便地调试托管程序 136
CLR让托管程序的调试变得非常简单 136
SOS的命令介绍 137
3.4 用简单的程序演示SOS的常见操作 141
.load sos 加载sos到windbg 141
!dumpheap 统计托管内存使用信息 142
!do 显示托管对象的详细信息 143
!gcroot 查找托管对象的引用关系 143
3.5 案例分析, ASP.NET High CPU和更多的CLR命令演示 145
!threads 察看托管线程 146
!tp 察看线程池和CPU占用率 147
!SyncBlk 察看托管线程的lock 150
!ip2md 映射内存地址到托管函数名 150
!savemodule 保存模块到本地以便用reflector分析 151
著名的blog:If broken it is, fix it you should 152
3.6 题外话和相关讨论 152
ReleaseCOMObject 释放COM对象时候的两难困境 152
PInvoke应该Pin住内存防止崩溃 153
但是Pin住内存又会导致内存碎片 154
臭名昭著的mixed DLL loading deadlock 154
有趣且有用的练习和更多的资料 154
第四部分 ,崩溃,性能和资源泄漏 -- 分享一些经验 156
4.1 排错开始前的准备工作 156
用正确的态度对待问题 156
用简单的提问缩小排错的范围 156
通过MPS REPORT获取系统的详细信息 157
通过简单得Dump分析获取基本信息 158
4.2 崩溃(Crash) 159
崩溃的万千种不同死相 159
准确获取Dump 163
Adplus 最容易上手的dump脚本 164
华生医生(dr Watson) 166
通过Image File Execution Options让调试器随目标程序一起启动 166
COM+和ASP.NET的dump获取需要特殊配置 167
crash dump中需要重点关注的信息 167
案例分析,VC程序的崩溃 168
问题描述 168
MessageBox 嵌套调用 169
从源代码中发现的疑点 172
从This指针找崩溃的根源 174
结论 177
小结和更多的资源 178
题外话和相关讨论 178
StackCorruption 179
4.3 性能(Performance) 181
“你真牛,不如你再努力给我缩短10秒吧” 应该有多快是仔细估算出来的,不是调出来的 181
性能调优的步骤 CPU利用率是关键 182
无所不知的性能监视器 183
使用性能监视器的基本步骤 183
重要的计数器 185
案例分析, 博客园的性能问题 188
案例分析,堵塞在SqlCommand.ExecuteReader上就一定在等sql吗 196
案例分析, 堵塞在Assembly.Load上的deadlock 203
案例分析,196个线程织成的一张网 215
用Profiler精确定位性能瓶颈 231
案例分析,DataTable中foreach和for loop性能差了50% 232
题外话和相关讨论 237
Task manager跟performance monitor的差别 237
性能监视器的牛逼用法 238
C++跟C#到底谁快 239
没有profiler怎么办 239
4.4 资源泄露(Resource Leak) 242
资源泄露分轻重缓急 243
内存泄露排错的基本步骤 244
泄漏了什么,谁分配的,为什么无法释放? 244
定位泄漏内存的类型和增长趋势 244
区分managed heap leak和native leak 245
案例分析,IE7的内存泄漏leak 245
问题描述 246
重现问题和基本分析 246
用传统的Pageheap+UMDH找到问题根源 249
方便强大的IIS Diagnostics工具 257
结论 265
分析IIS Diag 265
托管内存泄露 267
案例分析,object chain让排错简单明了 267
案例分析,一个bt的案例 274
碎片的其它原因 277
句柄泄漏(Handle Leak) 279
题外话和相关讨论 280
GDI Leak 280
Desktop heap issue 280
更多的资源 282

 

阅读更多
个人分类: 其它
想对作者说点什么? 我来说一句

Windows用户态程序高效排错

2007年11月09日 585KB 下载

Windows用户态程序高效排错

2008年07月30日 722KB 下载

Windows 用户态程序高效排错

2010年06月17日 19.95MB 下载

Windows用户态高效排错.rar

2010年03月04日 586KB 下载

windbg(用户态调试)

2008年09月18日 14.83MB 下载

Windows 用户态程序高效排错 (1 of 2)

2010年03月24日 11.44MB 下载

没有更多推荐了,返回首页

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭