2010-03-31 73 views
4

我檢查覈心轉儲,並注意到,在一幀中的「這個」指針比在下一幀(在同一個線程)不同。不只是有點不同,它從0x8167428到0x200。「this」指針變化回溯

我不是很熟練使用GDB,但這看起來並不正確。這是否有問題,如果有的話,可能是什麼原因?

+0

你能否在你的問題中添加一些代碼來重現這一點? – 2010-03-31 22:50:33

+0

不幸的是,這個問題每三天發生一次。另外,我一直無法將它指定到特定的代碼段(GDB表示它在發佈信號時發生,沒有在該行中引用指針)。 – Hans 2010-03-31 23:34:53

回答

3

不便的this指針可以在GDB跟蹤幀之間改變,如果在下一幀中的函數被調用一個不同的對象(即使對象是相同的類型),因爲這是針對特定的實例。這大概是不是你的問題。

0x200對於this不是有效值,並且幾乎肯定表示某種類型的內存損壞。 this指針有時存儲在堆棧中,並作爲不可見的第一個參數傳遞給函數。所以,如果你損壞了堆棧(通過跳出寫入另一個變量的界限),你可能會看到這個指針被破壞了。

0x200本身很有趣。因爲它是如此接近0,但實際上沒有0,則表明你看實例可能是另一種對象或數組,位於從對象/數組開始0x200字節的一部分,該對象/數組地址實際上是NULL。看着你的代碼,你應該很容易找出哪個對象被設置爲NULL,這導致它報告0x200

+0

所以,0x200是十進制的512。這是否意味着我必須搜索512字節大小的對象? – Hans 2010-03-31 23:21:40

+0

不完全。你正在尋找一個至少包含512個字節的對象,因爲這個對象的起始位置是偏移量512。它也可以是一個數組...如果「this」本身是128字節,那麼它就是這些對象數組的第4個索引(第5個元素)。或者它可能是兩者的一些組合。但某個地方是空的。 – SoapBox 2010-04-01 00:27:51

+1

這個答案結果足夠接近。有一個緩衝區靠近這個'this'指針改變了的那個被清零的類。 – Hans 2010-04-01 20:48:23

1

代碼中的優化可能會讓調試器混淆。調試零售代碼時,這是一個常見問題。嘗試禁用優化,重新運行該方案並查看是否遇到同樣的問題。

+0

對不起,在該代碼的區域沒有優化。 – Hans 2010-03-31 23:20:54

+0

@Hans,我的意思是編譯器優化,而不是用戶。你是否嘗試禁用所有編譯器優化? – JaredPar 2010-03-31 23:50:00

+0

對不起,這也是我的意思。還有其他共享對象,使用-O2 – Hans 2010-04-01 15:40:40

0

this指針是幀的本地。

是其他幀屬於「C」功能,你可以看到像在0x200

+0

進行編譯。這兩個框架用於同一類的功能。 – Hans 2010-03-31 23:26:15