[an error occurred while processing this directive]
Ответ:
(«Телесистемы»: «Конференция «Цифровые сигнальные процессоры (DSP) и их применение»»)

миниатюрный аудио-видеорекордер mAVR

Отправлено Oleg_0515 07 мая 2003 г. 13:51
В ответ на: Ответ: Следующий ход... отправлено PGN 07 мая 2003 г. 10:40

Не совсем так. Вот кусок текста (несколько не тот случай, что я описывал, но суть та же):
void func1(int pntr[]);
void func1(int pntr[])
{
...
func2(...);
func3(...);
...
*pntr++ = 1; /* mas[0] */
...
*pntr++ = func5(...); /* prm[1] */
...
if(...) *pntr++ = func6(...); /* prm[2] */
...
и т.п.
}
void main(void)
{
int mas[12];
...
func1(mas);
...
}
Используется CCS v.2.1 для с62хх.
Так вот,

1. В функции main можно определить, что локальный массив mas размещается в памяти по адресу 0x8000927C. CCS находит его и через окно Memory и через Watch Locals (указыывая его как буфер, отображая начальный адрес и раскрывая его элементы, как это делает обычная оболочка Си, например Borland C++, по хот-кэй или через меню "Debug:Inspect:mas"). Если подвести мышь к mas, то всплывает подсказка "mas=(int *)0x8000927C". Тут все понятно. На всякий случай добавляем на закладку Watch 1 окна Watch Window этот массив mas (все нормально) и открываем дамп памяти с адреса mas.

2. Заходим в функцию func1.
Сразу после входа в функцию подводим мышь к pntr и видим подсказку "pntr=(int *)0x8000927С".
В окне Watch Locals исчезла переменная mas и появилась локальная переменная pntr обозначенная как указатель с правильным значением 0x8000927С" и расширением для одного элемента (по этому адресу) - Как и в классическом Borland C++. На закладке Watch 1 переменная mas теперь неопределена, как и должно быть. Вводим дополнительную переменую pntr на эту закладку.
Окно Memory находит наш массив по указателю pntr и выводит дамп памяти по адресу 0x8000927С, а идентифицировать символьное имя mas уже (в функции func1) не может. Все честно.
Как будто бы все ОК.

3. Проходим через вызов функции func2(...), которая не использует ни массим mas, ни указатель pntr.
В окне Watch Locals произошли изменения значения указателя pntr. теперь он равен "0xF93E4B30" (!) Аналогично на закладке Watch 1. Указатель pntr теперь разварачивается и дает значения ячеек памяти уже по этим новым адресам. Подводим мышь к pntr и видим подсказку "pntr=(int *)0xF93E4B30".
Аналогично ведет себя окно Memory, окрывая дамп по адресу 0xF93E4B30.
В классическом Borland таких глюков (или может быть новаций!!!) нет.

4. Проходим через вызов функции func3(...), которая также не использует ни массим mas, ни указатель pntr.
Все как и п.3, только теперь получаем еще одно новое значение для нашего указателя pntr: 0x800090B8 (!).

5. Подходим к строке "*pntr++ = 1; /* mas[0] */".
Указатель pntr уже имеет значение 0x80009164.
Проходим через эту строку.
Указатель pntr остается прежним (! классические дебагеры просто отдыхают !) и равным 0x80009164, а в память по адресу 0x8000927C (т.е. в наш массив mas[0]) записывается наша 1.
Точка.
Абзац.

Я такую отладку высокого уровня догнать не могу! Делается все как и должно быть, а отображается хрен знает что!
Или может я что-то не так делаю?
Менять исходники конечно можно, но вопрос: что для чего - дебагер для отладки алгоритмов, написанных в классическом ANSI-C или алгоритмы, которые можно отлаживать на CCS?

Как народ поступает в таких случаях?

Составить ответ ||| Конференция ||| Архив

Ответы


Отправка ответа

Имя (обязательно): 
Пароль: 
E-mail: 

Тема (обязательно):
Сообщение:

Ссылка на URL: 
Название ссылки: 

URL изображения: 


Перейти к списку ответов ||| Конференция ||| Архив ||| Главная страница ||| Содержание

E-mail: info@telesys.ru