定位VC程序異常的方法_第1頁
定位VC程序異常的方法_第2頁
定位VC程序異常的方法_第3頁
定位VC程序異常的方法_第4頁
定位VC程序異常的方法_第5頁
已閱讀5頁,還剩5頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

檔,歡迎下載VC方法一些說就是我們的程序當(dāng)?shù)袅?,?dāng)Windows給我們彈出一個異常對話框時,我們應(yīng)如何根據(jù)本文介紹了一種能夠方便地根據(jù)異常信息定位VC開發(fā)的程序BUG的方法,支持在NT、XP2、關(guān)鍵過程、根本原因分析許多異常定位的實現(xiàn),基本原理都是一樣,調(diào)用APISetUnhandledExceptionFilter設(shè)然后配合map文件來進行異常定位,觀察到底是哪里的代碼出了問題。對于上面的分析方法存在兩個問題,一是map文件的生成問題,很長時間以來,我們項目組內(nèi)一直不知道應(yīng)如何讓據(jù)異常出現(xiàn)的指令位置定位到代碼的具體行,在沒有堆棧信息的時候也能夠做一個基本的定位;二是分析的麻煩,要對著map文件去很費勁的找。針對以上現(xiàn)狀,一方面要解決map文件生成的問題,另一方面就是如何根據(jù)異常信息來3、結(jié)論、解決方案及效果map文件的生成在工程設(shè)置對話框中Link頁,General分類中,選中Generatemapfile選項,如下圖所在最下方的ProjectOptions中增加編譯選項:/MAPINFO:EXPORTS/MAPINFO:LINES下拉列表選中為ProgramDatabase,如下圖所示:經(jīng)過以上設(shè)置后,生成的map文件中就能夠包含行信息了,類似下面的情況:使用XCPTHLR.dll該動態(tài)庫完成的工作就是記錄異常信息,并根據(jù)編譯過程中生成的pdb文件進行分析,果你在使用的過程中覺得不需要那么多信息,可以修改ExceptHandle.cpp中的CExceptionLogger::GenerateCrashLog函數(shù),在該文件頭部的注釋中詳細描述了工程設(shè)置的方法、記錄信息的內(nèi)容以及如何使用,這里就我測試的情況給大家大概描述一下。在編譯的過程中需要使用下面兩個東東,安裝了最新的SDK后才有(花了好長的時間才運行的時候需要調(diào)用SymGetTypeInfo這個API,但NT、2000目前的DbgHelp.dll不支持,XP和Win2003才有,所以只好從XP上找了一個過來用,運行的時候需要把這個動態(tài)苦放在我們工程App類的InitInstance中調(diào)用LoadLibrary(“XCPTHLR.dll”);按照注釋中的說明設(shè)置工程選項:如下圖所示:在最下方的ProjectOptions編輯框中增加編譯開關(guān)“/OPT:REF”;OK,在你的程序中故意寫一些錯誤的代碼,例如:char*p=NULL;*p=0;運行你的程序,會發(fā)現(xiàn)生成了類似下面的文件:(我這里屏蔽了本進程其它模塊的信息)異常的地址,第7行,如下:ExceptionAddressDetails:0x00401477[.text]:0x00000477D:\xxx\Release\xxx.exe其中0x000000477(0x00401447–0x00401000)就是異常代碼所在的位置,根據(jù)此信息我們可以結(jié)合map文件定位到具體出問題的那一行代碼;第二,調(diào)用棧(CallStack),在文件的最后,CallStack:0x00401477[.text]:0x00000477D:\xxx\Release\xxx.exeCTestThd::Test+13D:\xxx\TestThd.cppline36VariablesLocal:Local:this,RegisterRelative,Address:015EFF00,NoType0x00401458[.text]:0x00000458D:\xxx\Release\xxx.exeCTestThd::InitInstance+FD:\xxx\TestThd.cppline30VariablesLocal:this,RegisterRelative,Address:015EFF10,NoType可以看到,這里直接給出了出錯的文件行信息;第三,寄存器信息,在CallStack上方,如下:Registers:EAXEBXECXEDX00000000000000C4003454B8FFFFFFFF檔,歡迎下載ESIEDI003454B80012FE74CS:EIP0000001B:00401477SS:ESP00000023:015EFF00EBP00000023DS00000023ES00000023FS00000038GS00000000Flags00010206由此可以看出許多程序執(zhí)行的內(nèi)容,如EAX為上一個動作的執(zhí)行返回結(jié)果等。另外,這里面還會記錄當(dāng)前所有線程的信息,能夠通過這

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論