注冊(cè) | 登錄讀書好,好讀書,讀好書!
讀書網(wǎng)-DuShu.com
當(dāng)前位置: 首頁出版圖書科學(xué)技術(shù)計(jì)算機(jī)/網(wǎng)絡(luò)操作系統(tǒng)WindowsWindows用戶態(tài)程序高效排錯(cuò)

Windows用戶態(tài)程序高效排錯(cuò)

Windows用戶態(tài)程序高效排錯(cuò)

定 價(jià):¥35.00

作 者: 熊力
出版社: 電子工業(yè)出版社
叢編項(xiàng):
標(biāo) 簽: Windows

ISBN: 9787121051937 出版時(shí)間: 2007-11-01 包裝: 平裝
開本: 787×980 1/16 頁數(shù): 236 字?jǐn)?shù):  

內(nèi)容簡(jiǎn)介

  本書是一本介紹Windows系統(tǒng)上的用戶態(tài)程序排錯(cuò)方法和技巧的書。本書分為4個(gè)章節(jié),先介紹最重要的、通用的思考方法,以便制定排錯(cuò)步驟;再介紹對(duì)排錯(cuò)有幫助的知識(shí)點(diǎn)和工具;并介紹了.NET Framework(CLR)的相關(guān)知識(shí)和調(diào)試技巧;最后一章針對(duì)常見的幾大類問題進(jìn)行了總結(jié)。 本書案例豐富,對(duì)現(xiàn)實(shí)中的實(shí)際問題進(jìn)行了研究,并和讀者一起分析解決辦法;本書的寫作思路為先給出問題描述,然后提供線索,再進(jìn)行分析,讓讀者在閱讀中也進(jìn)行思考,以提高實(shí)際解決問題的能力。本書適合希望學(xué)習(xí)排錯(cuò)、調(diào)試知識(shí)的軟件開發(fā)、測(cè)試人員,以及希望深入學(xué)習(xí)Windows系統(tǒng)上用戶態(tài)程序的排錯(cuò)知識(shí)的軟件開發(fā)、測(cè)試人員。

作者簡(jiǎn)介

  熊力,2004年開始在上海微軟技術(shù)支持中心擔(dān)任技術(shù)支持工程師。他所在的小組負(fù)責(zé)幫助企業(yè)客戶解決開發(fā)領(lǐng)域的技術(shù)難題。作者專注于.NET Framework、 C/C++、COM和Web開發(fā),現(xiàn)任微軟中國(guó)研發(fā)集團(tuán)服務(wù)器與開發(fā)工具事業(yè)部測(cè)試工程師。

圖書目錄

