先貼最后崩潰的地方的代碼:
InterfaceManage* InterfaceManage::Instance()
{
static InterfaceManage ins;
return &ins;
}
程式運行中會出現小概率的崩潰,昨天終于通過dmp檔案拿到呼叫堆疊資訊,但是百思不得其解,在C++11里面這個懶漢模式的單利應該是執行緒安全的啊,為什么會崩潰呢?例外資訊如下:
0xC0000005: 讀取位置 0x0000023F0D0D0D11 時發生訪問沖突。
uj5u.com熱心網友回復:
你這個沒加鎖,是執行緒安全嗎?假設執行緒1先進入函式,ins物件初始化還沒完成的時候,執行緒2也進入函式對ins進行初始化,這豈不是沖突了嗎?
uj5u.com熱心網友回復:
C++11的編譯器會保證這個靜態變數的執行緒安全性的吧
uj5u.com熱心網友回復:
而且我可以肯定的是,崩潰的時候這個物件早已構造出來了,因為我程式在啟動運行的時候就會調到這兒,中途業務執行的程序中會無數次使用這個介面,但是程式在運行很長一段時間后,在這兒crash了。
uj5u.com熱心網友回復:
不保證,但是只要啟動的時候是單執行緒初始化就沒有問題
uj5u.com熱心網友回復:
你的錯誤是空指標,找找代碼里面那些地方沒有判斷nullptruj5u.com熱心網友回復:
你的錯誤是空指標,找找代碼里面那些地方沒有判斷nullptr
0xC0000005: 讀取位置 0x0000023F0D0D0D11 時發生訪問沖突。 ----這個地址不為空啊,為什么是空指標呢?
uj5u.com熱心網友回復:
你這個沒加鎖,是執行緒安全嗎?
假設執行緒1先進入函式,ins物件初始化還沒完成的時候,執行緒2也進入函式對ins進行初始化,這豈不是沖突了嗎?
以下是dmp檔案的概要資訊:
行程架構: x64
例外代碼: 0xC0000005
例外資訊: 該執行緒嘗試讀寫某個虛擬地址,而它對該地址不具有相應的訪問權限。
uj5u.com熱心網友回復:
應該不是這里的問題,靜態資料運行期間是在固定的記憶體區。可能這段記憶體區被沖掉了,訪問InterfaceManage里的函式時就會出錯。uj5u.com熱心網友回復:
應該不是這里的問題,靜態資料運行期間是在固定的記憶體區。可能這段記憶體區被沖掉了,訪問InterfaceManage里的函式時就會出錯。
我們程式在之前編譯release版本的時候由于設定問題鏈接的log4cpp庫是debug版本的,但是打包發布時放的log4cpp的庫又是release版本的,是否會造成類似的問題呢?
uj5u.com熱心網友回復:
dll,lib的debug和release最好匹配uj5u.com熱心網友回復:
debug版本和release主要區別是debug版本增加了很多除錯代碼。如果debug版本沒問題,release版本有問題,很可能的原因是debug版本的記憶體分布不一樣,記憶體被沖掉的區域不一樣。仔細看看源代碼,是否有陣列溢位等問題。
uj5u.com熱心網友回復:
debug版本和release主要區別是debug版本增加了很多除錯代碼。如果debug版本沒問題,release版本有問題,很可能的原因是debug版本的記憶體分布不一樣,記憶體被沖掉的區域不一樣。
仔細看看源代碼,是否有陣列溢位等問題。
記憶體越界問題我查了好長一段時間了,查了幾遍,沒發現有這種情況。
uj5u.com熱心網友回復:
也許記憶體越界的不是ins本身,或許有其他的靜態變數記憶體越界修改了ins的資訊。另外,ins被多執行緒使用,它的成員什么的有沒有可能也會讀寫沖突?
uj5u.com熱心網友回復:
程式運行很長一段時間后出的問題,看看是否記憶體泄漏了。運行程序中,輸出一下可分配動態記憶體的大小。uj5u.com熱心網友回復:
是不是程式退出時候的崩潰?uj5u.com熱心網友回復:
是不是程式退出時候的崩潰?
不是
uj5u.com熱心網友回復:
程式運行很長一段時間后出的問題,看看是否記憶體泄漏了。運行程序中,輸出一下可分配動態記憶體的大小。
不是記憶體泄漏,這個問題排查過了
uj5u.com熱心網友回復:
估計是記憶體使用相關的問題, 查查相關的代碼1.看看代碼中有陣列定義的地方,定義的長度可能不夠,業務資料超出預期時,會造成記憶體問題。
2.有無未分配記憶體的野指標
。。。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/103082.html
標籤:C++ 語言
上一篇:可以把一個實數賦給整型變數嗎
