Я получаю следующий выход из GDB:Указатель Значения в Struct Изменения Без Переназначения
(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
Это код структуры три раза в день:
struct _trans_t {
rvm_t rvm;
int numsegs;
segment_t* segments;
};
rvm_t РВМ является структурой, содержащей метаданные для восстанавливаемого пейджера виртуальной памяти.
Я не верю, что мне разрешено публиковать полный функциональный код, где это происходит, потому что это университетское задание, но вы можете видеть единственную строку кода, где это изменение происходит, rlog->entries[i].sizes[num - 1] = size;
. Нет ссылки на значение, которое изменяется. Я также должен использовать эти уродливые указатели для структурирования. Сервер представления назначения содержит файл заголовка as-is, и я не могу его редактировать.
Мой вопрос в том, что черт может вызвать это. 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 байт, обновление 300 байтов, numupdates 1 и указатели на массивы смещений, размеров и данных. rlog-> entries [0] .sizes [0] равно 100. Указатель данных равен 0x6051f0.
вы должны по крайней мере предоставить следующее (изнутри gdb): значение i, значение num, адрес rlog-> entries [i] .sizes [num-1], адрес tid. Это может дать вам несколько намеков на то, что происходит. – mfro
"* Значение указателя при изменении структуры без переопределения *" это сильно пахнет повреждением памяти. Я предлагаю вам запустить программу, используя контролер памяти, такой как Valgrind (http://valgrind.org/). – alk
См. Мой ответ, алк. Спасибо за совет. –