如果a具有相同的值,a-> b如何取决于选定的堆栈帧?

问题描述:

在使用gdb调试分段错误,我得到了这个非常奇怪的现象:如果a具有相同的值,a-> b如何取决于选定的堆栈帧?

(gdb) select 4 
(gdb) p mrb 
$3 = (mrb_state *) 0x555555dcc000 
(gdb) p mrb->eStandardError_class 
$4 = (RClass *) 0x0 
(gdb) select 3 
(gdb) p mrb 
$6 = (mrb_state *) 0x555555dcc000 
(gdb) p mrb->eStandardError_class 
$7 = (struct RClass *) 0x555556015190 

我不明白,因为在这两种情况下对内存,0x555555dcc000同一个地方mrb变量点,但在一个案例mrb->eStandardError_class为空,而在另一个案例中,它具有有意义的价值。

这怎么可能?这是一个gdb错误?一个编译器错误?或者这是不正常的? mrb->eStandardError_class可能是一个堆栈帧中的寄存器,另一个是内存值?

为了更清楚:我没有运行p mrb->eStandardError_class两次调用之间的任何代码。所以我不希望这个价值发生变化。它如何取决于框架?

编辑以下利玛窦意大利的建议,我有:

(gdb) p &(((mrb_state *)0)->eStandardError_class) 
$8 = (struct RClass **) 0x170 
(gdb) select 4 
(gdb) p &(((mrb_state *)0)->eStandardError_class) 
$9 = (RClass **) 0x160 

所以它看起来像两个单元还没有被编译使用相同的选项。

+0

输入新框架后,某些东西正在破坏该地址中的数据。使用数据断点来发现什么。 – StoryTeller

+0

@StoryTeller问题不在于数值已经改变,问题在于gdb给了我一个依赖于栈的值来取消引用相同的指针。 –

+0

通过选择,我认为你实际上是指'select-frame',这意味着变量被分配在第3帧中,并且在第4帧中不再存在。 –

(从注释移动)

如果不同转换单元在两个堆栈帧,是可能的是,可执行来自一个拙劣的汇编,其中两个TU的见的mrb_state/RClass了不同的定义。这通常发生在改变struct/class的定义时,但并非所有使用它的模块都得到重新编译。在这种情况下,这很可能是由于gdb在一个堆栈帧中谈到RClass *而在另一个堆栈帧中谈到struct RClass * - 这可能暗示它正在讨论不同类型。

您可以快速检查,如果这是由两个堆栈帧执行

p &(((mrb_state *)0)->eStandardError_class) 

的情况下 - 如果抵消该成员的不同,它的证实,这两个课时都有一个不同的想法是什么mrb_state是。