реклама на сайте
подробности

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> Prefetch abort, туплю
SpiritDance
сообщение Jun 1 2009, 07:24
Сообщение #1


Дух погибшего транзистора
****

Группа: Свой
Сообщений: 877
Регистрация: 6-09-05
Из: Москва
Пользователь №: 8 288



Непонятно поведение программы.
Через некоторое время работы (коннект по CSD и прогон данных туда/сюда) процессор вылетает в префетч, При этом в LR бешеный адрес начинающийся на 0xD8.

Вопрос. Я правильно понимаю что каким-то образом портится стек? Как это можно проверить и собственно как его можно попортить? Все указатели прна копирование информации при этом остаются целехонькими соответственно вроде не они.

Подскажите способ каким образом можно отловить момент ошибки а то я что-то не очень понимаю как это побороть?


--------------------
Yes, there are two paths you can go by But in the long run Theres still time to change the road youre on.
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Jun 1 2009, 07:41
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(SpiritDance @ Jun 1 2009, 11:24) *
Подскажите способ каким образом можно отловить момент ошибки а то я что-то не очень понимаю как это побороть?

Для начала, крепко подумать, откуда на стеке может взяться "бешеный адрес начинающийся на 0xD8", иногда по числу удается понять, откуда оно пришло.

Еще можно порекомендовать посмотреть содержимое LR того режима, из которого влетели в аборт.
Go to the top of the page
 
+Quote Post
IgorMarx
сообщение Jun 1 2009, 16:50
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 61
Регистрация: 5-10-05
Из: Зеленоград
Пользователь №: 9 268



А нескромный вопрос мона? Какая среда программирования? Какой язык программирования? Тут не боги заседают.

Если это IAR, то нужно сделать следующее:

1. в опциях линкера включить генерацию map файла;
2. посмотреть в этом файле, где лежит сегмент CSTACK;
3. Аккуратно протопать отладчиком, заходя в процедуры и наблюдая за стек пойнтером. Как только SP станет меньше, чем начало сегмента CSTACK, улыбайтесь .
Кстати, отладчик может предупреждать о переполнении стека. Нужно смотреть в окне отладочных сообщений.
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Jun 1 2009, 18:23
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(IgorMarx @ Jun 1 2009, 20:50) *
А нескромный вопрос мона? Какая среда программирования? Какой язык программирования? Тут не боги заседают.

Среда и язык программирования к проблеме и методам ее локализации не имеют ну ни малейшего отношения, уж поверьте.

Цитата(IgorMarx @ Jun 1 2009, 20:50) *
3. Аккуратно протопать отладчиком...

Да-да, отладчиком. Падает оно во время "коннекта по CSD", что несколько ограничивает использование этого инструмента, не находите?
Go to the top of the page
 
+Quote Post
xelax
сообщение Jun 2 2009, 06:02
Сообщение #5


Местный
***

Группа: Свой
Сообщений: 370
Регистрация: 7-11-06
Пользователь №: 22 035



Значение LR при perfetch слабо помогают, потомучто там в 99% случаев действительно дикие значения находятся.
LR помогает data abort отлавливать.
Пару месяцев назад я подобную тему поднимал в итоге пришёл к тому, что в handlere от perfetch вывожу через uart значение всех регистров и несколько десятков байт стека.
И по содержащимся там значениям, похожим на адреса, уже в рукопашную пытаюсь по дизасму находить похожие места.
Во всех случаях источником perfetchей было вызов функций по неинициализированным указателям.
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Jun 2 2009, 07:19
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(xelax @ Jun 2 2009, 10:02) *
Значение LR при perfetch слабо помогают, потомучто там в 99% случаев действительно дикие значения находятся.

LR_abt действительно слабо, а вот LR исходного режима - весьма сильно.
Go to the top of the page
 
+Quote Post
zltigo
сообщение Jun 2 2009, 08:04
Сообщение #7


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(IgorMarx @ Jun 1 2009, 19:50) *
3. Аккуратно протопать отладчиком.....

Пока не надоест sad.gif
Цитата
Кстати, отладчик может предупреждать о переполнении стека. Нужно смотреть в окне отладочных сообщений.

Особенно "полезная" фича, если используется, несколько переключаемых стеков, например, в операционных системах.
Просто надо действительно смотреть при вылете регистры и стек (до сих пор мне 16 значений стека для разборок).


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
KAlex
сообщение Jun 2 2009, 08:21
Сообщение #8


Местный
***

Группа: Свой
Сообщений: 387
Регистрация: 20-12-06
Из: Obninsk
Пользователь №: 23 719



Цитата(SpiritDance @ Jun 1 2009, 11:24) *
Вопрос. Я правильно понимаю что каким-то образом портится стек? Как это можно проверить и собственно как его можно попортить?

Была у меня похожая проблема, при использовании вложенных прерываний. Так же вылетало в неопределенный момент времени.
В стартапе в обработчике ошибочка была.
Go to the top of the page
 
+Quote Post
xelax
сообщение Jun 2 2009, 11:01
Сообщение #9


Местный
***

Группа: Свой
Сообщений: 370
Регистрация: 7-11-06
Пользователь №: 22 035



Цитата(aaarrr @ Jun 2 2009, 11:19) *
LR_abt действительно слабо, а вот LR исходного режима - весьма сильно.

Не согласен... Возможно иногда там и сохраняется, нормальный адрес возврата, но только если процессор не успел пробежаться по мусору или не встретил в этом мусоре ничего похожего на brunch. Когда процессор пошёл гулять по мусорным адресам из-за неинициализированного указателя, то первым гибнет корректное значение в LR регистре текущего режима.

