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

            Dump調(diào)用堆棧的原理以及異常信息的反饋

            Dump 調(diào)用堆棧的原理以及異常信息的反饋

            動機(jī):

            在游戲開發(fā)過程中,我們利用 QA 部門來做產(chǎn)品的質(zhì)量保證,盡可能將絕大部分錯誤消化在內(nèi)部,保證游戲的版本質(zhì)量,但是 QA 部門畢竟有他的局限性,盡管經(jīng)過嚴(yán)格的測試也很難保證將所有的問題一網(wǎng)打盡.

             

            通過在 Log 中轉(zhuǎn)儲的錯誤信息,我們可以進(jìn)一步找出問題,但是 Log 文件產(chǎn)生在終端,我們拿到的也僅僅是公司內(nèi)部測試部門產(chǎn)生的 Log 文件,顯然公司內(nèi)部得到的信息是很有限的,如果能從玩家那里拿到異常信息,我們才能最快的去解決問題,盡可能在錯誤產(chǎn)生重大影響之前將其解決,所以我們有必要從被動的獲取異常信息,轉(zhuǎn)為主動去獲取.

             

            可行性 :

                   在錯誤發(fā)生時(shí) Dump 調(diào)用堆棧,可以讓我們知道錯誤發(fā)生的位置,這比已往普通的 LOG 更加有效的多.我們可以將出錯的堆棧地址反饋回來.這一切在終端出現(xiàn)異常的時(shí)候自動進(jìn)行. Windows 操作系統(tǒng)提供的 SEH 結(jié)構(gòu)化異常機(jī)制可能讓我們在程序崩潰的瞬間處理這些事情.

             

            效率問題 :

                   SEH windows 的異常機(jī)制,除非在編譯時(shí)候特別指定不使用,否則總有默認(rèn)的 SEH 處理機(jī)制, kernel32.dll 中有默認(rèn)的 SEH 處理接口,當(dāng)我們需要自己處理異常的時(shí)候,我們的處理點(diǎn)會掛接在異常處理鏈的最前端,這種鏈類似 Hook 的鏈.鏈的頭部放在 fs[0] 的位置.也就是說效率的問題是可以不必考慮,

             

             

            具體實(shí)現(xiàn) :

                   通過閱讀反匯編代碼可以了解函數(shù)調(diào)用過程中堆棧的結(jié)構(gòu) :

                  

                   1 函數(shù)調(diào)用時(shí) CALL 將下一行指令地址壓入堆棧

                   2 函數(shù)運(yùn)行第一行會將 EBP 壓入堆棧

                   3 保存當(dāng)前堆棧地址到 EBP (mov ebp,esp)

                  

                   再遇到 call 時(shí)從第一步執(zhí)行,所以每次第二步壓入堆棧的都是上一層函數(shù)調(diào)用的 ESP 地址,而這個(gè)地址 +4 字節(jié)偏移則是當(dāng)前調(diào)用函數(shù)返回后的下一條指令,也就是上一層函數(shù)的地址,所以我們只要知道當(dāng)前函數(shù)的 EBP ( 也就是當(dāng)前函數(shù)的棧頂 ) 就能夠遍歷得到所有調(diào)用堆棧層次.

                   dumpebp.jpg

            我們將windows SEH 結(jié)構(gòu)化異常引入后,可以在異常發(fā)生的時(shí)候得到當(dāng)前的EBP值,從而通過這個(gè)值得到整個(gè)調(diào)用堆棧的地址.

             

            在發(fā)布工程的時(shí)候,我們只需要生成map文件,就可以通過這個(gè)地址得到崩潰位置.使用HTTP GET 或POST方式可以將我們所需要的崩潰信息提交到我們指定的網(wǎng)站.這種方式只是通過URL參數(shù)來提交數(shù)據(jù),只需要使用API InternetOpenUrl就可以很方便的將信息提交.此外如果不使用HTTP方式,我們也可以在這個(gè)時(shí)候創(chuàng)建新的socket 對指定的服務(wù)器進(jìn)行連接來傳輸數(shù)據(jù).

                
                static TCHAR hdrs[] 
            = _T("Content-Type: application/x-www-form-urlencoded"); 
                static 
            const TCHAR* accept= _T("Accept: */*"); 
                    static TCHAR action[]=_T("datecomit.aspx");//預(yù)提交的頁面
                    static TCHAR server[]=_T("192.168.9.119");//提交的server地址

                static TCHAR frmdata[
            1024={0}; 
                _tcscpy(frmdata,_T("message=this is a test message");  //提交數(shù)據(jù), message為提交名字   
                
                
            // for clarity, error-checking has been removed 
                HINTERNET hSession 
            = InternetOpen("MyAgent"
                INTERNET_OPEN_TYPE_PRECONFIG, 
            NULLNULL0); 
                HINTERNET hConnect 
            = InternetConnect(hSession, server
                INTERNET_DEFAULT_HTTP_PORT, 
            NULLNULL, INTERNET_SERVICE_HTTP, 01); 
                HINTERNET hRequest 
            = HttpOpenRequest(hConnect, "POST", actionNULLNULL&accept, 01); 
                HttpSendRequest(hRequest, hdrs, strlen(hdrs), frmdata, strlen(frmdata)); 

             

            此后我們只需要定期觀察所提交的內(nèi)容,便可以立即得知是否有異常出現(xiàn).根據(jù)同一異常出現(xiàn)的幾率可以得知是否是致命的錯誤,是否需要緊急更新.

             


            posted on 2007-03-27 16:32 修一居士 閱讀(5324) 評論(7)  編輯 收藏 引用

            評論

            # re: Dump調(diào)用堆棧的原理以及異常信息的反饋 2007-03-28 15:47 Navi

            Windows 操作系統(tǒng)提供的 SHE 結(jié)構(gòu)化異常機(jī)制可能讓我們在程序崩潰的瞬間處理這些事情

            SEH not SHE.  回復(fù)  更多評論   

            # re: Dump調(diào)用堆棧的原理以及異常信息的反饋 2007-03-29 13:31 南斗

            筆誤,已改  回復(fù)  更多評論   

            # re: Dump調(diào)用堆棧的原理以及異常信息的反饋 2007-05-11 22:02 nick

            坦白說, 通過這種方式獲取調(diào)用棧并不理想.
            首先是繁瑣.
            其次是有局限. 遇上 FPO 就不行了. 而現(xiàn)在的程序, 尤其是游戲程序, 哪個(gè)不是優(yōu)化到極致.

            其實(shí)最好的辦法還是 minidump. 一個(gè)幾十K的 dump 文件就可以包含完整的調(diào)用棧了. 再大一點(diǎn)的文件就可以包含臨時(shí)變量、參數(shù)等的值了.
            可以看看 www.debuginfo.com 上面關(guān)于 minidump 的文章.

            我的 blog 上也有一個(gè)例子. 基本上是抄 debuginfo 的. 呵呵  回復(fù)  更多評論   

            # re: Dump調(diào)用堆棧的原理以及異常信息的反饋 2007-05-26 00:29 南斗

            獲取簡單的堆棧地址已經(jīng)完全夠用了,用minidump弄那么大的dump文件我還要傳回服務(wù)器你不覺得很恐怖嗎,利用調(diào)用堆棧地址在map文件中就可以找到所有的問題了,我在我的項(xiàng)目中一直用這個(gè)方法 ;)  回復(fù)  更多評論   

            # re: Dump調(diào)用堆棧的原理以及異常信息的反饋 2008-03-20 11:01 Bright

            @nick
            不錯啊!終于找到能產(chǎn)生MiniDump文件的方法了,非常感謝!!  回復(fù)  更多評論   

            # re: Dump調(diào)用堆棧的原理以及異常信息的反饋 2008-07-29 16:07 ershu

            不是很好的方法。還有其他的方法,我們也使用過。都不是很好。信息不準(zhǔn)確。

            minidump是我們試過最好的方法。微軟自己也用它。

            minidump壓縮一下以后才10幾k?上傳到你們的服務(wù)器就不行了?
            我們的服務(wù)器工作得很好。  回復(fù)  更多評論   

            # re: Dump調(diào)用堆棧的原理以及異常信息的反饋 2010-07-07 12:00 南斗

            @ershu
            呵呵 這要看你的具體應(yīng)用了,我這里應(yīng)用在游戲客戶端的崩潰記錄,同時(shí)在線的用戶數(shù)量可能有幾十萬,畢竟為了節(jié)約成本只會配置這樣一臺崩潰信息記錄服務(wù)器,所以上傳還是盡量越少越好。

            而實(shí)際上我們也不需要那么詳細(xì)的崩潰記錄信息,minidump大部分記錄了當(dāng)前的進(jìn)程、線程、以及內(nèi)存狀況,實(shí)際上我們只需要簡單的堆棧信息就夠用了。

            對于信息記錄不準(zhǔn)確的問題,我想這個(gè)一般都是因?yàn)楫?dāng)前指令指針錯誤,跳躍到了非法的地址,而無法通過ebp反推出堆棧信息,目前應(yīng)該是無論何種方法都解決不了的。  回復(fù)  更多評論   


            只有注冊用戶登錄后才能發(fā)表評論。
            網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


            導(dǎo)航

            <2009年8月>
            2627282930311
            2345678
            9101112131415
            16171819202122
            23242526272829
            303112345

            統(tǒng)計(jì)

            常用鏈接

            留言簿(3)

            隨筆檔案

            搜索

            最新評論

            閱讀排行榜

            評論排行榜

            日本亚洲色大成网站WWW久久 | 7国产欧美日韩综合天堂中文久久久久| 国产精品中文久久久久久久| 亚洲中文字幕无码久久精品1 | 国産精品久久久久久久| 久久这里只精品99re66| 久久99精品国产99久久| 久久青青草原精品国产软件| 无码人妻久久一区二区三区免费丨| 青青草原1769久久免费播放| 99久久国产亚洲综合精品| 色综合久久精品中文字幕首页| 亚洲精品视频久久久| 久久se精品一区精品二区国产| 亚洲级αV无码毛片久久精品| 久久精品中文字幕有码| 久久久久女人精品毛片| 久久人人爽人人爽人人片av麻烦 | 91精品国产色综久久| 亚洲精品美女久久777777| 亚洲欧美日韩久久精品| 国内精品久久久久久久久| 国产精品久久成人影院| 久久久无码一区二区三区| 欧美日韩久久中文字幕| 中文字幕无码av激情不卡久久| 久久黄视频| 久久国产精品偷99| 99久久亚洲综合精品网站| 久久婷婷综合中文字幕| 国产69精品久久久久777| 久久久久久亚洲AV无码专区| 久久人人爽人人爽人人AV| 精品熟女少妇AV免费久久| 亚洲精品蜜桃久久久久久| 欧洲成人午夜精品无码区久久| 久久久www免费人成精品| 亚洲日韩中文无码久久| 久久夜色精品国产噜噜麻豆| 久久丫精品国产亚洲av不卡| 久久九九精品99国产精品|