我从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)。在该函数内部从未触及过struct成员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。

最佳答案

由于您无法发布完整的代码,因此我们无法详细解释。但是,您的主张“ tid-> rvm [changes]值从未被触及”是自相矛盾的。您可以说的是,调试的线程不会通过结构指针tid->rvm更改结构成员tid

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


tid和/或rlog指针指向错误的位置
i的当前值在数组rlog->entries的范围之外
表达式num - 1在数组rlog->entries[i].sizes的范围之外


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

07-24 09:46
查看更多