• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            posts - 126,  comments - 73,  trackbacks - 0

            寫程序的人都有這個(gè)苦惱,用戶說你的程序總有時(shí)會莫名奇妙的崩潰,可是你怎么也無法重現(xiàn)崩潰的場景,所以也無法找出程序中的Bug,難道就束手無策嗎?
            ??? 前幾天在一本雜志(《程序員-游戲創(chuàng)造》)上看到一篇關(guān)于這個(gè)主題的文章,非常詳細(xì)的論述了怎樣通過代碼和工具實(shí)現(xiàn)Bug Report,使得你可以快速定位崩潰的源代碼行數(shù)。
            ?
            ??? 要catch未處理的異常,該文中論述了使用全局的try-catch的優(yōu)缺點(diǎn),全局的try-catch導(dǎo)致了調(diào)試工作的麻煩,不可取。Win32異常的可以通過設(shè)置過濾函數(shù)SetUnhandledExceptionFilter來處理,而C++也有set_terminate函數(shù)可以設(shè)置一個(gè)函數(shù)來處理任何未catch的異常。
            ?
            ?? 文章還告訴我們,main/WinMain是程序的入口處,但靜態(tài)初始化在這之前進(jìn)行,操作系統(tǒng)裝載我們的程序后,先調(diào)用的是CRT提供函數(shù)WinMainCRTStartup/mainCRTStartup,可以通過VC開發(fā)工具設(shè)置程序的入口函數(shù)來獲取異常的優(yōu)先控制權(quán)(/ENTRY:函數(shù))(Linker->Advanced->Entry Point)。
            ??? 1.用minidump進(jìn)行調(diào)試
            ??? 這個(gè)技術(shù)是改進(jìn)Windows操作系統(tǒng)的錯(cuò)誤報(bào)告機(jī)制的關(guān)鍵。產(chǎn)生的文件非常小,適合于網(wǎng)絡(luò)傳輸。???? 有三種方法創(chuàng)建一個(gè)minidump文件:???? a. 在你的應(yīng)用程序中加入未處理的exception處理函數(shù),函數(shù)中創(chuàng)建minidump文件???? b. Visual Studio .NET集成開發(fā)環(huán)境中調(diào)試時(shí),Debug菜單中按Save Dump???? c. Windows XP 在一個(gè)程序遇到未處理的異常時(shí)會自動產(chǎn)生minidump文件,但直接提交給微軟,你沒機(jī)會處理。
            ??? 要使用該技術(shù),build的時(shí)候要生成完全的調(diào)試信息文件(PDB),發(fā)布每個(gè)版本時(shí)要保存每個(gè)可執(zhí)行文件(exe/dll)以及相對應(yīng)的pdb文件,以備將來debug用。為了更好的輔助文件匹配,注意要正確設(shè)置每個(gè)可執(zhí)行文件的內(nèi)部版本號,每次發(fā)布要使用不同的版本號,然而debugger使用的是PE文件頭中內(nèi)部時(shí)間蹉來匹配的。在發(fā)布版本中生成調(diào)試信息有副作用,占用更多空間并且容易被逆向工程。
            ??? 寫minidump的API是MiniDumpWriteDump,在PlatformSDK中的DBGHelp.dll,只有XP版本的沒有問題。為了調(diào)用這個(gè)API,你必須使用SetUnhandledExceptionFilter API來設(shè)置一個(gè)未處理異常處理器,用來catch崩潰,但在VS2005之前,仍然會無法catch純C++異常。
            ??? 在你的函數(shù)中,注意要導(dǎo)入正確的DbgHelp.dll,使用LoadLibrary會默認(rèn)載入System32目錄下的dll,Win2000將會導(dǎo)致錯(cuò)誤。
            ??? 分析用戶傳回的minidump文件,使用Visual Studio .Net打開(*.dmp,*.mdmp)并創(chuàng)建缺省的項(xiàng)目。按F5在Output窗口中顯示載入的模塊信息。重建所有進(jìn)程狀態(tài),但可能缺少symbols以及調(diào)試信息。所以你需要所有匹配的exe和dll文件以及pdb文件,要查看所有的module打開Modules窗口,找出所有(通常沒必要所有)匹配的dll(DLL Help database: http://support.microsoft.com/servicedesks/fileversion/dllinfo.asp.),或者你需要操作系統(tǒng)的安裝盤或者從報(bào)告者的系統(tǒng)中得到所有匹配的dll,拷貝到本地的一個(gè)目錄下,例如D:\Mudules。然后設(shè)置項(xiàng)目的Debugging頁中的Command參數(shù)為MODPATH=D:\Mudules,按F5重新載入minidump。注意你也需要每個(gè)dll匹配的pdb文件,平臺的可以在操作系統(tǒng)安裝盤或者
            http://www.microsoft.com/ddk/debugging中找到。
            ?Operating system? Files required? Windows NT 4???????? DBGs? Windows 2000???????? DBGs, PDBs? Windows XP??????????? PDBs?????? 如果你要處理很多minidumps,可能需要所有的dll和pdb/dbg,這時(shí)你可以使用Symbol Server來管理所有資源,首先到
            http://www.microsoft.com/ddk/debugging/symbols.asp下載調(diào)試工具,拷貝Symsrv.dll到VS.Net可以訪問的地方,建一個(gè)本地目錄,例如:C:\localstore,在項(xiàng)目屬性對話框中設(shè)置Debugging頁中Symbol路徑為SRV*c:/localstore*http://msdl.microsoft.com/download/symbols。此后,每次F5后就會自動下載必要的文件。
            ??? 原文:http://www.codeproject.com/debug/postmortemdebug_standalone1.asp???? 例子:http://www.codeproject.com/debug/crash_report.asp
            ??? 2. map文件???? 生成map文件來定位崩潰的代碼行???? 原文:http://www.codeproject.com/debug/mapfile.asp???????? 3. CrashFinder
            ??? John Robbins 寫好的CrashFinder能夠發(fā)現(xiàn)VC++/VB的應(yīng)用程序的崩潰處(代碼行)。Release版本也要生成Debug信息,在VC中使用/Zi 編譯選項(xiàng)(C/C++ tab中Program Database )和/DEBUG and /PDB:<pdb filename>鏈接選項(xiàng)(Link tab中打勾Debug info 并選擇Microsoft format),VB中在項(xiàng)目屬性打勾Compile to Native Code 和Create Symbolic Debug Info 選項(xiàng)。
            ??? 如果你在Debugger的OUtput窗口中看到LDR: Dll xxx base 10000000 relocated due to collision with yyy信息,可以通過REBASE.EXE(Platform SDK)程序使得你可以重新安排載入dll/ocx地址,因?yàn)椴煌南到y(tǒng)載入dll/ocx的地址不同,如果沖突會導(dǎo)致你找不出到底是哪個(gè)dll崩潰。
            ??? 如果是beta版,你可以讓應(yīng)用程序生成詳細(xì)Dr. Watson 信息(要很大空間不適合傳輸),你可以在安裝應(yīng)用程序時(shí)檢測系統(tǒng)是否已經(jīng)安裝Dr. Watson(在注冊表HKEY_LOCAL_MACHINE\SOFTWARE\ Microsoft\Windows NT\CurrentVersion\AeDebug 處),有了這種信息你可以得到詳細(xì)的堆??臻g并游刃有余地找出崩潰的地方。
            ??? CrashFinder使用IMAGEHLP.DLL符號引擎(Windows NT? 4.0首次引入),Windows NT 5.0 SDK已經(jīng)可以處理源碼行號。(CrashFinder2.1已經(jīng)升級,使用最新的DBGHelp.dll)
            ??? CrashFinder只保存應(yīng)用程序和調(diào)試信息文件的目錄信息,所以無需每次編譯都需要CrashFinder連編。你可以創(chuàng)建多個(gè)CrashFinder項(xiàng)目,每個(gè)項(xiàng)目針對一種操作系統(tǒng)。
            ??? 原文:http://www.microsoft.com/msj/0498/bugslayer0498.aspx???? 下載:http://www.wintellect.com/about/instructors/robbins/code.aspx
            ?
            ??? 解決方案:
            ??? (To be continue)
            Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=658660

            文章出處:飛諾網(wǎng)(www.firnow.com):http://dev.firnow.com/course/3_program/c++/cppjs/200876/130580.html

            posted on 2010-10-11 09:31 我風(fēng) 閱讀(865) 評論(0)  編輯 收藏 引用
            <2007年10月>
            30123456
            78910111213
            14151617181920
            21222324252627
            28293031123
            45678910

            常用鏈接

            留言簿(12)

            隨筆分類

            隨筆檔案

            文章檔案

            相冊

            收藏夾

            C++

            MyFavorite

            搜索

            •  

            積分與排名

            • 積分 - 327335
            • 排名 - 75

            最新評論

            閱讀排行榜

            評論排行榜

            国产精品熟女福利久久AV| 久久久久夜夜夜精品国产| 久久久久99精品成人片牛牛影视 | 九九99精品久久久久久| 欧洲性大片xxxxx久久久| 精品国产乱码久久久久久1区2区| 久久久久黑人强伦姧人妻| 日产精品久久久久久久| 久久久久99精品成人片| 日产精品久久久久久久性色| 中文字幕久久波多野结衣av| 波多野结衣久久精品| 狠狠色丁香久久婷婷综| 大香伊人久久精品一区二区| 国产91久久精品一区二区| 久久久久久亚洲Av无码精品专口| 国产精品久久久久蜜芽| 97超级碰碰碰久久久久| 中文精品久久久久人妻| 亚洲性久久久影院| 国产高清国内精品福利99久久| 亚洲AV无码久久| 波多野结衣中文字幕久久| 国产精品嫩草影院久久| 久久精品国产99国产精偷| 性做久久久久久久| 欧美一区二区久久精品| 婷婷伊人久久大香线蕉AV| 色综合久久中文字幕综合网| 国产精品女同一区二区久久| 久久99国产精品久久久| 国产精品一区二区久久| 久久久久亚洲Av无码专| 亚洲va久久久噜噜噜久久男同| 亚洲精品tv久久久久久久久久| 免费精品久久久久久中文字幕| 中文字幕久久波多野结衣av| 四虎国产精品成人免费久久| 久久久亚洲欧洲日产国码二区| 99久久国产免费福利| 91精品婷婷国产综合久久|