首页 文章

结构变化中的指针值无需重新分配

提问于
浏览
0

我从gdb获得以下输出:

(gdb) print tid->rvm
$28 = (rvm_t) 0x605010
(gdb) step
306     rlog->entries[i].sizes[num - 1] = size;
(gdb) step
307 }
(gdb) print tid->rvm
$29 = (rvm_t) 0x64
(gdb) print tid
$30 = (trans_t) 0x607b50

这是tid结构的代码:

struct _trans_t {
    rvm_t rvm;          
    int numsegs;       
    segment_t* segments;
};

rvm_t rvm是一个包含可恢复虚拟内存寻呼机元数据的结构 .

我不相信我可以在这里发布完整的功能代码,因为这是一项大学任务,但你可以看到发生这种变化的单行代码, rlog->entries[i].sizes[num - 1] = size; . 没有引用变更的值 . 我还必须使用这个丑陋的typedefing指针来构造东西 . 作业提交服务器按原样包含头文件,我无法编辑它 .

我的问题是什么导致这种情况 . tid作为参数传递给函数 rvm_about_to_modify(trans_t tid, void *segbase, int offset, int size) . 结构成员rvm永远不会触及此函数,你可以看到步骤序列,它的地址为0x605010,这是正确的地址,后面是一行,没有任何对tid结构或其rvm成员的引用,指针发生变化地址0x64 . 实际的tid指针没有改变 . 它始终保持地址0x607b50 .

我在这里完全不知所措,无法弄清楚什么会导致tid-> rvm在没有被触及的情况下改变 Value . 据我所知,0x64是键盘状态寄存器的中断向量表条目的地址 . 任何帮助表示赞赏 .

编辑:

这是一些要求的更新 . i的值为0,num的值为1,rlog的值为0x607b30 . rlog-> entries [0]是一个条目,用于更改名为“testseg”,大小为10000字节,updatesize为300字节,numupdates为1的数据段,以及指向偏移量,大小和数据数组的指针 . rlog-> entries [0] .sizes [0]为100.数据指针为0x6051f0 .

2 回答

  • 0

    由于您无法发布完整的代码,我们无法详细解释 . 但是,你断言"tid->rvm [changes] value without ever being touched"是自相矛盾的 . 你可以说是被调试的线程通过结构指针 tid 改变了结构成员 tid->rvm .

    假设结构不存在于共享内存中并且该进程是单线程的,唯一可能的结论是 tid->rvmrlog->entries[i].sizes[num - 1] 完全或部分别名 . 也就是说,第二表达的左侧所指的存储器与第一表达式的左侧重叠 . 有几种方法可能发生,其中包括:

    • tid 和/或 rlog 指针指向错误的位置

    • i 的当前值超出了数组 rlog->entries 的范围

    • 表达式 num - 1 超出了数组 rlog->entries[i].sizes 的范围

    这些绝不是唯一的可能性,但它们是那些可以从提供的有限数量的代码中猜到的最可能的 .

  • 0

    谢谢您的帮助 . 瓦尔格林德帮忙 . 事实证明我没有初始化rlog-> entries元素中的一些指针,所以当我稍后写入它们时,它会溢出到之前分配给tid-> rvm的地址并覆盖它 . 仍然不确定为什么无效指针被重定向到键盘状态寄存器 .

相关问题