VS 2005使用map檔案查詢程式崩潰原因

2021-07-25 00:11:25 字數 2791 閱讀 9126



一般程式崩潰可以通過debug,找到程式在那一行**崩潰了,最近編乙個多執行緒的程式,都不知道在那發生錯誤,多執行緒併發,又不好單行除錯,終於找到乙個比較好的方法來找原因,通過生成map檔案,由於2005取消map檔案生成行號資訊(vc6.0下是可以生成行號資訊的,不知道microsoft怎麼想的,在2005上取消了),只能定位在那個函式發生崩潰。這裡可以通過生成cod檔案,即機器碼這一檔案,具體定位在那一行崩潰。 

首先配置vc2005生成map檔案和cod檔案: 

(1).map檔案:property->configuration properties->linker->debugging 中的generate map file選擇yes(/map); 

(2).cod檔案:property->configuration properties->c/c++->output files中assembler output中選擇assembly,maching code and source(/facs),生成機器,源**。 

上面所說的 property 是「專案」選單下的 property,而非「工具」選單下的 property。**者注) 

簡單例子:

c++** 

#include "stdafx.h"   

voiderrorfun(int* p)   

int_tmain(intargc, _tchar* argv)     

在errorfun中函式中,*p=1這一行出錯,由於p沒有申請空間,執行時出錯,彈出 

unhandled exception at 0x004113b1 in testerror.exe: 0xc0000005: access violation writing location 0x00000000. 

在0x004113b1程式發生崩潰。 

具體步驟:

(1)debug檔案下開啟map檔案,定位崩潰函式. 

address       publics by value       rva+base    lib:object 

0000:00000000    ___safe_se_handler_count   00000000    

0000:00000000    ___safe_se_handler_table   00000000    

0000:00000000    ___imagebase         00400000    

0001:00000000    __enc$textbss$begin      00401000     

0001:00010000    __enc$textbss$end       00411000     

0002:00000390    ?errorfun@@yaxpah@z    00411390 f    testerror.obj 

0002:000003d0    _wmain            004113d0 f    testerror.obj 

0002:00000430    __rtc_initbase        00411430 f   msvcrtd:init.obj 

0002:00000470    __rtc_shutdown        00411470 f   msvcrtd:init.obj 

0002:00000490    __rtc_checkesp        00411490 f   msvcrtd:stack.obj 

0002:000004c0    @_rtc_checkstackvars@8    004114c0 f   msvcrtd:stack.obj 

0002:00000540    @_rtc_allocahelper@12     00411540 f    msvcrtd:stack.obj 

.... 

程式崩潰位址0x004113b1,我們找到第乙個比這個位址大的004113d0,前乙個是00411390,位址是函式的開始位址,所以發生的崩潰的的函式是errorfun,這個函式的初始位址00411390. 

(2)找出具體崩潰行號. 

由(2)可知,發生錯誤函式是errorfun,在testerror.obj,開啟testerror.cod檔案,找到errorfun函式生成的機器碼. 

?errorfun@@yaxpah@z proc    ; errorfun, comdat 

; 7    :  

00027 5f   pop  edi 

00028 5e   pop  esi 

00029 5b   pop  ebx 

0002a 8b e5   mov  esp, ebp 

0002c 5d   pop  ebp 

0002d c3   ret  0 

(說明: 7,8,9是表示在源**的行號。 

00000 55   push  ebp,000000是相對偏移地地,55是機器碼號,push ebp,000000是彙編碼。) 

通過(2)我們計算相對偏移位址,即崩潰位址-函式起始位址,0x004113b1-0x00411390=0x21(16進製制的計數)。找到0x21這一行對應的機器碼是 00021 c7 00 01 00 00,向上看它是由第8行*p=1;生成的彙編碼,由此可見是這一行程式發生崩潰。 

結束語:當然這只是乙個簡單的例子,實際上一執行便知道是這一行出錯,但是對於乙個比較大的工程,特別是在多執行緒併發情況下,要找出那一行出錯比較困難,便可以使用map和cod檔案找到程式崩潰原因。

VS 2005使用map檔案查詢程式崩潰原因

原文 一般程式崩潰可以通過debug,找到程式在那一行 崩潰了,最近編乙個多執行緒的程式,都不知道在那發生錯誤,多執行緒併發,又不好單行除錯,終於找到乙個比較好的方法來找原因,通過生成map檔案,由於2005取消map檔案生成行號資訊 vc6.0下是可以生成行號資訊的,不知道microsoft怎麼想...

vs2005新增include lib檔案目錄

vs2005新增include lib檔案目錄 1.新增編譯所需要的 lib 檔案 解決方案資源管理器 專案 屬性 配置屬性 聯結器 輸入 附加依賴項 裡填寫 winsock.lib 多個 lib 以空格隔開。等同於 pragma comment lib,winsock.lib 語句 2.新增庫 l...

VS2005使用點滴積累

改變ie設定使vs能除錯js ie瀏覽器 工具 網際網路選項 高階 瀏覽 停用指令碼除錯 vs2005新建c 的http的網站專案 啟動vs2005 檔案 新增 綱站 asp.net綱站 在點選 確定 按鈕前 請選擇 位置 檔案系統,http,ftp中的http 語言 visual basic,vi...