1. 程式人生 > >C語言除錯記憶體訪問出錯而引起的程式崩潰問題

C語言除錯記憶體訪問出錯而引起的程式崩潰問題

在寫程式碼的時候,經常碰到由於記憶體訪問出錯而導致程式崩潰。當代碼量比較多的時候,根本不知道程式錯在哪裡,只能不斷猜測程式碼出錯的地方,將其註釋掉還會不會出現程式崩潰,這種方法雖然最後也能找到問題所在,但是會耗費大量時間。

linux下除錯通常會生成core dump檔案,再結合gdb除錯來定位問題,這種方法我沒有研究過,我一般在win下的msys2環境下開發,無意中發現了一種非常有效的除錯方法,我覺得很有必要分享一下。

我安裝的msys2版本是msys2-i686-20180531,在msys2下用pacman安裝的gcc和gdb版本分別是msys/gcc 7.3.0-1和msys/gdb 7.11.1-1,雖然名字中看不出來,但這個版本其實就是cygwin gcc而不是mingw gcc。

之前程式執行出錯時,會產生一個xxx.exe.stackdump的檔案,這個肯定是和記憶體出錯有關,本想研究這個檔案,但是一直沒頭緒。後來藉助eclipse除錯,程式跑飛後會停下來,我本以為是隨便停在程式碼的某個地方,其實不是的,就是停在訪問的非法記憶體變數上。

比如我定義了一個沒有初始化的指標:
u8 *aLiveTypeNum;
然後使用該變數後就會導致記憶體訪問越界而使程式跑飛,在eclipse裡除錯就會像斷點一樣停在第一次使用aLiveTypeNum的地方
在這裡插入圖片描述

有了這個功能以後再也不用費心思除錯記憶體出錯引起的程式崩潰問題了。