Что может привести к тому, что счетчик программ будет иметь неверный адрес?

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

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

Есть ли вероятность, что это может быть вызвано неправильными параметрами компиляции?

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

Спасибо

ОБНОВИТЬ:

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

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

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


person Jay    schedule 19.09.2011    source источник
comment
Вы выполняете какие-либо вызовы функций через указатели функций?   -  person Oliver Charlesworth    schedule 19.09.2011
comment
Вероятно, ваш стек искажен, и вы вставляете неверный адрес в ПК по возвращении из функции.   -  person Paul R    schedule 19.09.2011
comment
@Oli Charlesworth, да, я выполняю большинство вызовов функций только с помощью указателей функций.   -  person Jay    schedule 19.09.2011
comment
Получаете ли вы какие-либо предупреждения компилятора, связанные с использованием вами указателей на функции?   -  person Paul R    schedule 19.09.2011
comment
Может быть, вы выходите за границы массива и перезаписываете эти значения?   -  person Shahbaz    schedule 21.09.2011


Ответы (3)


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

person unwind    schedule 19.09.2011
comment
Я работаю со структурой, члены которой являются указателями на функции. Сама структура является статической, и адрес статической структуры передается. Но я не понимаю, как решить эту проблему, основываясь на вашем ответе. Не могли бы вы уточнить? Спасибо за ваш ответ. - person Jay; 19.09.2011
comment
@Jay: По сути, вам нужно будет отладить приложение, чтобы выяснить, где был поврежден указатель функции. Вы можете размещать точки наблюдения на указателе функции в вашей структуре static и наблюдать, где он модифицируется. - person Oliver Charlesworth; 19.09.2011

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

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

  1. Обратный след
  2. «разобрать» код вокруг области сбоя
  3. информационные регистры -> значения регистров на момент сбоя
  4. info locals --> локальные переменные функции, внутри которой произошел сбой
person Anoop Menon    schedule 20.09.2011

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

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

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

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

person Jay    schedule 10.10.2011