我从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改变价值而不会被触及。据我所知,0x64是键盘状态寄存器的中断向量表条目的地址。任何帮助表示赞赏。
编辑:
这是一些请求的更新。 i的值为0,num的值为1,rlog的值为0x607b30。 rlog-> entries [0]是一个条目,用于更改名为“testseg”,大小为10000字节,updatesize为300字节,numupdates为1的数据段,以及指向偏移量,大小和数据数组的指针。 rlog-> entries [0] .sizes [0]为100.数据指针为0x6051f0。
答案 0 :(得分:0)
由于您无法发布完整的代码,我们无法详细解释。但是,你的断言是" tid-> rvm [改变]值而不会被触及"是自相矛盾的。您可以说结构成员tid->rvm
未通过结构指针tid
更改,被正在调试的线程。
假设结构不在共享内存中并且进程是单线程的,唯一可能的结论是tid->rvm
由rlog->entries[i].sizes[num - 1]
完全或部分别名。也就是说,第二表达的左侧所指的存储器与第一表达的左侧重叠。有几种方法可能发生,其中包括:
tid
和/或rlog
指针指向错误的地方i
的当前值超出了数组rlog->entries
num - 1
超出了数组rlog->entries[i].sizes
这些绝不是唯一的可能性,但它们是那些可以从有限数量的代码中猜到的最可能的那些。
答案 1 :(得分:0)
感谢您的帮助。瓦尔格林德帮忙。事实证明我没有初始化rlog-> entries元素中的一些指针,所以当我稍后写信给它们时,它会溢出到先前分配给tid-> rvm的地址并覆盖它。仍然不确定为什么无效指针被重定向到键盘状态寄存器。