• <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

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

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

            posted on 2010-10-11 09:31 我風 閱讀(857) 評論(0)  編輯 收藏 引用
            <2010年6月>
            303112345
            6789101112
            13141516171819
            20212223242526
            27282930123
            45678910

            常用鏈接

            留言簿(12)

            隨筆分類

            隨筆檔案

            文章檔案

            相冊

            收藏夾

            C++

            MyFavorite

            搜索

            •  

            積分與排名

            • 積分 - 326075
            • 排名 - 75

            最新評論

            閱讀排行榜

            評論排行榜

            久久精品国产国产精品四凭| 人人狠狠综合88综合久久| 久久久久久无码Av成人影院| 精品免费久久久久久久| 久久精品亚洲乱码伦伦中文| 无码人妻精品一区二区三区久久| 久久国产精品久久精品国产| 人人妻久久人人澡人人爽人人精品| 国产精品一区二区久久国产| 亚洲乱码日产精品a级毛片久久| WWW婷婷AV久久久影片| 久久综合久久美利坚合众国| 亚洲国产精久久久久久久| 久久精品国产亚洲AV影院| 久久99精品国产麻豆蜜芽| 久久精品国产亚洲AV高清热 | 国产精品久久久久国产A级| 久久久久亚洲?V成人无码| 精品熟女少妇a∨免费久久| 久久久亚洲AV波多野结衣| 久久精品国产亚洲5555| 亚洲狠狠综合久久| 国产精品视频久久久| 久久久久久久久无码精品亚洲日韩| 一本久久a久久精品综合香蕉| 嫩草影院久久国产精品| 亚洲国产精品成人久久蜜臀| 国产99久久久国产精免费| 国内精品伊人久久久久| www性久久久com| 久久国产免费观看精品3| 久久人人爽人人爽人人片av麻烦 | 伊人久久免费视频| 久久se精品一区精品二区| 无码久久精品国产亚洲Av影片| 亚洲国产精品综合久久网络| 日本精品一区二区久久久| 色综合久久88色综合天天 | 欧美久久综合九色综合| 性欧美大战久久久久久久| 亚洲精品无码久久久|