Как поймать изменения значения в массиве?
От: Aleks  
Дата: 26.05.04 12:38
Оценка:
У меня есть указатель на массив переменного размера, в куске кода который в нем ниче изменять не должен, явно происходят нежелательные изменения значений. Подскажите как поймать момент когда это происходит, можно задать BreakPoint на изменение одного из значений в массиве с помошью указателя и размера или это надо как-то вручную делать?


27.05.04 03:49: Перенесено модератором из 'C/C++' — Павел Кузнецов
Если ничто другое не помогает, прочтите, наконец, инструкцию!
Re: Как поймать изменения значения в массиве?
От: Аноним  
Дата: 26.05.04 12:52
Оценка:
А, собсно, что же мешает локализовать старым добрым способом — пошаговой отладкой?
Ставь вотч на массив и вперед, VS вроде бы даже подсвечивает измененные с последнего шага переменные.
Re: Как поймать изменения значения в массиве?
От: Yuri Россия http://spbdetails.ru
Дата: 26.05.04 12:52
Оценка:
Здравствуйте, Aleks, Вы писали:

A>У меня есть указатель на массив переменного размера,


не понял, имеется в виду std::vector что-ли или что-то другое?

A>в куске кода который в нем ниче изменять не должен, явно происходят нежелательные изменения значений.


Этот кусок кода — функция?
Если да, что можно передвать указатель (ссылку) на константный массив

A>Подскажите как поймать момент когда это происходит, можно задать BreakPoint на изменение одного из значений в массиве с помошью указателя и размера или это надо как-то вручную делать?


Edit\Breakpoints, кнопка Condition
Take it easy.
Re[2]: Как поймать изменения значения в массиве?
От: Aleks  
Дата: 26.05.04 13:02
Оценка:
Здравствуйте, Аноним, Вы писали:

А>А, собсно, что же мешает локализовать старым добрым способом — пошаговой отладкой?

А>Ставь вотч на массив и вперед, VS вроде бы даже подсвечивает измененные с последнего шага переменные.
Не вариант, там изменения происходят внутри одного из проходов в цикле, в котором десятки тысяч проходов. Более того этот глюк возникает случайно где-то при одном из 10 запусков проги. Матерый глюк вообшем .
Если ничто другое не помогает, прочтите, наконец, инструкцию!
Re[3]: Как поймать изменения значения в массиве?
От: Аноним  
Дата: 26.05.04 13:55
Оценка:
A>Не вариант, там изменения происходят внутри одного из проходов в цикле, в котором десятки тысяч проходов. Более того этот глюк возникает случайно где-то при одном из 10 запусков проги. Матерый глюк вообшем .

Подозреваю что ты в этом цикле работаешь с кучей буферов и где то вылазишь за границы, т.о. меняешь "чужые данные". Рекомендую перелопатить код и наставить асертов на проверку границ. Долго и лениво, зато ошибки ловятся только в путь. Это кстати вообще хорошая идея на будущее — много труда и нервов бережет.
Re[4]: Как поймать изменения значения в массиве?
От: Aleks  
Дата: 26.05.04 14:17
Оценка:
Здравствуйте, Аноним, Вы писали:
>Рекомендую перелопатить код и наставить асертов на проверку границ. Долго и лениво, зато ошибки ловятся только в путь. Это >кстати вообще хорошая идея на будущее — много труда и нервов бережет.
В точку попал ... я с помошью assert-а определил в каком цикле этот глюк возникает, а дальше там уж больно много перелопачивать чтоб конкртеное место поймать,я думал как бы попроше.

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

А вот об этом можно поконкретнее, даже отвлекаясь от темы если надо. Ведь если я напишу что-то вроде

int *FirstArray = new int[5];
int *SecondArray = new int[10];
FirstArray[7]=x;


это не вызовет изменения SecondArray, а приведет к вылету в строке FirstArray[7]=x ... или я не прав и действительно подобным образом можно изменить SecondArray (или что-то расположенное в памяти за FirstArray).
Если ничто другое не помогает, прочтите, наконец, инструкцию!
Re[5]: Как поймать изменения значения в массиве?
От: Demo  
Дата: 26.05.04 14:31
Оценка:
>>Подозреваю что ты в этом цикле работаешь с кучей буферов и где то вылазишь за границы, т.о. меняешь "чужые данные".
A>А вот об этом можно поконкретнее, даже отвлекаясь от темы если надо. Ведь если я напишу что-то вроде

A>
A>int *FirstArray = new int[5];
A>int *SecondArray = new int[10];
A>FirstArray[7]=x;
A>


A>это не вызовет изменения SecondArray, а приведет к вылету в строке FirstArray[7]=x ... или я не прав и действительно подобным образом можно изменить SecondArray (или что-то расположенное в памяти за FirstArray).


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

Очень плохой код...
Demo
Re[6]: Как поймать изменения значения в массиве?
От: Aleks  
Дата: 26.05.04 15:02
Оценка:
D>Практически можно изменить и второй массив... В С++ нет контроля границ массива, т.е. в данном случае происходит просто запись в "какую-то" область памяти, если эта область принадлежит второму массиву, то изменится он, если она вообще не является областью доступной для записи, то это вызовет исключение...
А что являеться областью НЕ доступной для записи ... проге доступна только та память которую она сама и выделяла или не только?

D>Очень плохой код...

Где-то именно такой код я видимо и написал. Что в принципе не мудрено когда на каждом шагу такое
pIndicators[QIndicator[i]] ... все таки маловато ассертов я похоже написал .
Если ничто другое не помогает, прочтите, наконец, инструкцию!
Re[7]: Как поймать изменения значения в массиве?
От: Demo  
Дата: 26.05.04 15:27
Оценка: 3 (2)
Здравствуйте, Aleks, Вы писали:

D>>Практически можно изменить и второй массив... В С++ нет контроля границ массива, т.е. в данном случае происходит просто запись в "какую-то" область памяти, если эта область принадлежит второму массиву, то изменится он, если она вообще не является областью доступной для записи, то это вызовет исключение...

A>А что являеться областью НЕ доступной для записи ... проге доступна только та память которую она сама и выделяла или не только?

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

D>>Очень плохой код...

A>Где-то именно такой код я видимо и написал. Что в принципе не мудрено когда на каждом шагу такое
A>pIndicators[QIndicator[i]] ... все таки маловато ассертов я похоже написал .

Можно инкапсулировать массив в классе, который будет контролировать корректность индекса при обращениях...
Но это уже тяжелая артилерия...
В простом случае: ASSERT в критических точках, дамп памяти на экран и дебагер в работу...
Demo
Re: Как поймать изменения значения в массиве?
От: Штыров Денис Россия  
Дата: 27.05.04 02:35
Оценка: 2 (1)
Здравствуйте, Aleks, Вы писали:

A>У меня есть указатель на массив переменного размера, в куске кода который в нем ниче изменять не должен, явно происходят нежелательные изменения значений. Подскажите как поймать момент когда это происходит, можно задать BreakPoint на изменение одного из значений в массиве с помошью указателя и размера или это надо как-то вручную делать?



Очень рекомендую использовать Numega BoundsChecker или Rational Purify для подобных целей. Иногда они очень экономят Ваше драгоценное время на поиск "неуловимых" ошибок. Да и вообще отличные профилактические средства!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.