2015-04-14 3 views
0

Я получаю следующий выход из 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.

+0

вы должны по крайней мере предоставить следующее (изнутри gdb): значение i, значение num, адрес rlog-> entries [i] .sizes [num-1], адрес tid. Это может дать вам несколько намеков на то, что происходит. – mfro

+0

"* Значение указателя при изменении структуры без переопределения *" это сильно пахнет повреждением памяти. Я предлагаю вам запустить программу, используя контролер памяти, такой как Valgrind (http://valgrind.org/). – alk

+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

Это далеко не единственные возможности, но они являются наиболее вероятными среди тех, кто на которых можно угадать из ограниченного количества представленного кода.

+0

Это однопоточный дочерний процесс, раздвоенный из родителя, который ждет его завершения до возобновления выполнения. –

0

Спасибо за помощь. valgrind помог. Оказывается, я не инициализировал некоторые указатели в элементах rlog-> entries, поэтому, когда я написал им позже, он пролился на ранее выделенные адреса tid-> rvm и перезаписал его. Все еще не уверен, почему недействительный указатель перенаправляется в регистр состояния клавиатуры.

Смежные вопросы