2010-03-31 72 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