2011-07-26 46 views
2

在我們的應用程序中,我們觀察執行後的崩潰。堆棧跟蹤顯示崩潰是由於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行定義了互斥變量。

我們將不勝感激在這個問題上的任何幫助

感謝,

薩迪普

+1

請發佈一個展示您的問題的最小,自包含的示例。如果真的不可能,那麼至少應該發佈一些包含問題部分的相關代碼。 –

+1

您可能想要提供您正在使用的確切編譯器/工具版本(看起來像某種版本的'g ++'),以及您用來構建可執行文件的命令行。 –

+0

我編輯了我的帖子並添加了一些相關的代碼,我希望這可以幫助 –

回答

0

有你已經證明我們的代碼沒有問題。

也許問題是與類A

0

您的變量是否使用帶有起始下劃線的名稱?

如果是這種情況,那麼發現問題是正常的。

帶有初始下劃線的全局名稱是保留的,不應使用。也可以在任何上下文中使用首字母下劃線後跟大寫字母的名稱,或者使用多個連續下劃線的名稱。

這是一個規則的原因,我真的不明白往往是由許多程序員只是爲了做它的樂趣破...

+0

感謝您的答覆, 變量名不以下劃線開始..... –

0

移動代碼,像你這樣會重新排序和建設銷燬A相對於同一翻譯單位中的其他全局詞。如果您之前創建了A,它將在稍後被刪除。 (LIFO原則)。其他物體現在可以依靠A。檢查以前創建的對象是之前的A,現在在A之後。

+0

感謝您的回覆, 全球存在於這個翻譯單元中唯一的對象是MutexClass OBJ –

2

檢查您的其他文件。您可能在命名空間abc中有另一個名爲obj的全局變量。更改爲未命名的命名空間與C中的靜態具有相同的效果,這可以避免名稱衝突(如果這很可能,那麼與abc不同的任何其他命名空間也將停止該問題)。這種錯誤通常會導致鏈接錯誤,但有時會發生奇怪的事情。

請注意,其他文件不會使用的全局變量應該位於未命名的名稱空間中,以避免名稱衝突。

+0

我檢查了所有的文件和相同名稱不存在。我甚至將obj重命名爲一個奇怪的名字,以便它不會與其他名稱衝突,但我仍然遇到同樣的崩潰。 –