2011-08-30 45 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