2011-08-30 21 views
10

this iş parçacığı gördüm. Benim durumum biraz farklı ve ben "this" işaretçisinin nasıl bozulduğunu anlamaya çalışıyorum."Bu" işaretçi yığın izinde bozuk hale geliyor

Qt 4.6.2 çerçevesini kullanarak, kendi modelimle QTreeView ürününü kullanıyorum. Ben de her şeyi yapıştırmadıysanız neden özyineleme bir sürü alıyorum backtrace (86 kare uzunluğunda, bu pastebin sadece kendi kodunu içerir içinde bu, bu. Sonunda QBasicAtomicInt bazı assembler üzerinde çalışma sırasında parçalama arızası

:: DEREF ama bu üç kare ile, daha da aşağı öldü kanıtladığı olduğu açıktır. çerçevede 17 yılında

#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 

, this0x942bb0 olan çerçeve 16 yılında this çerçeve 17'de o aradığını gibi aynı olmalıdır onun Atasının aynı yöntemin uygulanması.Ancak this, 0x4 olur.

İlginç bir şekilde, 15 numaralı karede (yine, 16 numaralı çerçeve, atalarının aynı işlevi yerine getirmesini gerektirdi), 'bu' işaretçisi 0x942bba0 olarak geri yüklendi.

Tam backtrace'in pastebinine bakarsanız, 'value optimized out' değerini görebilirsiniz. Optimizasyon ile derlenmiş uygulama vardı; Şimdi gcc -g3 -O0'a ayarlıyorum, böylece bir dahaki sefere daha fazla bir şeyim olabilir. Ama tabi ki şimdi çökmesini sağlayamıyorum - gerçekleşmesi oldukça zor bir hatadır (yine de düzeltmek çok önemlidir) bu yüzden çok şüpheli olduğunu düşünmüyorum.

Optimizasyonlar göz önüne alındığında, bu thispointer=0x4 olağandışı mı yoksa kesinlikle yanlış mı? Garip olan şey, bu viewportEvent çerçevelerinin hiçbirinde gerçek bir kod bulunmamasıdır - yalnızca olayın türünde bir anahtar yapar, anahtar deyiminden geçer ve atalarının uygulamasını döndürür. Valgrind'de henüz çökmemesine rağmen, Valgrind herhangi bir sorun yaratıyor gibi görünmüyor.

Bu davranışı daha önce gören oldu mu? Buna neden olabilir?

+1

+1, uzun geri Kodumla aynı sorunu görmüştüm; Nasıl tamir ettiğimi bilmiyorum; ama bana eski zamanları hatırlatıyor.:) – iammilind

+0

Kodu derlerken herhangi bir uyarı var mı? Önce onları düzelt. –

+0

@iammilind: Bu, favori bir soruyu (yıldızın üzerine tıklayarak) yapmak için bir neden, ancak onu oylamada değil. –

cevap

8

Optimize edilmiş yapı hatalarını ayıklamadan önce bu tür bir şeyi daha önce görmüştüm ve gerçek hatanın benim için ne olduğunun bir göstergesi olmadı.

İlk önce yerel bir değişken hakkında düşünmek daha kolaydır. Optimize edilmemiş bir yapıda her şey hafızada belirlenmiş bir yere sahiptir ve her kod satırından sonra saklanmalıdır. Bu, hata ayıklayıcıyı bulabilir. Optimize edilmiş bir yapıda, değerler belleğe yazılmadan kayıtlarda yaşayabilir. Bu, optimize edilmiş bir yapının geliştirilmiş performansının önemli bir parçasıdır. Hata ayıklayıcı bunu anlamıyor ve her zaman belleğe bakacak, böylece sık sık yanlış değeri göreceksiniz.

Aynı şey parametrelerle de olabilir. Optimizer bir parametreyi bir kayıtta geçirmeye karar verirse, hata ayıklayıcı hala yığın çerçevesine bakacaktır. Daha spesifik olarak, parametrenin arama kuralı kurallarına göre olacağı yerde.

Yığının bir sonraki karesinin düzgün bir şekilde geri yüklendiği gerçeği, oluşturulan yönergelerin bu parametreyle doğru bir şekilde çalıştığını, ancak hata ayıklayıcının yalnızca nereye bakacağını bilmediğini gösterir.

+0

Bunun üzerinde bir başka değişiklik de, parametre yığında geçirilse bile, en iyileştirici parametre için konum kullanılarak tamamlandıktan sonra başka bir şey için bellek konumunu yeniden konumlandırabilir. Bu yüzden, backtrace'de bu işaretçi = 0x4'ün kırmızı bir ringa balığı olması olasıdır; özellikle de 'this' pointer parametresi daha düşük numaralı karelerde doğru şekilde gösteriliyorsa. –

+0

Yanıt verenler için teşekkürler. Optimizasyonum şimdi devre dışı bırakıldı ve tekrar çökmeyi zorlaştırmaya çalışmakla uğraşıyor - özellikle bir parmak izini serbest bıraktığınızda dokunmatik ekran komik konumlar gönderiyorken, bir treeview üzerinde sürükle-bırak işlemi sırasında oluyor. otomatikleştirmek için kolay! İlk etapta çoğaltmak zor. Umarım, optimize edilmemiş bir gübreyi daha faydalı bazı sonuçlar gösterecektir. İlginç. Teoride kuramcıya çöpçüyü incelediğimde ve kayıt defterine baktığımda 'bu' nın ne olması gerektiğine karar verdim, ama bu muhtemelen işe yaramayacaktır. – xwhatsit