日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

在VC中如何找到崩溃的源头(二)

發布時間:2024/4/11 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 在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行),源文件如下:

? ??


? ? 根據崩潰地址(0x004012A3)以及MAP文件(定位片段圖片如下),定位crash函數為OnInitDialog;并且我們可以很容易地計算出崩潰地址相對于崩潰函數的偏移量為 0x004012A3 - 0x004011E0 = 0xC3。

? ??


? ? 再來看看CrashTestDlg.cod文件,我們根據文件中源碼信息找到OnInitDialog函數信息片段:

? ??


? ? 可以看到圖片中第一行為OnInitDialog函數匯編代碼的起始行;找到“int * p = NULL;”這一句源碼,其前面的98表示這行代碼在源文件中的行號,下面的000c1表示相對于函數開始位置的偏移量,后面的“33 c0”為機器碼,“xor eax,eax”為匯編碼。那么我們根據前面算出來的偏移量0xC3,找到對應出錯的語句為99行:“*p = 5;”。
? ? 總結一下定位步驟:
? ? 1) 根據公式 崩潰語句在函數中偏移地址 = 崩潰地址 - 崩潰函數地址 計算出偏移量X;
? ? 2) 根據公式 崩潰語句在COD文件中地址 = 崩潰函數在COD文件中地址 + X 計算出地址Y。其中崩潰函數在COD文件中地址為COD文件中函數起始括號“{”后面表明的地址,一般情況下為0x0000;
? ? 3) 根據Y在COD文件中找到對應代碼行。
? ?
? ? ok,方案二介紹完了。這種方法最大的好處是沒有VC開發環境版本限制,而且COD文件里面包含的信息更加豐富,不但可以幫助我們定位crash,還能幫我們分析很多東西。當然,這也導致編譯生成了很多信息文件。

總結

以上是生活随笔為你收集整理的在VC中如何找到崩溃的源头(二)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。