По крайней мере мне ниразу не удавалось из LR исходного режима вытянуть полезной информации при perfetch abort, всегда там был мусор.
Другоe дело data abort smile.gif
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Jun 2 2009, 11:19
Сообщение #10


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(xelax @ Jun 2 2009, 15:01) *
Не согласен... Возможно иногда там и сохраняется, нормальный адрес возврата, но только если процессор не успел пробежаться по мусору или не встретил в этом мусоре ничего похожего на brunch. Когда процессор пошёл гулять по мусорным адресам из-за неинициализированного указателя, то первым гибнет корректное значение в LR регистре текущего режима.

Совершенно неубедительно. Во-первых, обычно процессор влетает в prefetch abort или undefined instruction на первой же инструкции после ошибочного перехода. Во-вторых, LR, естественно, не "гибнет первым делом", т.к. для этого нужно или выполнить инструкцию с Rd=LR, или же выполнить инструкцию BL.
Go to the top of the page
 
+Quote Post
defunct
сообщение Jun 2 2009, 12:51
Сообщение #11


кекс
******

Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326



Цитата(xelax @ Jun 2 2009, 14:01) *
По крайней мере мне ниразу не удавалось из LR исходного режима вытянуть полезной информации при perfetch abort, всегда там был мусор.

Вообще-то если проблема с перетиранием стека (то о чем Вы предположили в самом начале). То вылет по логике вещей должен произойти на выходе из функции сразу после выполнения
LDMIA !R13, {PC}... И LR должен быть целым
Go to the top of the page
 
+Quote Post
xelax
сообщение Jun 2 2009, 14:43
Сообщение #12


Местный
***

Группа: Свой
Сообщений: 370
Регистрация: 7-11-06
Пользователь №: 22 035



Цитата(aaarrr @ Jun 2 2009, 15:19) *
Совершенно неубедительно. Во-первых, обычно процессор влетает в prefetch abort или undefined instruction на первой же инструкции после ошибочного перехода. Во-вторых, LR, естественно, не "гибнет первым делом", т.к. для этого нужно или выполнить инструкцию с Rd=LR, или же выполнить инструкцию BL.

laughing.gif однако же там мусор. Perfech abort не той системы наверное.
А вообще не понятно о чём спор. Это вещь сугубо вероятностная.
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Jun 2 2009, 18:35
Сообщение #13


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(xelax @ Jun 2 2009, 18:43) *
А вообще не понятно о чём спор. Это вещь сугубо вероятностная.

Несомненно, только вот вероятность Вы оценили как-то странно - "первым гибнет корректное значение в LR регистре текущего режима". Это не так.
Go to the top of the page
 
+Quote Post
SpiritDance
сообщение Jun 3 2009, 10:08
Сообщение #14


Дух погибшего транзистора
****

Группа: Свой
Сообщений: 877
Регистрация: 6-09-05
Из: Москва
Пользователь №: 8 288



Цитата(aaarrr @ Jun 1 2009, 11:41) *
Для начала, крепко подумать, откуда на стеке может взяться "бешеный адрес начинающийся на 0xD8", иногда по числу удается понять, откуда оно пришло.


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


Цитата(aaarrr @ Jun 1 2009, 11:41) *
Еще можно порекомендовать посмотреть содержимое LR того режима, из которого влетели в аборт.

Смотрел. Влетаю явно из систем-режима, но в данном регистре вообще был нечетный адрес.

Проблема была хитрой. Парсер от процессора ловил некоторую сигнатуру в данных и принимал ее за команду и... всё.

Но она была явно не одна.

Сейчас наблюдаю вылет по данным.

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

Закомментировал некоторое количество кода и запустил без оптимизатора (none и low) - сбоев нет. Включаю оптимизатор и сбоит, причем точку вылета поймать пока не удается - в отладчике опять охинея, плюс он подвисает в самый неудачный момент. Программа без операционки, но с кучей конечных автоматов. Хорошо хоть проблема стабильно проявляется.

Уарты все заняты и в консольку я выбросить ничего не могу, есть только вариант с USB. Однако непонятно как написав обработчик dataabort дотянутся до регистров system.

Чтобы сделать такого чтоб добраться до истока проблемы? Мозг уже сломал.

Цитата(IgorMarx @ Jun 1 2009, 20:50) *
А нескромный вопрос мона? Какая среда программирования? Какой язык программирования? Тут не боги заседают.

Не знаю чем поможет такое уточнение. Проц sams256 + IAR4.41A.

Цитата(IgorMarx @ Jun 1 2009, 20:50) *
Кстати, отладчик может предупреждать о переполнении стека. Нужно смотреть в окне отладочных сообщений.

Угу. Это если ему будет угодно то да, покажет. Ну если конечно не зависнет.


--------------------
Yes, there are two paths you can go by But in the long run Theres still time to change the road youre on.
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Jun 3 2009, 10:19
Сообщение #15


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(SpiritDance @ Jun 3 2009, 14:08) *
Проблема в том что без отключенной оптимизации код вместе с сегментом констант и инициализированных данных не влезает в процессор

И не надо ее отключать.

Цитата(SpiritDance @ Jun 3 2009, 14:08) *
Однако непонятно как написав обработчик dataabort дотянутся до регистров system.

Просто переключиться в режим System.

Цитата(SpiritDance @ Jun 3 2009, 14:08) *
Чтобы сделать такого чтоб добраться до истока проблемы? Мозг уже сломал.

Выкинуть отладчик, добавить нормальные обработчики abort'ов, и исследовать их вывод.
Go to the top of the page
 
+Quote Post

2 страниц V   1 2 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 18th July 2025 - 08:48
Рейтинг@Mail.ru


Страница сгенерированна за 0.0151 секунд с 7
ELECTRONIX ©2004-2016