第1章  比工具、技巧和經(jīng)驗(yàn)都重要的是你的思考——從四個(gè)風(fēng)格迥異的案例說起    1
1.1  絕望的性能問題:ADO.NET 2.0竟然比1.0要慢    1
1.1.1  問題描述    1
1.1.2  悲觀和絕望    2
1.1.3  換位思考    3
1.1.4  排錯(cuò)    3
1.1.5  結(jié)論和收獲    5
1.1.6  題外話和相關(guān)討論    6
Safehandle的更多討論    6
平衡、取舍、雙贏和RFC 1925    6
Profiler的下載地址和相關(guān)資源    7
1.2  不可思議:一個(gè)API同時(shí)打開了兩個(gè)文件    7
1.2.1  問題描述    7
1.2.2  第一印象    7
1.2.3  深入分析    8
1.2.4  革命尚未成功    9
1.2.5  結(jié)論    12
1.2.6  題外話和相關(guān)討論    12
MSDN是最值得信賴的嗎    12
你敢說CPU壞了    12
DWORD和文件長(zhǎng)度    13
程序輸出0xcdcdcdcd,想到了什么    13
1.3  簡(jiǎn)單的問題最棘手:稀疏平常的ASP.NET Session Lost問題    14
1.3.1  問題描述    14
1.3.2  制定策略    14
1.3.3  具體操作和結(jié)論    15
1.3.4  題外話和相關(guān)討論    16
排查session lost的經(jīng)驗(yàn)    16
1.4  本可以做得更好:SharePoint中文界面變英文    17
1.4.1  問題描述    17
1.4.2  排錯(cuò)步驟    17
1.4.3  錯(cuò)過的線索    19
第2章  匯編、異常、內(nèi)存、同步和調(diào)試器——重要的知識(shí)點(diǎn)和神兵利器    21
2.1  排錯(cuò)的工具:調(diào)試器Windbg    21
2.1.1  調(diào)試器的功能:檢查代碼和資料,保存dump文件, 斷點(diǎn)控制程序的執(zhí)行    22
2.1.2  符號(hào)文件(Symbol file),把二進(jìn)制和源代碼對(duì)應(yīng)起來    23
2.1.3  一個(gè)簡(jiǎn)單的上手程序    24
2.1.4  用Internet Explorer來操練調(diào)試器的基本命令    32
vertarget檢查進(jìn)程概況    32
!peb 顯示Process Environment Block    33
lmvm 檢查模塊的加載信息    33
.reload / !sym 加載符號(hào)文件    33
lmf 列出當(dāng)前進(jìn)程中加載的所有模塊    34
r,d,e 寄存器,內(nèi)存的檢查和修改    34
!address顯示內(nèi)存頁信息    35
S 搜索內(nèi)存    35
!runaway 檢查線程的CPU消耗    36
~ 切換目標(biāo)線程    37
k,kb,kp,kv,kn 檢查call stack    37
u 反匯編    38
x 查找符號(hào)的二進(jìn)制地址    38
dds 對(duì)應(yīng)二進(jìn)制地址的符號(hào)    38
2.1.5  檢查程序資料的小例子    40
.frame 在棧中切換以便檢查局部變量    41
dt 格式化顯示資料    41
2.1.6  用Windbg控制程序進(jìn)行實(shí)時(shí)調(diào)試(Live Debug)    42
Wt Watch and Trace, 跟蹤執(zhí)行的強(qiáng)大命令    42
斷點(diǎn)和條件斷點(diǎn)(condition breakpoint),高效地控制觀測(cè)目標(biāo)    44
偽寄存器,幫助保存調(diào)試的中間信息    46
Step Out的實(shí)現(xiàn)    47
2.1.7  遠(yuǎn)程調(diào)試(Remote debug)    47
2.1.8  如何通過Windbg命令行讓中文魔獸爭(zhēng)霸運(yùn)行在英文系統(tǒng)上    48
2.1.9  Dump文件    49
2.1.10  CDB、NTSD和重定向到Kernel Debugging    49
2.1.11  Debugger Extension,擴(kuò)展Windbg的功能    50
2.2  讀懂機(jī)器的語言:匯編,CPU執(zhí)行指令的最小單元    50
2.2.1  需要用匯編來排錯(cuò)的常見情況    50
案例分析:用匯編讀懂VC編譯器的優(yōu)化    51
問題描述    51
我的分析    51
案例分析:VC2003 編譯器的bug、debug模式正常,release模式會(huì)崩潰    52
例子程序    52
跟蹤匯編指令來分析    53
案例分析:臭名昭著的DLL Hell如何導(dǎo)致ASP.NET出現(xiàn)Server Unavailable    54
2.2.2  題外話和相關(guān)討論    55
Release比 Debug快嗎    55
2.3  理解操作系統(tǒng)對(duì)程序的反饋:異常(Exception)和通知(Debug Event)    56
2.3.1  異常(Exception)的方方面面和一篇字字珠璣的文章    56
案例分析:如何讓C++像C#一樣打印出函數(shù)調(diào)用棧(callstack)    58
2.3.2  Adplus,抓取dump的方便工具    58
案例分析:華生醫(yī)生(Dr. Watson)在什么情況下不能記錄Dump文件    59
問題描述    59
背景知識(shí)    59
問題分析    60
新的做法    61
問題解決了,可是為什么華生醫(yī)生(Dr. Watson)抓不到dump呢    61
2.3.3  通知(Debug Event)是操作系統(tǒng)跟調(diào)試器交流的一種方法    63
案例分析:VB6的版本問題    64
2.3.4  題外話和相關(guān)討論    65
錯(cuò)過第一現(xiàn)場(chǎng)后還從dump中分析出線索嗎    65
Adplus,天天都用的工具    67
未處理異常發(fā)生后的主動(dòng)退出    67
如何調(diào)試UnhandledExceptionFilter    68
2.4  平坦內(nèi)存空間中的層次結(jié)構(gòu):Heap和Stack    69
2.4.1  Heap是對(duì)平坦空間的高效管理和利用    69
2.4.2  PageHeap,調(diào)試Heap問題的工具    71
簡(jiǎn)單例子的多種情況    71
Heap上的內(nèi)存泄漏和內(nèi)存碎片    73
2.4.3  Stack overrun/corruption    74
2.4.4  題外話和相關(guān)討論    76
PageHeap的/unaligned參數(shù)    76
Heap trace,系統(tǒng)幫你記錄下每次Heap的操作    76
為何才分配了300MB內(nèi)存,就報(bào)告Out of memory    79
2.5  找準(zhǔn)排查問題的對(duì)應(yīng)層次    80
2.5.1  從C運(yùn)行庫(kù)看層次    80
2.5.2  簡(jiǎn)單的_CRTDBG_MAP_ALLOC定義就可以讓內(nèi)存泄漏無可遁形    81
2.5.3  BSTR Cache,建立在Heap之上的COM字符串內(nèi)存管理    82
2.5.4  題外話和相關(guān)討論    83
CRT Debug Heap一定對(duì)Debug有幫助嗎    83
C++中new操作符的尷尬    83
2.6  理清多個(gè)線程對(duì)資源的競(jìng)爭(zhēng):同步和鎖    84
2.6.1  句柄泄漏、死鎖和線程爭(zhēng)用,三個(gè)典型問題    84
句柄泄漏(Handle Leak)    84
死鎖(Deadlock)    84
線程爭(zhēng)用 (contention)    86
2.6.2  Windbg中的對(duì)應(yīng)排錯(cuò)    87
!handle 檢查句柄信息    87
!htrace 檢查操作句柄的歷史記錄    88
!cs 列出CriticalSection的詳細(xì)信息    89
排查CriticalSection leak( Orphan CriticalSection)    90
Invalid handle exception    92
案例分析:ArrayList.Add的時(shí)候發(fā)生IndexOutOfRangeException    93
問題描述    93
這個(gè)異常不簡(jiǎn)單    93
具體操作    94
結(jié)論    95
2.7  調(diào)試和設(shè)計(jì)    96
2.7.1  一位熱心朋友的提問    96
案例分析:反被聰明誤    98
第3章  .NET Framework的原理和SOS調(diào)試——剖析CLR程序和CLR本身    101
3.1  MetaData、JIT、GC和Exception的關(guān)鍵點(diǎn)    101
3.1.1  MetaData(元資料)和引擎初始化    101
3.1.2  JIT動(dòng)態(tài)編譯    102
3.1.3  GC 內(nèi)存管理    103
3.1.4  Exception Handling異常處理    104
3.2  用Windbg探索CLR的實(shí)現(xiàn)    105
3.2.1  開源的CLR實(shí)現(xiàn):Rotor    105
3.2.2  對(duì)一個(gè)Hello world的WinForm程序庖丁解牛    106
mscoree!_CorExeMain CLR引擎的入口    106
EEStartupHelper 重要的引擎初始化函數(shù)    107
mscorwks!SystemDomain::ExecuteMainMethod 執(zhí)行托管代碼的入口    108
CallDescr /MakeJitWorker Jit引擎發(fā)動(dòng)的地方    109
NtUserWaitMessage 托管程序完成加載    111
gc_heap::allocate_more_space/ GCHeap::GarbageCollect 通過GC管理內(nèi)存
  的分配和釋放    113
