在VC中如何找到崩溃的源头(二)
生活随笔
收集整理的這篇文章主要介紹了
在VC中如何找到崩溃的源头(二)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
通過“crash地址 + MAP文件”來定位出錯代碼位置雖然需要經過比較復雜的地址計算,但卻是最簡單實現的方式。如果僅僅想通過崩潰地址定位出錯的函數,就更加方便了。我在網上找到一個解析MAP文件的小工具,可以非常清晰的列出每個函數的地址,并且可以將分析表格導出為Excel文件。工具下載地址:http://e.ys168.com/?tinyfun,工具目錄下VCMapper.exe。
? ? 另外上篇主要參考兩篇文章:
? ? http://www.vckbase.com/document/viewdoc/?id=908
? ? http://www.vckbase.com/document/viewdoc/?id=1473
?
? ? 方案二:崩潰地址 + MAP文件 + COD文件
? ? 由于VC8以后的版本都不再支持MAP文件中產生代碼行信息,因此我們尋找另一種定位方式:COD文件。
? ? 1、COD文件
? ? COD文件是一個包含了匯編碼、二進制機器碼和源代碼對應信息的文件,每一個cpp都對應一個COD文件。通過這個文件,我們可以非常方便地進行定位。
? ? 在VC6中生成COD文件的設置方式為:Project Settings -> C/C++,在 Category 中選 Listing Files,在 Listing file type 組合框中選 Assembly,Machine code,and source。在VC8中生成COD文件的設置方式為:Project Properties -> C/C++ -> Output Files -> Assembler Output 項,選擇 Assembly,Machine code,and Source(/Facs)。
? ?
? ? 2、定位崩潰行
? ? 下面通過舉例進行說明。現在我有一個基于對話框的MFC應用程序CrashTest,在CCrashTestDlg::OnInitDialog函數中寫入導致crash的代碼語句(第99行),源文件如下:
? ? 總結一下定位步驟:
? ? 1) 根據公式 崩潰語句在函數中偏移地址 = 崩潰地址 - 崩潰函數地址 計算出偏移量X;
? ? 2) 根據公式 崩潰語句在COD文件中地址 = 崩潰函數在COD文件中地址 + X 計算出地址Y。其中崩潰函數在COD文件中地址為COD文件中函數起始括號“{”后面表明的地址,一般情況下為0x0000;
? ? 3) 根據Y在COD文件中找到對應代碼行。
? ?
? ? ok,方案二介紹完了。這種方法最大的好處是沒有VC開發環境版本限制,而且COD文件里面包含的信息更加豐富,不但可以幫助我們定位crash,還能幫我們分析很多東西。當然,這也導致編譯生成了很多信息文件。
? ? 另外上篇主要參考兩篇文章:
? ? http://www.vckbase.com/document/viewdoc/?id=908
? ? http://www.vckbase.com/document/viewdoc/?id=1473
?
? ? 方案二:崩潰地址 + MAP文件 + COD文件
? ? 由于VC8以后的版本都不再支持MAP文件中產生代碼行信息,因此我們尋找另一種定位方式:COD文件。
? ? 1、COD文件
? ? COD文件是一個包含了匯編碼、二進制機器碼和源代碼對應信息的文件,每一個cpp都對應一個COD文件。通過這個文件,我們可以非常方便地進行定位。
? ? 在VC6中生成COD文件的設置方式為:Project Settings -> C/C++,在 Category 中選 Listing Files,在 Listing file type 組合框中選 Assembly,Machine code,and source。在VC8中生成COD文件的設置方式為:Project Properties -> C/C++ -> Output Files -> Assembler Output 項,選擇 Assembly,Machine code,and Source(/Facs)。
? ?
? ? 2、定位崩潰行
? ? 下面通過舉例進行說明。現在我有一個基于對話框的MFC應用程序CrashTest,在CCrashTestDlg::OnInitDialog函數中寫入導致crash的代碼語句(第99行),源文件如下:
? ??
? ??
? ??
? ? 總結一下定位步驟:
? ? 1) 根據公式 崩潰語句在函數中偏移地址 = 崩潰地址 - 崩潰函數地址 計算出偏移量X;
? ? 2) 根據公式 崩潰語句在COD文件中地址 = 崩潰函數在COD文件中地址 + X 計算出地址Y。其中崩潰函數在COD文件中地址為COD文件中函數起始括號“{”后面表明的地址,一般情況下為0x0000;
? ? 3) 根據Y在COD文件中找到對應代碼行。
? ?
? ? ok,方案二介紹完了。這種方法最大的好處是沒有VC開發環境版本限制,而且COD文件里面包含的信息更加豐富,不但可以幫助我們定位crash,還能幫我們分析很多東西。當然,這也導致編譯生成了很多信息文件。
總結
以上是生活随笔為你收集整理的在VC中如何找到崩溃的源头(二)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 在VC中如何找到崩溃的源头
- 下一篇: 详细解析Raid0、Raid0+1、Ra