Я видел эту тему. Мой случай немного отличается, и я изо всех сил пытаюсь понять, как повреждается указатель "this"
.
Я использую фреймворк Qt 4.6.2, используя их QTreeView
со своей собственной моделью. Я получаю обратную трассировку (длиной 86 кадров, с большим количеством рекурсий, поэтому я не вставил все это целиком, оно находится в этом pastebin включает только их код.
В конце концов он segfaults на каком-то ассемблере в QBasicAtomicInt::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 this
это 0x942bb0
. В кадре 16 this
должно быть таким же, как и в кадре 17, он вызывает реализацию того же метода своего предка. Однако this
становится 0x4.
Интересно, что в кадре 15 (опять же, кадр 16 вызвал реализацию той же функции в его предке) указатель this восстанавливается до 0x942bba0
.
Если вы посмотрите на pastebin полного обратного следа, вы можете увидеть некоторое «оптимизированное значение». У меня было приложение, скомпилированное с включенной оптимизацией; Теперь у меня gcc установлен на -g3 -O0
, поэтому, когда это произойдет в следующий раз, у меня может быть что-то большее. Но, конечно, теперь я не могу заставить его падать — это довольно сложная ошибка (но, тем не менее, очень важная для исправления), поэтому я не думаю, что это слишком подозрительно.
Учитывая оптимизацию, это this
pointer=0x4
необычно или определенно неправильно? Странно то, что ни в одном из этих фреймов viewportEvent нет реального кода — они просто переключают тип события, оно проходит через оператор switch и возвращает реализацию своего предка.
Valgrind, кажется, не вызывает никаких проблем, хотя я еще не заставил его падать в Valgrind.
Кто-нибудь видел такое поведение раньше? Что может быть причиной этого?
this pointer=0x4
определенно неправильно. Вы никогда не получите материал на первой странице. Что вам сейчас нужно, так это воспроизводимый тестовый пример или, по крайней мере, дамп ядра. - person J-16 SDiZ   schedule 30.08.2011-fno-strict-aliasing
, если это включено в сборках, которые показывают проблему. - person Michael Burr   schedule 30.08.2011