AppDomain,ThreadPool,Exception,StackWalk,Security都是有趣的話題    115
3.3  通過SOS快捷方便地調(diào)試托管程序    116
3.3.1  CLR讓托管程序的調(diào)試變得非常簡(jiǎn)單    116
3.3.2  SOS的命令介紹    117
3.4  用簡(jiǎn)單的程序演示SOS的常見操作    121
3.4.1  .load SOS 加載SOS到Windbg    121
3.4.2  !dumpheap 統(tǒng)計(jì)托管內(nèi)存使用信息    122
3.4.3  !do 顯示托管對(duì)象的詳細(xì)信息    122
3.4.4  !gcroot 查找托管對(duì)象的引用關(guān)系    123
案例分析:ASP.NET High CPU和更多的CLR命令演示    124
!threads查看托管線程    125
!tp查看線程池和CPU占用率    125
!SyncBlk查看托管線程的lock    127
!ip2md 映像內(nèi)存地址到托管函數(shù)名    128
!savemodule 保存模塊到本地以便用reflector分析    128
著名的blog:If broken it is,fix it you should    129
3.5  題外話和相關(guān)討論    129
3.5.1  ReleaseCOMObject 釋放COM對(duì)象時(shí)候的兩難困境    129
3.5.2  PInvoke應(yīng)該P(yáng)in住內(nèi)存防止崩潰    130
3.5.3  Pin住內(nèi)存又會(huì)導(dǎo)致內(nèi)存碎片    131
3.5.4  臭名昭著的mixed DLL loading deadlock    131
3.5.5  有趣且有用的練習(xí)和更多的資料    132
第4章  崩潰,性能和資源泄漏——分享一些經(jīng)驗(yàn)    133
4.1  排錯(cuò)開始前的準(zhǔn)備工作    133
4.1.1  用正確的態(tài)度對(duì)待問題    133
4.1.2  用簡(jiǎn)單的提問縮小排錯(cuò)的范圍    134
4.1.3  通過MPS REPORT獲取系統(tǒng)的詳細(xì)信息    135
4.1.4  通過簡(jiǎn)單的Dump分析獲取基本信息    136
4.2  崩潰(Crash)    137
4.2.1  崩潰的萬千種不同死相    137
4.2.2  準(zhǔn)確獲取Dump    141
Adplus:最容易上手的dump腳本    141
華生醫(yī)生(dr Watson)    143
通過Image File Execution Options讓調(diào)試器隨目標(biāo)程序一起啟動(dòng)    143
COM+和ASP.NET的dump獲取需要特殊配置    144
4.2.3  crash dump中需要重點(diǎn)關(guān)注的信息    144
案例分析:VC程序的崩潰    145
問題描述    145
MessageBox 嵌套調(diào)用    146
從源代碼中發(fā)現(xiàn)的疑點(diǎn)    148
從This指針找崩潰的根源    149
結(jié)論    152
4.2.4  小結(jié)和更多的資源    153
4.2.5  題外話和相關(guān)討論    153
HeapCorruption    153
StackCorruption    153
4.3  性能(Performance)    154
4.3.1  “你真牛,不如你再給我縮短10秒吧!”不是想要多快就能調(diào)到多快    155
4.3.2  性能調(diào)優(yōu)的步驟,CPU利用率是關(guān)鍵    156
4.3.3  無所不知的性能監(jiān)視器    157
使用性能監(jiān)視器的基本步驟    158
重要的計(jì)數(shù)器    159
案例分析:博客園的性能問題    163
案例分析:堵塞在SqlCommand.ExecuteReader上就一定在等sql嗎    168
問題背景    168
案例分析:堵塞在Assembly.Load上的deadlock    172
問題背景    172
案例分析:196個(gè)線程織成的一張網(wǎng)    180
問題背景    180
小結(jié)    191
4.3.4  用Profiler精確定位性能瓶頸    191
案例分析:DataTable中foreach和for loop性能差了50%    192
問題背景    192
4.3.5  題外話和相關(guān)討論    197
Task manager跟performance monitor的差別    197
性能監(jiān)視器的超級(jí)用法    197
C++跟C#到底誰快    199
沒有profiler怎么辦    199
4.4  資源泄漏(Resource Leak)    201
4.4.1  資源泄漏分輕重緩急    201
4.4.2  內(nèi)存泄漏排錯(cuò)的基本步驟    203
泄漏了什么,誰分配的,為什么無法釋放    203
定位泄漏內(nèi)存的類型和增長(zhǎng)趨勢(shì)    203
區(qū)分managed heap leak和native leak    204
案例分析:IE7的內(nèi)存泄漏    205
問題描述    205
重現(xiàn)問題和基本分析    205
用傳統(tǒng)的Pageheap+UMDH找到問題根源    207
方便強(qiáng)大的IIS Diagnostics工具    213
結(jié)論    222
分析IIS Diag    222
4.4.3  托管內(nèi)存泄漏    223
案例分析:object chain讓排錯(cuò)簡(jiǎn)單明了    223
問題背景    223
案例分析:一個(gè)bt的案例    229
碎片的其他原因    231
4.4.4  句柄泄漏(Handle Leak)    231
4.4.5  題外話和相關(guān)討論    233
GDI Leak    233
Desktop heap issue    233
更多的資源    235

本目錄推薦

掃描二維碼
Copyright ? 讀書網(wǎng) m.ranfinancial.com 2005-2020, All Rights Reserved.
鄂ICP備15019699號(hào) 鄂公網(wǎng)安備 42010302001612號(hào)