VS2008 C ++ MFC Access Violation ТОЛЬКО при переходе в режим отладки - PullRequest
5 голосов
/ 06 мая 2010

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

Я запускаю это на Win7x64, если это имеет значение. VS2008 SP1.

Здесь идет. Я создаю небольшое диалоговое приложение с кнопкой. Поместите точку останова в функцию обработчика для этой кнопки. Функция обработчика кнопок выглядит следующим образом:

void CTestProjectDlg::OnBnClickedButton1()
{
    int i;

    i = 2;  // < breakpoint here
    i = 3;

}

Нажмите кнопку, нажмите точку останова. От F10 к шагу и буму: «Исключение первого шанса в 0x0398f77b в TestProject.exe: 0xC0000005: нарушение доступа».

Это дает мне возможность разорвать или продолжить. Если я продолжу, он просто попадет снова, только не «Первый шанс». Да, я проверил это исключение в dlg Debug-> Exceptions.

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

Неважно, где я ставлю точку останова.

Если вместо F10 я просто продолжу с F5, он будет работать нормально.

Теперь .. если я создаю версию Release и запускаю в режиме отладки: я достигаю точки останова, и все указатели, значения переменных выглядят нормально. F10, и они превращаются в мусор. Указатель this теперь равен нулю. M_csHello теперь

Однако в режиме Release исключение не перехватывается, и все работает нормально. Строка «Привет, мир» отображается в диалоговом окне, как и должно быть.

Я отправил запрос, чтобы узнать, был ли установлен какой-либо патч на моем боксе ИТ-отделом в последние день или два. Это не происходило 2 дня назад.

Что ты думаешь? VS2008 поврежден?

Спасибо.

Редактировать: Дополнительная информация. Этого не происходит, если я собираю / отлаживаю платформу x64. Только для Win32.
Я также посмотрел на все исправления / обновления безопасности для VS2008 на коробке. Они

Наконец, я поместил проект на другую машину, которая не обновлялась последние 2-3 недели. Он работает там, и там установлены те же самые обновления VS.

Я также изменил код, который переступает для целей этого поста. .. Это простое целочисленное присваивание, без MFC.

В данный момент я нахожусь в процессе переустановки VS2008.

Ответы [ 5 ]

7 голосов
/ 14 июня 2011

Была такая же проблема с VS2008 SP1, Win7x64, отладка кода в 32 бита.Проблема исчезнет, ​​если я отключу параметр

Сервис -> Параметры -> Отладка -> Собственный -> Включить отладку RPC.

Следующая запись может быть связана с этим: ОтладкаКоманды (шаг за шагом / в) вызывают необработанные исключения

1 голос
/ 18 июня 2010

Я тоже испытываю то же самое, опять же на платформе разработки Win7x64, VS2008 SP1. Мой код - C ++, WTL, ATL, DirectShow и другие библиотеки.

Журнал обновлений Windows показывает, что в обеденное время на моей машине было обновление Windows. Проблема началась только после обеда - без изменений проекта!

Черт бы побрал вас и ваших глупых автоматических обновлений, которые нарушают среду разработки, m $ !!! Позор всем вам!

1 голос
/ 06 мая 2010

Вы говорите, что один и тот же проект компилируется и прекрасно работает на другом компьютере с той же версией Visual Studio. Код выглядит нормально, так что да, похоже, что VS 2008 поврежден и требует переустановки.

0 голосов
/ 06 мая 2010

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

0 голосов
/ 06 мая 2010

Если он работает в Release, но не отлаживается, то я считаю, что у вас где-то есть неинициализированная переменная.При отладке он автоматически устанавливается на 0xcdcdcdcd (или его часть в зависимости от размера переменной), что приводит к сбою в Release, у вас уже есть какое-либо значение в памяти и, возможно, это значение предотвращает его разрыв ... Довольно часто неинициализированныйпеременная, подобная этой, используется в качестве привязки к циклу, и при отладке вы записываете в память и перезаписываете что-то важное, что может ПОЗЖЕ привести к сбою.В выпуске значение просто в порядке, но это не всегда так.

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

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