今天在測試公司的一組api時發生了記憶體訪問錯誤(aix5.1 64位機器,32位系統)。這組api在編譯成32位的程式時測試是正確的,可是編譯成64位程式時問題就出現了:用malloc分配記憶體成功,但當用memset訪問這片記憶體時程式core了。我猜想是api某個地方的bug導致了記憶體洩漏,於是一行一行原始碼地翻查(上萬行**,我的神啊),始終沒查出個所以然來。這個時候,除了google,我還能幹什麼呢?
google...google...google...
然後,答案出現了,加上標頭檔案stdlib.h,一切搞定,至於原因嘛,沒google出來。
總結:我平時寫程式,stdio.h,string.h,stdlib.h這三個標頭檔案我是必加的,這次犯渾了(雖然api其實不是我寫的);google是偉大的,baidu是渺小的。後記
這個問題的原因已經找到,其實不是memset出了問題,而是memset之前的malloc出了問題,具體原因如下:
malloc在stdlib.h中的原型為:
void *malloc (size_t size);
如果沒有包含標頭檔案,函式沒有宣告就直接使用,那麼c語言預設函式的返回值是int型,即如果沒有包含標頭檔案,那麼malloc函式的原型為:
int malloc(size_t size);
如果編譯成64位的應用程式,那麼sizeof(int) = 4並且sizeof(void *) = 8, 比如malloc本來返回的位址為0xffffffffffff1111, 由於沒有函式宣告,系統預設malloc返回的型別為int,將上面的位址高32位擷取後就得到0xffff11111,即對malloc返回值的任何操 作都是在位址0xffff11111上做的。如果0xffff1111這個位址不可寫,那麼就會導致coredump的情況。
如果編譯成32位的應用程式,那麼sizeof(int) = sizeof(void*) = 4,所以不會出現coredump問題。
解決方法:
在程式中,新增stdlib.h標頭檔案
感謝這位仁兄:http://blog.csdn.net/stevenunp/archive/2009/06/10/4257247.aspx
AIX 訪問Linux NFS共享錯誤案例
aix 訪問linux nfs共享錯誤案例 系統環境 作業系統 redhat el4 aix 5.3 錯誤現象 linux 作為nfsserver aix host 作為nfs client root aix211 mount backup mount giving up on bksrv back...
堆記憶體訪問錯誤
崩潰到ntdll.dll的問題 比較典型的無效指標 非法記憶體訪問 建議先解決符號問題,google或者參考 軟體除錯 中關於符號檔案的部分.關閉 height 600 src sda topicdaleft.htm?v201305241723 frameborder 0 width 120 scr...
AIX 安裝 RAC 錯誤集錦 5 之 VIP錯誤
aix 安裝 rac 錯誤集錦 5 之 vip錯誤 環境 作業系統 aix 5.3.8 集群軟體 crs 10.2.0.1 資料庫 oracle 10.2.0.1 錯誤現象 錯誤現象 ora.aix211.vip 啟動失敗 其中乙個節點vip 啟動失敗 日誌 u01 crs 1 log aix211...