出版時間:2007-12 出版社:電子工業(yè)出版社 作者:熊力 頁數(shù):236
Tag標簽:無
內容概要
本書是一本介紹Windows系統(tǒng)上的用戶態(tài)程序排錯方法和技巧的書。本書分為4個章節(jié),先介紹最重要的、通用的思考方法,以便制定排錯步驟;再介紹對排錯有幫助的知識點和工具;并介紹了.NET Framework(CLR)的相關知識和調試技巧;最后一章針對常見的幾大類問題進行了總結?! ”緯咐S富,對現(xiàn)實中的實際問題進行了研究,并和讀者一起分析解決辦法;本書的寫作思路為先給出問題描述,然后提供線索,再進行分析,讓讀者在閱讀中也進行思考,以提高實際解決問題的能力。本書適合希望學習排錯、調試知識的軟件開發(fā)、測試人員,希望深入學習Windows系統(tǒng)上用戶態(tài)程序的排錯知識的軟件開發(fā)、測試人員。
作者簡介
熊力,2004年開始在上海微軟技術支持中心擔任技術支持工程師。他所在的小組負責幫助企業(yè)客戶解決開發(fā)領域的技術難題。作者專注于.NET Framework、 C/C++、COM和Web開發(fā),現(xiàn)任微軟中國研發(fā)集團服務器與開發(fā)工具事業(yè)部測試工程師。
書籍目錄
第1章 比工具、技巧和經(jīng)驗都重要的是你的思考——從四個風格迥異的案例說起1.1 絕望的性能問題:ADO.NET 2.0竟然比1.0要慢1.1.1 問題描述1.1.2 悲觀和絕望1.1.3 換位思考1.1.4 排錯1.1.5 結論和收獲1.1.6 題外話和相關討論Safehandle的更多討論平衡、取舍、雙贏和RFC 1925Profiler的下載地址和相關資源1.2 不可思議:一個API同時打開了兩個文件1.2.1 問題描述1.2.2 第一印象1.2.3 深入分析1.2.4 革命尚未成功1.2.5 結論1.2.6 題外話和相關討論MSDN是最值得信賴的嗎你敢說CPU壞了DWORD和文件長度程序輸出0xcdcdcdcd,想到了什么1.3 簡單的問題最棘手:稀疏平常的ASP.NET Session Lost問題1.3.1 問題描述1.3.2 制定策略1.3.3 具體操作和結論1.3.4 題外話和相關討論排查session lost的經(jīng)驗1.4 本可以做得更好:SharePoint中文界面變英文1.4.1 問題描述1.4.2 排錯步驟1.4.3 錯過的線索第2章 匯編、異常、內存、同步和調試器——重要的知識點和神兵利器2.1 排錯的工具:調試器Windbg2.1.1 調試器的功能:檢查代碼和資料,保存dump文件, 斷點控制程序的執(zhí)行2.1.2 符號文件(Symbol file),把二進制和源代碼對應起來2.1.3 一個簡單的上手程序2.1.4 用Internet Explorer來操練調試器的基本命令vertarget檢查進程概況!peb 顯示Process Environment Blocklmvm 檢查模塊的加載信息.reload / !sym 加載符號文件lmf 列出當前進程中加載的所有模塊r,d,e 寄存器,內存的檢查和修改!address顯示內存頁信息S 搜索內存!runaway 檢查線程的CPU消耗~ 切換目標線程k,kb,kp,kv,kn 檢查call stacku 反匯編x 查找符號的二進制地址dds 對應二進制地址的符號2.1.5 檢查程序資料的小例子.frame 在棧中切換以便檢查局部變量dt 格式化顯示資料2.1.6 用Windbg控制程序進行實時調試(Live Debug)Wt Watch and Trace, 跟蹤執(zhí)行的強大命令斷點和條件斷點(condition breakpoint),高效地控制觀測目標偽寄存器,幫助保存調試的中間信息Step Out的實現(xiàn)2.1.7 遠程調試(Remote debug)2.1.8 如何通過Windbg命令行讓中文魔獸爭霸運行在英文系統(tǒng)上2.1.9 Dump文件2.1.10 CDB、NTSD和重定向到Kernel Debugging2.1.11 Debugger Extension,擴展Windbg的功能2.2 讀懂機器的語言:匯編,CPU執(zhí)行指令的最小單元2.2.1 需要用匯編來排錯的常見情況案例分析:用匯編讀懂VC編譯器的優(yōu)化問題描述我的分析案例分析:VC2003 編譯器的bug、debug模式正常,release模式會崩潰例子程序跟蹤匯編指令來分析案例分析:臭名昭著的DLL Hell如何導致ASP.NET出現(xiàn)Server Unavailable2.2.2 題外話和相關討論Release比 Debug快嗎2.3 理解操作系統(tǒng)對程序的反饋:異常(Exception)和通知(Debug Event)2.3.1 異常(Exception)的方方面面和一篇字字珠璣的文章案例分析:如何讓C++像C#一樣打印出函數(shù)調用棧(callstack)2.3.2 Adplus,抓取dump的方便工具案例分析:華生醫(yī)生(Dr. Watson)在什么情況下不能記錄Dump文件問題描述背景知識問題分析新的做法問題解決了,可是為什么華生醫(yī)生(Dr. Watson)抓不到dump呢2.3.3 通知(Debug Event)是操作系統(tǒng)跟調試器交流的一種方法案例分析:VB6的版本問題2.3.4 題外話和相關討論錯過第一現(xiàn)場后還從dump中分析出線索嗎Adplus,天天都用的工具未處理異常發(fā)生后的主動退出如何調試UnhandledExceptionFilter2.4 平坦內存空間中的層次結構:Heap和Stack2.4.1 Heap是對平坦空間的高效管理和利用2.4.2 PageHeap,調試Heap問題的工具簡單例子的多種情況Heap上的內存泄漏和內存碎片2.4.3 Stack overrun/corruption2.4.4 題外話和相關討論PageHeap的/unaligned參數(shù)Heap trace,系統(tǒng)幫你記錄下每次Heap的操作為何才分配了300MB內存,就報告Out of memory2.5 找準排查問題的對應層次2.5.1 從C運行庫看層次2.5.2 簡單的_CRTDBG_MAP_ALLOC定義就可以讓內存泄漏無可遁形2.5.3 BSTR Cache,建立在Heap之上的COM字符串內存管理2.5.4 題外話和相關討論CRT Debug Heap一定對Debug有幫助嗎C++中new操作符的尷尬2.6 理清多個線程對資源的競爭:同步和鎖2.6.1 句柄泄漏、死鎖和線程爭用,三個典型問題句柄泄漏(Handle Leak)死鎖(Deadlock)線程爭用 (contention)2.6.2 Windbg中的對應排錯!handle 檢查句柄信息!htrace 檢查操作句柄的歷史記錄!cs 列出CriticalSection的詳細信息排查CriticalSection leak( Orphan CriticalSection)Invalid handle exception案例分析:ArrayList.Add的時候發(fā)生IndexOutOfRangeException問題描述這個異常不簡單具體操作結論2.7 調試和設計2.7.1 一位熱心朋友的提問案例分析:反被聰明誤第3章 .NET Framework的原理和SOS調試——剖析CLR程序和CLR本身3.1 MetaData、JIT、GC和Exception的關鍵點3.1.1 MetaData(元資料)和引擎初始化3.1.2 JIT動態(tài)編譯3.1.3 GC 內存管理3.1.4 Exception Handling異常處理3.2 用Windbg探索CLR的實現(xiàn)3.2.1 開源的CLR實現(xiàn):Rotor3.2.2 對一個Hello world的WinForm程序庖丁解牛mscoree!_CorExeMain CLR引擎的入口EEStartupHelper 重要的引擎初始化函數(shù)mscorwks!SystemDomain::ExecuteMainMethod 執(zhí)行托管代碼的入口CallDescr /MakeJitWorker Jit引擎發(fā)動的地方NtUserWaitMessage 托管程序完成加載gc_heap::allocate_more_space/ GCHeap::GarbageCollect 通過GC管理內存的分配和 釋放AppDomain,ThreadPool,Exception,StackWalk,Security都是有趣的話題3.3 通過SOS快捷方便地調試托管程序3.3.1 CLR讓托管程序的調試變得非常簡單3.3.2 SOS的命令介紹3.4 用簡單的程序演示SOS的常見操作3.4.1 .load SOS 加載SOS到Windbg3.4.2??!dumpheap 統(tǒng)計托管內存使用信息3.4.3??!do 顯示托管對象的詳細信息3.4.4??!gcroot 查找托管對象的引用關系案例分析:ASP.NET High CPU和更多的CLR命令演示!threads查看托管線程!tp查看線程池和CPU占用率!SyncBlk查看托管線程的lock!ip2md 映像內存地址到托管函數(shù)名!savemodule 保存模塊到本地以便用reflector分析著名的blog:If broken it is,fix it you should3.5 題外話和相關討論3.5.1 ReleaseCOMObject 釋放COM對象時候的兩難困境3.5.2 PInvoke應該Pin住內存防止崩潰3.5.3 Pin住內存又會導致內存碎片3.5.4 臭名昭著的mixed DLL loading deadlock3.5.5 有趣且有用的練習和更多的資料第4章 崩潰,性能和資源泄漏——分享一些經(jīng)驗4.1 排錯開始前的準備工作4.1.1 用正確的態(tài)度對待問題4.1.2 用簡單的提問縮小排錯的范圍4.1.3 通過MPS REPORT獲取系統(tǒng)的詳細信息4.1.4 通過簡單的Dump分析獲取基本信息4.2 崩潰(Crash)4.2.1 崩潰的萬千種不同死相4.2.2 準確獲取DumpAdplus:最容易上手的dump腳本華生醫(yī)生(dr Watson)通過Image File Execution Options讓調試器隨目標程序一起啟動COM+和ASP.NET的dump獲取需要特殊配置4.2.3 crash dump中需要重點關注的信息案例分析:VC程序的崩潰問題描述MessageBox 嵌套調用從源代碼中發(fā)現(xiàn)的疑點從This指針找崩潰的根源結論4.2.4 小結和更多的資源4.2.5 題外話和相關討論HeapCorruptionStackCorruption4.3 性能(Performance)4.3.1 “你真牛,不如你再給我縮短10秒吧!”不是想要多快就能調到多快4.3.2 性能調優(yōu)的步驟,CPU利用率是關鍵4.3.3 無所不知的性能監(jiān)視器使用性能監(jiān)視器的基本步驟重要的計數(shù)器案例分析:博客園的性能問題案例分析:堵塞在SqlCommand.ExecuteReader上就一定在等sql嗎問題背景案例分析:堵塞在Assembly.Load上的deadlock問題背景案例分析:196個線程織成的一張網(wǎng)問題背景小結4.3.4 用Profiler精確定位性能瓶頸案例分析:DataTable中foreach和for loop性能差了50%問題背景4.3.5 題外話和相關討論Task manager跟performance monitor的差別性能監(jiān)視器的超級用法C++跟C#到底誰快沒有profiler怎么辦4.4 資源泄漏(Resource Leak)4.4.1 資源泄漏分輕重緩急4.4.2 內存泄漏排錯的基本步驟泄漏了什么,誰分配的,為什么無法釋放定位泄漏內存的類型和增長趨勢區(qū)分managed heap leak和native leak案例分析:IE7的內存泄漏問題描述重現(xiàn)問題和基本分析用傳統(tǒng)的Pageheap+UMDH找到問題根源方便強大的IIS Diagnostics工具結論分析IIS Diag4.4.3 托管內存泄漏案例分析:object chain讓排錯簡單明了問題背景案例分析:一個bt的案例碎片的其他原因4.4.4 句柄泄漏(Handle Leak)4.4.5 題外話和相關討論GDI LeakDesktop heap issue更多的資源
編輯推薦
《Windows用戶態(tài)程序高效排錯》案例豐富,對現(xiàn)實中的實際問題進行了研究,并和讀者一起分析解決辦法;《Windows用戶態(tài)程序高效排錯》的寫作思路為先給出問題描述,然后提供線索,再進行分析,讓讀者在閱讀中也進行思考,以提高實際解決問題的能力?!禬indows用戶態(tài)程序高效排錯》適合希望學習排錯、調試知識的軟件開發(fā)、測試人員,希望深入學習Windows系統(tǒng)上用戶態(tài)程序的排錯知識的軟件開發(fā)、測試人員。
圖書封面
圖書標簽Tags
無
評論、評分、閱讀與下載