На главную
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
[!] Как относитесь к модерированию на этом форуме? Выскажите свое мнение здесь
  
> Выход за границы переменной (или массива), Как найти переменные с близкими адресами
    Всем привет!
    Борюсь с ошибкой которая возникает в расчетной программе через много часов работы. (С++ Builder 6.0)
    Удалось подсмотреть, что переменная, назовем ее X, иногда принимает совершенно неосмысленные значения типа NAD.

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

    PS: Code Guard ничего не дал, многочасовое висение 'On Change' на переменной X тоже ничего не дало.
    Сообщение отредактировано: BenGan -
      Завести (если можно) внаглую левую переменную с адресом за адресом X и поставить в отладке слежение за её изменением. Тогда выход поймается.
        Идея интересная, если сработает то, что редом описанные переменные будут иметь соседние адреса.
          Можно обязать сделать сие (адреса рядом), засунув X и X_debug в структуру, а её сделав параллельной с объединением union. ;)
          Типа:
          ExpandedWrap disabled
            union
            {
             struct { var X, X_debug; };
             char a[N];
            }
            Цитата Славян @
            Можно обязать сделать сие (адреса рядом),

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

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


            Рейтинг@Mail.ru
            [ Script Execution time: 0,0803 ]   [ 15 queries used ]   [ Generated: 29.03.20, 12:25 GMT ]