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

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> Отладка и выход за пределы массивов, Как отловить выход за предел массива.
Neo_Matrix
сообщение Apr 6 2018, 20:27
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 27
Регистрация: 11-04-06
Пользователь №: 16 029



Подскажите, есть ли способ под FreeRTOS понять есть ли выходы за предел массива. Хуки на недостаток хипа и стека работают нормально и очень помогают, когда нужно зажать стек задачи до минимума. Но как отладить выход за пределы массивов? Такая необходимость появилась, так как иногда устройства перезагружаются сами по себе(в обработчиках исключений стоит функция сброса, так как устройства должны максимально быть доступны). Есть подозрение на выход за пределы. Так как проект достаточно крупный около 300кб кода с оптимизацией, пересмотреть, а главное заметить ошибку очень сложно.
Кто, что может порекомендовать?
Go to the top of the page
 
+Quote Post
jcxz
сообщение Apr 6 2018, 21:57
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(Neo_Matrix @ Apr 6 2018, 23:27) *
Подскажите, есть ли способ под FreeRTOS понять есть ли выходы за предел массива. Хуки на недостаток хипа и стека работают нормально и очень помогают, когда нужно зажать стек задачи до минимума. Но как отладить выход за пределы массивов?

А какое имеет отношение FreeRTOS или какая другая ОС к вашим массивам?
Читайте описание на используемый процессор.
Для Cortex-M - читать описание MPU.
Go to the top of the page
 
+Quote Post
kolobok0
сообщение Apr 7 2018, 00:19
Сообщение #3


практикующий тех. волшебник
*****

Группа: Участник
Сообщений: 1 190
Регистрация: 9-09-05
Пользователь №: 8 417



Цитата(Neo_Matrix @ Apr 6 2018, 23:27) *
...Кто, что может порекомендовать?


Наберите людей на испытательный срок. С условием = найдут проблемы, бонусы.
А для программиста = обратная задача. Найдётся баг - из его зарплаты минусы.

Думаю проблемЫ найдутся быстро, тоннами и качественно.

Не технический путь, но профит будет 100%

удачи вам
(круглый)
ЗЫ
Если технически - наверное пытаться эмулировать работу логики. + изоляция памяти, с анализом на перезатирку. Но профит будет меньше чем в первом случае...
Go to the top of the page
 
+Quote Post
novikovfb
сообщение Apr 7 2018, 04:11
Сообщение #4


Знающий
****

Группа: Участник
Сообщений: 518
Регистрация: 29-09-11
Пользователь №: 67 450



Для начала стоит перенести код в настольный ПК и погонять на модели под отладчиком, напихав туда проверок при каждом обращении к массивам. Ну и статические анализаторы типа CPP-Check или PVS-Studio помогают найти некоторые ошибки.
Go to the top of the page
 
+Quote Post
k155la3
сообщение Apr 7 2018, 09:14
Сообщение #5


Профессионал
*****

Группа: Свой
Сообщений: 1 123
Регистрация: 8-03-09
Из: Днепр
Пользователь №: 45 848



1. Проработайте код аналитически, тк выход за границы массива "чем-то" - грубая ошибка, скорее всего программера а не компилятора или OS.
2. Используйте "на полную" возможности отладчика, например IAR. Настройте BP на стоп по изменению памяти (write).
Ставите такй BP на ячейку (адрес) за пределами массива и .... ждете sm.gif
3. Ну, можно "наложить" в памяти 2 массива. (&WorkArry[0] == &DbgArry[0])
Один - большой, отладочный, который перекрывает по размеру "проблемный".
Заполняете отладочный массив паттерном, напр. 0x55.
Второй массив - Ваш "проблемный". После сбоя смотрим паттерны в отладочном массиве выше последней ячейки "проблемного".

ps/ п.3.
При остановке в этой BP, через StackCall будет видно, кто там "порылся".
Go to the top of the page
 
+Quote Post
jcxz
сообщение Apr 7 2018, 19:08
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(kolobok0 @ Apr 7 2018, 03:19) *
Наберите людей на испытательный срок. С условием = найдут проблемы, бонусы.
А для программиста = обратная задача. Найдётся баг - из его зарплаты минусы.
Думаю проблемЫ найдутся быстро, тоннами и качественно.

