如果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
所以它看起来像两个单元还没有被编译使用相同的选项。
答
(从注释移动)
如果不同转换单元在两个堆栈帧,是可能的是,可执行来自一个拙劣的汇编,其中两个TU的见的mrb_state
/RClass
了不同的定义。这通常发生在改变struct
/class
的定义时,但并非所有使用它的模块都得到重新编译。在这种情况下,这很可能是由于gdb在一个堆栈帧中谈到RClass *
而在另一个堆栈帧中谈到struct RClass *
- 这可能暗示它正在讨论不同类型。
您可以快速检查,如果这是由两个堆栈帧执行
p &(((mrb_state *)0)->eStandardError_class)
的情况下 - 如果抵消该成员的不同,它的证实,这两个课时都有一个不同的想法是什么mrb_state
是。
输入新框架后,某些东西正在破坏该地址中的数据。使用数据断点来发现什么。 – StoryTeller
@StoryTeller问题不在于数值已经改变,问题在于gdb给了我一个依赖于栈的值来取消引用相同的指针。 –
通过选择,我认为你实际上是指'select-frame',这意味着变量被分配在第3帧中,并且在第4帧中不再存在。 –