c – “这个”指针在堆栈跟踪中被破坏

我看过 this线程.我的情况略有不同,我正在努力弄清楚“这个”指针是否被破坏.

我使用Qt 4.6.2框架,使用自己的QTreeView模型.我得到的回溯(86帧长,有很多递归,这就是为什么我没有粘贴整个事情,在这pastebin只涉及他们的代码.

它最终在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中,这是0x942bb0.在框架16中,这应该是相同的,在框架17中,它调用其祖先实现相同的方法.但是这变成0x4.

有趣的是,在框架15(再次,框架16已经称其祖先执行相同的功能),’this’指针恢复为0x942bba0.

如果您查看完整回溯的贴图,您可能会看到一些“优化的值”.我已经通过优化编译了应用程序;我现在有gcc设置为-g3 -O0,所以当下次发生时,我可能会有更多的东西.但是,当然现在我不能让它崩溃 – 这是一个相当困难的错误发生(但是非常重要的修复),所以我不认为这太可疑了.

给定的优化是,这个指针= 0x4不寻常或绝对错误?奇怪的是,在任何这些viewportEvent框架中没有真正的代码 – 它们只是对事件类型进行切换,它通过switch语句进行切换,并返回其祖先的实现.

Valgrind似乎并没有抛出任何问题,尽管我还没有在Valgrind中崩溃.

有没有人看过这个行为?可能是什么原因造成的?

解决方法

调试优化版本之前,我已经看到过这样的事情,从来没有指出真正的错误对我来说是什么.

首先考虑一个局部变量是比较容易的.在非优化版本中,所有内容都具有指定的位置,并且必须在每行代码之后存储.这是调试器可以找到它.在优化的版本中,值可以存储在寄存器中,而不会写入内存.这是优化版本的改进性能的主要部分.调试器不理解这一点,并且将始终关注内存,所以你经常会看到错误的值.

参数也可能发生.如果优化器决定在寄存器中传递一个参数,那么调试器仍然要看堆栈帧.更具体地,在参数将根据调用约定的规则的位置.

堆栈的下一帧的值正确恢复的事实表明生成的指令正确处理此参数,但调试器不知道在哪里查找.

相关文章

本程序的编译和运行环境如下(如果有运行方面的问题欢迎在评...
水了一学期的院选修,万万没想到期末考试还有比较硬核的编程...
补充一下,先前文章末尾给出的下载链接的完整代码含有部分C&...
思路如标题所说采用模N取余法,难点是这个除法过程如何实现。...
本篇博客有更新!!!更新后效果图如下: 文章末尾的完整代码...
刚开始学习模块化程序设计时,估计大家都被形参和实参搞迷糊...