Версия для печати
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум на Исходниках.RU > Borland C++ Builder/Turbo C++ Explorer > Выход за границы переменной (или массива)


Автор: BenGan 27.08.19, 05:04
Всем привет!
Борюсь с ошибкой которая возникает в расчетной программе через много часов работы. (С++ Builder 6.0)
Удалось подсмотреть, что переменная, назовем ее X, иногда принимает совершенно неосмысленные значения типа NAD.

Возникло подозрение, что кто-то, возможно, массив, выходит за дозволенные границы. Как найти возможных кандидатов?
Как найти переменные от адреса переменой X и ниже?

PS: Code Guard ничего не дал, многочасовое висение 'On Change' на переменной X тоже ничего не дало.

Автор: Славян 27.08.19, 15:08
Завести (если можно) внаглую левую переменную с адресом за адресом X и поставить в отладке слежение за её изменением. Тогда выход поймается.

Автор: BenGan 29.08.19, 04:38
Идея интересная, если сработает то, что редом описанные переменные будут иметь соседние адреса.

Автор: Славян 29.08.19, 14:27
Можно обязать сделать сие (адреса рядом), засунув X и X_debug в структуру, а её сделав параллельной с объединением union. ;)
Типа:
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    union
    {
     struct { var X, X_debug; };
     char a[N];
    }

Автор: ЫукпШ 29.08.19, 18:03
Цитата Славян @
Можно обязать сделать сие (адреса рядом),

Переменные будут рядом, если они просто по тексту программы будут рядом.
В этом можно будет на всякий случай убедиться, просто выводя их адреса.
---
Используя статьи:
Пишем свой отладчик под Windows [часть 1]
Пишем свой отладчик под Windows [часть 2]
Writing Windows Debugger - Part 1
Writing Windows Debugger - Part 2
Изучаем отладчик, часть первая
Изучаем отладчик, часть вторая
Изучаем отладчик, часть третья

пишем свой собственный отладчик.
Ставим ВР на адрес памяти переменной X.
Будем получать события, выбирать из них работу именно
с этой переменной, читать её и сравнивать результат с допустимым.
Как только результат не понравится, считаем контекст и, таким образом,
узнаем адрес выполнения в программе, откуда произошла неправильная коррекция
переменной. Заодно сравним этот адрес с адресом (адресами) откуда производилась
правильная коррекция переменной. Ещё можно спасти кусок образа памяти, вокруг
адреса места неправильного вызова. Что, возможно, облегчит поиск паталогии
в исходных текстах.
---
Если всё получится (как описано в статьях) это будет очень полезный инструмент.

Powered by Invision Power Board (https://www.invisionboard.com)
© Invision Power Services (https://www.invisionpower.com)