在c++程序開發過程中,會經常遇到程序崩潰的情況,此時如果說程序代碼行數較少的情況下,可直接通過調試代碼來確定錯誤位置,但是如果說是公司項目,代碼行數肯定少不了,此時通過單步跟蹤的方法來查找bug的話,就有點困難了。
此時可藉助c++提供的生成dump文件的方法來確定程序的錯誤位置。
首先是要包含生成dump的類,這裏就如何添加代碼生成dump文件做一些介紹:
首先就是先把生成dump的類包含到當前項目下,我用的是BRExceptionFilter類(下載地址:http://download.csdn.net/download/github_37567324/9985776),
1.將BRExceptionFilter.h頭文件包含進項目的入口文件中;
2.在程序的最開始處直接調用BRWinMainCRTStartup()即可;
3.此時在程序任意位置寫一個給空指針賦值,編譯並執行,就會生成一個***.dump文件;
4.將生成的dump文件放在Release/Debug路徑下,具體看你使用什麼方式編譯的,就放到對應的目錄下;
5.雙擊生成的dump文件,默認會用你編寫代碼的IDE打開,如果找不到打開方式,那麼指定用你的IDE打開即可;
6.打開以後直接啓動調試,就可定位到出錯的代碼行;
int main(int argc, char **argv)
{
BRWinMainCRTStartup();
CTime now;
now = CTime::GetCurrentTime();
CString strTime = now.Format("%Y-%m-%d %H:%M:%S");
CheckFactorEx2(strTime, 1);
cout << strTime << endl;
system("pause");
return 0;
}
上面的代碼就是在程序的入口處添加了BRWinMainCRTStartup()方法,接着我在CheckFactorEx2方法裏面做一個空指針賦值的操作
char *str = NULL;
strcpy(str, "sa");
編譯執行;
結果程序出現異常結束,此時在Debug路徑下多了一個文件如下圖:
這個Sleep.exe_(null)_31367511.dmp文件就是程序奔潰以後生成的文件,此時只要雙擊打開該dump文件,並且啓動調試以後,就能精確定位到出錯的代碼行,如下圖:
如上圖是打開dump文件以後;
如上圖,就是定位到了我設置的空指針賦值的地方,這就是出錯的位置;
注意:有時候dump文件可能定位到彙編文件中去,如些圖所示:
此時打開調用堆棧,依次向外跟,就能夠找到出錯的地方了;