Что может привести к тому, что в счетчике программ будет неправильный адрес? - PullRequest
2 голосов
/ 19 сентября 2011

Я получаю исключение "Неверный адрес счетчика программы" в Vxworks + PPC 603.

Приложение ссылается на несколько библиотек 'C'.Не могу определить, в чем причина этой проблемы?

Существует ли вероятность, что причиной этого могут быть неправильные параметры компиляции?

Любые указания или указатели будут полезны.

Спасибо

ОБНОВЛЕНИЕ:

У меня есть структура, члены которой являются указателями на функции.Сама структура является статической, и ее адрес передается, и через структуру вызываются различные функции.

Во время одного из тестовых циклов я обнаружил, что в указателе функции значение адреса функции уменьшается на 1. Если адрес функции 0x009a3730, ПК имеет 0x00913729.

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

Ответы [ 3 ]

2 голосов
/ 19 сентября 2011

Любой случай, когда вы работаете с указателями на функции, может легко привести к этому, если значение указателя будет повреждено и будет вызвано позднее.Проверьте обработчики сигналов, если таковые имеются, и любые другие API, которые имеют дело с обратными вызовами.

0 голосов
/ 10 октября 2011

@ All, спасибо за ваши предложения.

Оказалось, что местоположение, содержащее адрес, неправильно указывало на ссылочный элемент другой структуры, и этот ссылочный элемент уменьшался на единицу при каждом вызовеосвободить эту структуру.

Память для этой структуры должна была быть выделена вызовом одной из наших функций.Но вместо этого было оставлено упоминание некоторой garbade памяти без какой-либо инициализации или выделения памяти, и в итоге она обратилась к этой статической памяти, где хранится глобальная структура.Это привело к повреждению статической структуры, что в свою очередь привело к сбою.

Тщательный построчный анализ наших журналов помог собрать все части вместе.

0 голосов
/ 20 сентября 2011

"Если адрес функции 0x009a3730, ПК имеет 0x00913729". Разница здесь не 1 :) Однако ПК всегда будет указывать на адрес следующей инструкции, которую он должен выполнить AFAIK.

Возможно, вы можете запустить дамп ядра в отладчике и распечатать:

  1. Обратный след
  2. код «дизассемблирования» в районе сбоя
  3. информация регистров -> значения регистров во время сбоя
  4. info locals -> локальные переменные функции, внутри которой произошел сбой
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...