Вот именно! ... когда люди на испытательном сроке познакомятся с программистом делающим баги, я думаю они быстро найдут формулу взаимовыгодного сотрудничества: "утром баги, вечером бонусы" или "вечером баги, утром бонусы".
И все будут довольны: люди - бонусами, программист откатами от бонусов людей, а хозяин тоннами находимых и находимых багов... biggrin.gif biggrin.gif biggrin.gif biggrin.gif

Цитата(k155la3 @ Apr 7 2018, 12:14) *
Ставите такй BP на ячейку (адрес) за пределами массива и .... ждете sm.gif

На какую именно ячейку "за пределами"? Если к примеру массив == 10 байт, а размер памяти МК == 1<<32, то на какую из
(1<<32)-10 ячеек ставить? На все? Боюсь что жизни не хватит. laughing.gif

Цитата(k155la3 @ Apr 7 2018, 12:14) *
При остановке в этой BP, через StackCall будет видно, кто там "порылся".

char m[10];
int i = char[20]; //однако проблема!

И как же именно будет видно "через StackCall" или через некие "паттерны" кто порылся в вышеприведённом фрагменте кода??? wacko.gif
Go to the top of the page
 
+Quote Post
k155la3
сообщение Apr 7 2018, 19:49
Сообщение #7


Профессионал
*****

Группа: Свой
Сообщений: 1 123
Регистрация: 8-03-09
Из: Днепр
Пользователь №: 45 848



Цитата(jcxz @ Apr 7 2018, 22:08) *
. . .
(1) На какую именно ячейку "за пределами"? Если к примеру массив == 10 байт, а размер памяти МК == 1<<32, то на какую из
. . .
(2) . . И как же именно будет видно "через StackCall" или через некие "паттерны" кто порылся в вышеприведённом фрагменте кода???

1 - понятно, что если вылет идет с "фонарным" индексом то это не вариант.
Если же это примитивный "зашкал" по sprintf - то вполне. (кто не пользуется snprintf)

2. Это не мое "изобретение", метода исползуется для контроля использования стека в scmRTOS.
Для чтения за пределами массива - никак. Разве что знать, что считывается определенный адрес и BP поставить на него. Смотреть стек вызовов.
Для чтения более целесообразно смотреть что попадает в [] а не вылавливать последствия. С указателем сложнее.
Код
//    Target-specific configuration macros
//
#ifdef scmRTOS_USER_DEFINED_STACK_PATTERN
#define scmRTOS_STACK_PATTERN scmRTOS_USER_DEFINED_STACK_PATTERN
#else
#define scmRTOS_STACK_PATTERN 0x55aaU
#endif
Go to the top of the page
 
+Quote Post
jcxz
сообщение Apr 7 2018, 20:23
Сообщение #8


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(k155la3 @ Apr 7 2018, 22:49) *
2. Это не мое "изобретение", метода исползуется для контроля использования стека в scmRTOS.

И что? "Метод" не даёт никакой гарантии. Подумайте, что будет при вызове функции:
Код
void func() {
int m[100];
...
}
если вызов происходит вблизи границы стека. Да и не про стек вопрос автора.

Цитата(k155la3 @ Apr 7 2018, 22:49) *
Для чтения за пределами массива - никак.

Как. Если знать какой CPU у автора. Для Cortex-M я уже написал выше как. Для CPU с MMU - ещё лучше. И чтение и произвольная запись. Именно - произвольная, а не только в следующий адрес после массива.
Go to the top of the page
 
+Quote Post
Neo_Matrix
сообщение Apr 7 2018, 22:57
Сообщение #9


Участник
*

Группа: Участник
Сообщений: 27
Регистрация: 11-04-06
Пользователь №: 16 029



Спасибо всем за ответы. Их действительно много и они вполне перекрывают вопрос. Думаю лучший способ настроить MPU(cortex m4) + в некоторых местах сделаю массивы на длину +1 элемент и поставлю туда брейкпоинт на запись и чтение. Вариант с перекрытием массивов очень сложен, так как кода много и проблемный массив неизвестен. Аналитически код был просмотрен уже неоднократно, был найден один ляп с приведением типов, но это не изменило ситуацию в корне. Так же интересует, в случае фриртоса и выделения памяти в хипе, если будет затерт конец массива выделенной памяти, будет ли вызван ассерт во время фрии, или в конце нет данных маллока для отслеживания окончания массива(используется heap4.c + его модификация под CCM память)? Вариант с испытательным сроком очень оригинален. Всем спасибо sm.gif

