VS2005(vs2008,vs2010)使用map檔案查詢程式崩潰原因
一般程式崩潰可以通過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。(轉者注)
簡單例子:
首先配置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"
void errorFun(int * p)
{ *p=1; }
int _tmain(int argc, _TCHAR* argv[])
{
int * p=NULL;
errorFun(p);
return 0;
}
在errorFun中函式中,*p=1這一行出錯,由於p沒有申請空間,執行時出錯,彈出
Unhandled exception at 0x004113b1 in testError.exe: 0xC0000005: Access violation writing location 0x00000000.
在0x004113b1程式發生崩潰。
具體步驟:
(1)debug檔案下開啟map檔案,定位崩潰函式.
map檔案開頭是一些連結資訊,然後我們要找函式和實始地址資訊。地址是函始的開始地址
Address Publics by Value Rva+Base Lib:Object
0000:00000000 ___safe_se_handler_count 00000000 <absolute>
0000:00000000 ___safe_se_handler_table 00000000 <absolute>
0000:00000000 ___ImageBase 00400000 <linker-defined>
0001:00000000 __enc$textbss$begin 00401000 <linker-defined>
0001:00010000 __enc$textbss$end 00411000 <linker-defined>
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 : {
00000 55 push ebp
00001 8b ec mov ebp, esp
00003 81 ec c0 00 00
00 sub esp, 192 ; 000000c0H
00009 53 push ebx
0000a 56 push esi
0000b 57 push edi
0000c 8d bd 40 ff ff
ff lea edi, DWORD PTR [ebp-192]
00012 b9 30 00 00 00 mov ecx, 48 ; 00000030H
00017 b8 cc cc cc cc mov eax, -858993460 ; ccccccccH
0001c f3 ab rep stosd
; 8 : *p=1;
0001e 8b 45 08 mov eax, DWORD PTR _p$[ebp]
00021 c7 00 01 00 00
00 mov DWORD PTR [eax], 1
; 9 : }
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檔案找到程式崩潰原因。
相關文章
- vs2010除錯崩潰 reflector除錯
- app 崩潰的原因APP
- vue專案--瀏覽器出現卡頓及崩潰的原因查詢與解決方案Vue瀏覽器
- 使用 google_breakpad 分析 Electron 崩潰日誌檔案Go
- Qt程式繼承QApplication發生崩潰的原因QT繼承APP
- Linux中程式崩潰及重啟的原因詳解!Linux
- win10查詢崩潰日誌方法 win10怎麼檢視崩潰日誌Win10
- iOS應用崩潰了,如何透過崩潰手機連線電腦查詢日誌方法iOS應用崩潰
- Kdump 檢查 Linux 核心崩潰!Linux
- 檔案查詢
- 檔案批次查詢複製匯出,按檔名批次查詢檔案,按檔案內容批次查詢檔案
- 伺服器站點崩潰的原因有哪些伺服器
- Linux 檔案查詢Linux
- 檔案查詢命令
- SOLIDWORKS培訓教程 | SW崩潰後如何恢復檔案?Solid
- 在檔案上使用 SQL 查詢的示例SQL
- SSH三大框架使用谷歌瀏覽器上傳檔案瀏覽器崩潰框架谷歌瀏覽器
- 伺服器停機或者崩潰的原因有哪些伺服器
- 圖形化還原崩潰地址 iOS的crash檔案分析iOS
- vs2005無法附加到程式 系統找不到檔案
- WWDC 2018:理解崩潰以及崩潰日誌
- Linux查詢大檔案Linux
- gorm 使用map實現in 條件查詢用法GoORM
- 查詢計算大檔案的桌面程式工具
- linux 查詢檔案命令 findLinux
- 查詢檔案位置路徑
- 檔案系統(七):檔案系統崩潰一致性、方法、原理與侷限
- 使用 strace 查詢 Emacs 啟動阻塞的原因Mac
- 如何使用find和xargs查詢和處理檔案
- 使用 GDB 從崩潰中檢查 Objective C 類(HandleDelegateSource 錯誤訪問)Object
- 快速解決崩潰服務上傳原生符號檔案失敗符號
- Android 收集程式崩潰異常資訊Android
- win10系統崩潰藍屏什麼原因 win10系統出現崩潰藍屏如何修復Win10
- 崩潰日記
- APP防崩潰APP
- python檔案查詢之find命令Python
- java-遞迴(檔案查詢)Java遞迴
- Linux檔案查詢工具的探索Linux