在我們的應用程序中,我們觀察執行後的崩潰。堆棧跟蹤顯示崩潰是由於cpp文件中存在全局變量。生成的valgrind報告顯示無效的空閒/讀/寫錯誤,這意味着它試圖刪除不再有效的內存。在__tcf_0中崩潰
文件:crash.cpp
namespace abc
{
MutexClass obj; //A is a class
// remaining code
ChildClass::ChildClass():Parent(obj){}
}
然後我們放置在給定的變量中一位不願透露姓名的命名空間,我們不再得到碰撞,並且Valgrind的不報告無效的讀/寫/錯誤:
文件:nocrash.cpp
namespace
{
MutexClass obj;
}
namespace abc
{
// remaining code
ChildClass::ChildClass():Parent(obj){}
}
上面的例子s是導致問題的類的簡化版本。
我們不確定爲什麼將變量放在未命名的名稱空間中可以消除此問題。它是否會改變清理順序?我們嘗試編寫簡單的代碼,但我們觀察到的清理順序對於這兩種情況都是相同的。
互斥對象作爲參數傳遞給基類構造函數。 Mutex對象的唯一目的是在基類構造函數中使用。代碼中的其他任何地方都不使用Mutex對象。
墜機的Valgrind的報告
=================================== ==============
線程1:
大小的無效讀出的1
在0x3A24C08260:pthread_mutex_destroy(在/lib64/libpthread-2.5.so )
通過0x5ABE3DD:osl_destroyMutex(libuno_sal.so.3)
通過0xECD69D1:OSL ::互斥::〜互斥()(mutex.hxx:65)
通過0xEF207F5:__tcf_0(Dispose.cpp: 27)
通過0x3A24033354:出口(在/lib64/libc-2.5.so)
由0x3A2401D97A:(下面主要)(以/lib64/libc-2.5.so)
地址0xeb6bb88在大小爲40的塊中,16個字節是free'd
在0x4A05B3E:免費(vg_replace_malloc.c:323)
通過0x3A24033354:出口(在/lib64/libc-2.5.so)
由0x3A2401D97A:(下面主要)(在/ lib64下/在libc-2.5。所以)
大小4
在0x3A24C08272的無效的寫:pthread_mutex_destroy(在/lib64/libpthread-2.5.so)
通過0x5ABE3DD:osl_destroyMutex(在libuno_sal.so.3)
通過0xECD69D1:OSL ::互斥::〜互斥()(mutex.hxx:65)
通過0xEF207F5:__tcf_0(Dispose.cpp:27)
通過0x3A24033354:出口(在/lib64/libc-2.5.so)
由0x3A2401D97A:(下面主要)(以/lib64/libc-2.5.so)
地址0xeb6bb88是16個字節通過0x3A2401D97A出口(在/lib64/libc-2.5.so)
:免費(vg_replace_malloc.c::323)
通過0x3A24033354在0x4A05B3E大小40 free'd
的塊內: (在main下面)(在/ lib64/lib中c-2.5.so)
無效免費()/刪除/刪除[]
在0x4A05B3E:免費(vg_replace_malloc.c:323)
通過0xECD69D1:OSL ::互斥:: 〜互斥()(mutex.hxx:65)
通過0xEF207F5:__tcf_0(Dispose.cpp:27)
通過0x3A24033354:出口(在/lib64/libc-2.5.so)
由0x3A2401D97A:(下面主要)(以/lib64/libc-2.5.so)
地址0xeb6bb78是在0x4A05B3E大小40 free'd
的塊內的0字節:免費(vg_replace_malloc。 C:323)
通過0x3A24033354:出口(在/lib64/libc-2.5.so)
由0x3A2401D97A:(下面主要)(以/lib64/libc-2.5.so)
= ================================================
Dispose.cpp:27行定義了互斥變量。
我們將不勝感激在這個問題上的任何幫助
感謝,
薩迪普
請發佈一個展示您的問題的最小,自包含的示例。如果真的不可能,那麼至少應該發佈一些包含問題部分的相關代碼。 –
您可能想要提供您正在使用的確切編譯器/工具版本(看起來像某種版本的'g ++'),以及您用來構建可執行文件的命令行。 –
我編輯了我的帖子並添加了一些相關的代碼,我希望這可以幫助 –