2011-06-13 90 views
4

我有很多的麻煩在C調試分割故障的XCode ++項目4矮人錯誤:無法找到DIE

我只得到一個段錯誤,當我用「LLVM 2.0」編譯器選項和使用內置-O3優化。據我瞭解,有一個時使用的優​​化有限的調試選項,但這裏是調試輸出我拿到後,我在Xcode中運行使用gdb開啓:

warning: Got an error handling event: "Dwarf Error: Cannot find DIE at 0x3be2 referenced from DIE at 0x11d [in module /Users/imran/Library/Developer/Xcode/DerivedData/cgo-hczcifktgscxjigfphieegbpxxsq/Build/Products/Debug/cgo]". 
No memory available to program now: unsafe to call malloc 

我不能讓gdb來給我之後的任何有用的信息(如跟蹤),但我不知道我真的知道如何正確使用它。當我嘗試使用「LLDB」調試器時Xcode剛剛崩潰(自從我開始使用它以來,這已經是一個常見的主題)。

我的程序是確定性的,但是當我嘗試用print語句隔離問題時,行爲會發生改變。例如,如果我在一點處添加cout << "hello";,則段錯誤消失。其他打印語句會導致我的程序在其主循環的不同迭代中發生段錯誤。當然,當我輸入足夠的打印語句來查明有問題的代碼時,段錯誤似乎發生在一行之後但在下一行之前(即無處)。

我正在使用指針和動態內存分配,這可能是問題的原因,但由於我無法縮小導致錯誤的代碼塊,因此我不知道要在此處顯示哪些代碼。

我嘗試使用樂器中的「泄漏」工具進行分析,但沒有發現任何泄漏。

有什麼建議嗎?我對調試很缺乏經驗,所以任何事情都會有所幫助。

編輯:解決。考慮到某些輸入,我的程序會嘗試讀取數組的末尾。

回答

2

我不認爲有足夠的信息可以幫助您解決DWARF問題。我對這個工具鏈不夠熟悉,不知道它有多強大。

然而,您的崩潰症狀聞起來很像堆腐敗。我不知道默認情況下OSX使用了什​​麼分配器,但通用優化將元數據與對象內聯存儲在一起,和/或通過空對象將freelist線程化,這使得它們對堆中的緩衝區溢出非常敏感。釋放對象兩次或使用懸掛指針(已釋放但其空間現在可被另一個分配使用的指針)也會導致看起來不確定且難以跟蹤的錯誤,因爲堆的佈局可能會在運行。打印語句也使用分配器,這意味着更改打印語句可以改變問題出現的時間和地點。

您可能會發現有助於確定這是堆問題還是不相關的工具是由我的顧問(http://prisms.cs.umass.edu/emery/index.php?page=download-diehard)稱爲DieHard的堆替換。我相信它將建立在OSX之上,並且您可以使用LD_PRELOAD=/path/to/libdiehard.so將其鏈接到您的程序,以在運行時替換默認的分配器。它的唯一目的是抵制內存錯誤和堆損壞,所以如果你的應用程序真的與它一起運行,那可能就是你需要查看的地方。

+0

感謝您的信息和鏈接到DieHard。我不認爲我有兩次釋放任何東西,但有很多地方我可以有一個晃來晃去的指針。我會嘗試更仔細地尋找這種類型的錯誤。 – Imran 2011-06-13 01:33:40