Сообщение отредактировал Neo_Matrix - Apr 7 2018, 23:06
Go to the top of the page
 
+Quote Post
HardEgor
сообщение Apr 8 2018, 04:15
Сообщение #10


Гуру
******

Группа: Свой
Сообщений: 2 223
Регистрация: 3-03-06
Из: Tomsk
Пользователь №: 14 925



Цитата(Neo_Matrix @ Apr 7 2018, 03:27) *
Так как проект достаточно крупный около 300кб кода с оптимизацией, пересмотреть, а главное заметить ошибку очень сложно.
Кто, что может порекомендовать?

Анализаторами кода пользовались? PVS-studio писали что адаптировались под Keil/IAR, только у меня руки не дошли проверить.
Go to the top of the page
 
+Quote Post
kolobok0
сообщение Apr 8 2018, 09:30
Сообщение #11


практикующий тех. волшебник
*****

Группа: Участник
Сообщений: 1 190
Регистрация: 9-09-05
Пользователь №: 8 417



Цитата(Neo_Matrix @ Apr 8 2018, 01:57) *
Спасибо всем за ответы. ...


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

Но имхо - проблема не в коде, а в организации...

удачи вам
(круглый)
Go to the top of the page
 
+Quote Post
k155la3
сообщение Apr 8 2018, 13:40
Сообщение #12


Профессионал
*****

Группа: Свой
Сообщений: 1 123
Регистрация: 8-03-09
Из: Днепр
Пользователь №: 45 848



Цитата(jcxz @ Apr 7 2018, 23:23) *
И что? "Метод" не даёт никакой гарантии. Подумайте, что будет при вызове функции:
Код
void func() {
int m[100];
...
}
если вызов происходит вблизи границы стека. Да и не про стек вопрос автора.
. . .

А какие могут быть гарантии при отладке каким-либо одним методом ?
Смею предположить, что затрется адрес возврата или контекст. Вообще - что угодно.

Код
void func()
{
static int m[100];
...
}

Если характер сбоя изменился или он вообще перестал проявляться - некорректная работа с этим массивом.
Цитата(Neo_Matrix @ Apr 8 2018, 01:57) *
Спасибо всем за ответы. Их действительно много и они вполне перекрывают вопрос. Думаю лучший способ настроить MPU(cortex m4) + в некоторых местах
. . .
Если RAM позволяет, попробуйте массив(ы) которые "под подозрением" объявить как static.
Go to the top of the page
 
+Quote Post
Kabdim
сообщение Apr 8 2018, 14:03
Сообщение #13


Знающий
****

Группа: Свой
Сообщений: 558
Регистрация: 26-11-14
Из: Зеленоград
Пользователь №: 83 842



Цитата(jcxz @ Apr 7 2018, 23:23) *
И что? "Метод" не даёт никакой гарантии. Подумайте, что будет при вызове функции:

Гарантий нет, но в жизни это самый быстрый и действенный способ.
Go to the top of the page
 
+Quote Post
Neo_Matrix
сообщение Apr 10 2018, 12:11
Сообщение #14


Участник
*

Группа: Участник
Сообщений: 27
Регистрация: 11-04-06
Пользователь №: 16 029



Всем спасибо. Ошибка найдена. Функции strncmp при определенных стечениях обстоятельств передавался NULL вместо валидного указателя.
Go to the top of the page
 
+Quote Post
jcxz
сообщение Apr 10 2018, 12:26
Сообщение #15


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(Neo_Matrix @ Apr 10 2018, 15:11) *
Всем спасибо. Ошибка найдена. Функции strncmp при определенных стечениях обстоятельств передавался NULL вместо валидного указателя.

Вообще в нормально построенной программе на Cortex-M все области вне регионов ОЗУ обычно запрещаются для доступа по записи, а все регионы где вообще нет никакой памяти запрещаются для любого типа доступа. Для этого и предназначен MPU. Если-б у Вас программа была построена так, то скорей всего ошибка нашлась бы при первом же её проявлении.
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 April 2024 - 00:42
Рейтинг@Mail.ru


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