Перейти к содержанию
    

Undefined instruction, Data Abort, SWI - помогите локализовать проблему!

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

 

На втором месте по частоте стоит выход за границы массива. Чтоб не лазить по программе - меняем местоположение массива или добавляем массив большого размера вслед за тестируемым. Ну, либо что тоже самое - увеличиваем размер исследуемого массива.

И смотрим результат.

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Это точно так-же очевидно по содержимому CPSR, он ведь не Exception Mode показывает, а вполне себе System Mode не правда-ли :)?

CPSR проглядел когда смотрел. Таки да, показывает Sys.

Правда тогда такой вывод для DAbt тоже не совсем понятный. Для DABT - SYS LR - неактуален, там нужен Abort LR т.к именно он указывает точное место где произошел краш. Только не говорите, что оно у Вас само собой так и есть и это ясно из распечатки :)

(то что там PC нарисован я вижу, только мне было бы намного понятней если бы его там не было, а вместо него был Abort LR)

 

Смотрю по мар-файлу, неск Мб от последней переменной до начала стека

ОК.

 

Структуры объявлены, но обращаюсь к полям стандартным образом, без особых хитростей...

Стуктуры могут быть с массивами в конце.

Например:

 

{
    U8 Id;
    U8 Type;
    ...
    U32 Payload[ 64 ];
}

 

И в каком-нибудь обработчике может делаться совсем без хитростей:

 

U32 *p = pCmd->Payload;

*p++ = xxx;
*p++ = xxx;
...
*p++ = xxx;

 

Без проверки на размер.

 

 

malloc/calloc не использую, вроде не должно...

А партишины? Хоть какой-то намек на динамическую память в программе есть? Если используется сетевой стек неповерю, что нет динамического пула пакетов ;>

 

Можете подробнее, что имеется в виду? Кроме обращения по указателю который равен 0.

Имеется в виду что некоторые поля структур не проинициализированы до того как начинают использоваться.

Например, есть тип пакета:

 

typedef struct tagPACKET
{
     struct tagPACKET *pNext;
     ....
} TPACKET, *PPACKET;

 

 

Скажем вы создали пакет, а pNext не проинициализировали в NULL, и там будет какой-то мусор.

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

 

Ситуация слабоповторяемая, то сбоит, то не сбоит. То есть запускаю определенную функцию в программе, может на 3-й раз посыпаться, может на 10-й... Плата - отладка Атмеловская. Могут на такой плате быть проблемы из-за плохой разводки? Или это больше относится к своим платам?

Могут быть на любой плате (made in USA еще не гарантирует что с железом все ОК).

И даже если в железом все ОК, могут возникнуть проблемы из-за настроек SDRAM контроллера, несовместимых с реально впаянными чипами памяти в конкртеной ситуации.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Правда тогда такой вывод для DAbt тоже не совсем понятный. Для DABT - SYS LR - неактуален, там нужен Abort LR т.к именно он указывает точное место где произошел краш.

Точное место указывает PC (вычисляется из Abort LR, ибо несколько отличаются). Посему распечатка самого Abort LR, совсем без надобности, в отличии от Sys LR (прерванного режима), который есть хвостик для раскрутки того, как докатились до этого.

Только не говорите, что оно у Вас само собой так и есть и это ясно из распечатки :)

Именно так и скажу, ибо много разных "идей" можно высказать, только начните, пожалуйста с мысли, что эта распечатка делалась для реальной работы по локализации, а не как набор цифирек :).

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Именно так и скажу, ибо много разных "идей" можно высказать, только начните, пожалуйста с мысли, что эта распечатка делалась для реальной работы по локализации, а не как набор цифирек :).

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Удобно.

Абсолютно бесполезно. Зачем мне знать регисты обработчика Abort - это четкая и однозначная точка входа. Состояние его собственного банка регистров будет соответствовать тому, что осталось после предыдущего вылета в этот обработчик или мусору при первом входе. Что "удобно"?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Что "удобно"?

Может быть я уже так привык, - мне удобно смотреть первым делом на Abort LR.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

смотреть первым делом на Abort LR.

Для этого есть PC - он уже получен из Abort LR в соответствии с видом аборта. Вот это действительно удобно.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

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

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...