2011-08-30 83 views
10

我看過this線程。我的情況稍有不同,我正在努力弄清楚"this"指針是如何被損壞的。「this」指針在堆棧跟蹤中被損壞

我使用的Qt 4.6.2框架,使用他們的QTreeView與我自己的模型。我得到的回溯(86幀長,遞歸很多,這就是爲什麼我沒有粘貼整個東西,它在這個pastebin只涉及到他們的代碼。

它終於在QBasicAtomicInt中的某些彙編器上segfaults: DEREF,但很明顯,它已經死了進一步下跌,證明這三個框架:

#15 0x01420fd3 in QFrame::event (this=0x942bba0, e=0xbf8eb624) at widgets/qframe.cpp:557 
#16 0x014bb382 in QAbstractScrollArea::viewportEvent (this=0x4, e=0x93f9240) at widgets/qabstractscrollarea.cpp:1036 
#17 0x0156fbd7 in QAbstractItemView::viewportEvent (this=0x942bba0, event=0xbf8eb624) at itemviews/qabstractitemview.cpp:1610 

在幀17,this0x942bb0在幀16,this應該是相同的,如幀17它調用其祖先執行相同的方法,但this變爲0x4。

有趣的是,在第15幀中(同樣,第16幀已經稱它的祖先實現了相同的功能),'this'指針被恢復到0x942bba0

如果您查看完整回溯的pastebin,則可能會看到一些「優化值」。我有應用程序編譯優化;我現在已經將gcc設置爲-g3 -O0,所以當下次發生這種情況時我可能會有更多的東西。但是,當然現在我不能讓它崩潰 - 這是一個相當困難的錯誤發生(但對於修復非常重要),所以我不認爲這太可疑。

鑑於優化,是thispointer=0x4異常或絕對錯?奇怪的是,這些viewportEvent框架中沒有真正的代碼 - 它們只是在事件類型上進行切換,它通過switch語句進行切換,並返回其祖先的實現。

Valgrind似乎沒有拋出任何問題,儘管我還沒有讓它在Valgrind中崩潰。

有沒有人見過這種行爲?什麼可能導致它?

+1

+1,很久以前我看到了與我的代碼相同的問題;我不知道我是如何修復它的;但讓我想起了舊時光。:) – iammilind

+0

當你編譯代碼時是否有任何警告?先修復它們。 –

+0

@iammilind:這是使這個問題成爲最受歡迎的問題的原因(通過點擊明星),但不是用於投票。 –

回答

8

在調試優化構建之前,我已經看到過這樣的事情,它從來沒有表明真正的bug對我來說是什麼。

首先想到一個局部變量比較容易。在未經優化的版本中,所有內容都在指定位置,並且必須在每行代碼後存儲。這是調試器可以找到它的。在經過優化的版本中,值可以存儲在寄存器中而不會寫入內存。這是優化構建的改進性能的主要部分。調試器不理解這一點,並會一直看內存,所以你會經常看到錯誤的值。

參數也會發生同樣的情況。如果優化器決定在寄存器中傳遞參數,那麼調試器仍然會查看堆棧幀。更具體地說,在參數將根據調用約定的規則的位置。

堆棧的下一幀值已正確恢復的事實表明生成的指令正確處理了此參數,但調試器只是不知道在哪裏查找它。

+0

另一個變化就是,即使參數在堆棧上傳遞,優化器也可以在使用參數位置完成其他事情時重新調整內存位置。所以回溯中的這個指針= 0x4可能是一個紅色鯡魚 - 特別是如果這個指針參數在較低編號的幀中正確顯示。 –

+0

感謝您的迴應。我現在已經禁用了優化,並一直在努力嘗試讓它再次崩潰 - 這是在樹視圖上進行拖放時發生的,特別是當您釋放手指壓力時觸摸屏發送有趣位置時,尤其如此容易自動化!首先難以重現。希望未優化的核心轉儲將顯示一些更有用的結果。有趣。所以理論上我可以弄清楚,如果我檢查了Coredump中的彙編程序並查看了寄存器,那麼這應該是什麼,但這可能不會有幫助。 – xwhatsit