一般程式崩潰可以通過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...