Проблемы отладки в Visual Studio 2010 C ++ - отображаются нечетные значения - PullRequest
2 голосов
/ 29 марта 2012

Я столкнулся с каким-то странным поведением в моем коде.

Он выдает ошибку нарушения доступа, когда я запускаю его и через отладчик мне удалось найти строку, которая его вызывает:

for( int x=0; x<width; x++) {

    int current = edgeKernelXY(left+x,top+y,true,0);
    ....
}

Я поместил точку отладки в метод edgeKernelXY, и код даже не попал в метод.

Следующее, что я проверил, было то, какие значения я передаю в него. Слева, сверху и у кажутся нормальными. Однако, согласно отладчику, x = 19840810 и current = 19840810. Я не понимаю, как это могло произойти, особенно если бы я объявил x в 0 в начале цикла. Ширина верна на 40.

x и current не были объявлены где-либо еще в области действия forloop. Что может быть не так?

EDIT:

Я изменил код следующим образом:

    for( int x=0; x<width; x++) {
        int current = edgeKernelXY(left,top+y,true,0);
        if( current > THRESHOLD && 
            edgeKernelXY(left+x,top+y,true,1) > THRESHOLD &&
            edgeKernelXY(left+x,top+y,true,2) > THRESHOLD ) {
        } else {
            current = 0.0f;
        }

В частности, я изменил left + x при первом вызове edgeKernelXY на left. Кажется, это выполняется, и второй вызов edgeKernelXY показывает, что x правильно установлен на 0. Однако поведение не то, что я хочу. Слева + х до сих пор сводит меня с ума значения х, что вызывает нарушение прав доступа.

    for( int x=0; x<width; x++) {

        int current;
        current = 0;
        current = edgeKernelXY(left+x,top+y,true,0);

Также показывает проблемы с током.

Ответы [ 2 ]

3 голосов
/ 29 марта 2012

Поскольку вы отлаживаете сборку релиза, вы не можете зависеть от отладчика, показывающего правильные значения в окнах наблюдения и т. Д. Режим отладки релиза можно сделать, но он значительно сложнее.Как правило, требуется разобраться с разборкой, чтобы понять, что происходит и каково состояние вещей (т. Е. x почти наверняка хранится в реестре).

Если вы не можете выполнить полноеВ отладочном выпуске вы все равно можете получить гораздо лучший опыт отладки, выполнив сборку с отключенными оптимизациями (что может быть сделано в сборках выпуска и может быть сделано без привязки к отладочным библиотекам).

Предполагая, что вы строите в IDE, просто зайдите в настройки проекта и измените значение C/C++ - Optimization - Optimization на Disabled (/Od).

Если это вызывает проблему, устанавливая ее для всего проекта (чего не следует делать), вы можете сделать то же самое для каждого файла-источника, щелкнув правой кнопкой мыши по интересующим вас исходным файлам.отладка и установка параметра в свойствах этого исходного файла.Просто не забудьте очистить эти настройки, когда вы закончите (и не проверяйте их в управлении исходным кодом), потому что IDE не дает понять, что существуют специфические настройки исходного файла, поэтому это может сбить с толку в будущем.

0 голосов
/ 29 марта 2012

Несколько вещей для проверки

  1. Есть ли в вашей программе двойное удаление, которое может испортить кучу (я знаю, что это не объясняет проблему с x в стеке, но что-топроверить все же)
  2. Есть ли какие-либо операторы между for, начинающим вызов функции edgeKernelXY?Если это так, пожалуйста, проверьте их на возможные переполнения стека
  3. Значение x неверно пахнет для меня повреждением стека, которое может произойти по нескольким причинам
    • Есть ли массив, которыйВы создали в начале функцию, которая переопределяет стек?
    • Может ли быть вызов функции, который возвращает указатель на массив (в его стеке), который вы используете, предполагая, что данные уже доступны

Все вышеперечисленное не даст вам точный ответ, который вы ищете, но некоторые варианты для вас, чтобы проверить.И самое главное - вы запускали свою программу через какой-то профилировщик памяти (например, Valgrind) и проверяли вывод?Чаще всего это будет указывать на причину этой проблемы.

Если вы выясните причину проблемы, пожалуйста, опубликуйте подход, которому вы следовали.Это сделает опыт сообщества богаче.Спасибо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...