在寫**的時候,經常碰到由於記憶體訪問出錯而導致程式崩潰。當**量比較多的時候,根本不知道程式錯在**,只能不斷猜測**出錯的地方,將其注釋掉還會不會出現程式崩潰,這種方法雖然最後也能找到問題所在,但是會耗費大量時間。
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。
之前程式執行出錯時,會產生乙個***.exe.stackdump的檔案,這個肯定是和記憶體出錯有關,本想研究這個檔案,但是一直沒頭緒。後來借助eclipse除錯,程式跑飛後會停下來,我本以為是隨便停在**的某個地方,其實不是的,就是停在訪問的非法記憶體變數上。
比如我定義了乙個沒有初始化的指標:
u8 *alivetypenum;
然後使用該變數後就會導致記憶體訪問越界而使程式跑飛,在eclipse裡除錯就會像斷點一樣停在第一次使用alivetypenum的地方
有了這個功能以後再也不用費心思除錯記憶體出錯引起的程式崩潰問題了。
C語言 除錯
1 格式化輸出函式printf d s a,str 格式化控制符之間不能有 逗號 可以用空格 1.1格式化輸入函式scanf d t 格式化控制符之間不能有空格 2.1 指標 運用指標雖然效率高,但在指標運算時一定要謹慎指標的越界 上界和下界 例如p i 1或者p i 1 i i 必要時要進行邊界值...
C 記憶體洩漏的除錯
一 在程式 中加入 標頭檔案和巨集定義 define crtdbg map alloc include define new new normal block,file line 注意 include 語句的順序。如果更改此順序,所使用的函式可能無法正確工作。在析構函式最後一行呼叫 crtdumpm...
C語言記憶體
返回viod 型別的指標,同時為未初始化的記憶體空間。需要顯式的進行型別轉換,以及分配失敗處理,初始化 int p null 型別轉換 p int malloc sizeof int 分配失敗處理 if p null else 初始化處理 memset p,0,sizeof int 初始化處理 me...