Отладчик VS2008 не прерывается при необработанном исключении

StackOverflow https://stackoverflow.com/questions/103034

Вопрос

У меня странная проблема с моим отладчиком vs.При запуске моей программы под отладчиком vs отладчик не прерывается из-за необработанного исключения.Вместо этого управление возвращается в VS, как если бы программа завершилась нормально.Если я посмотрю на вкладке вывода, то перед завершением потока будет указано исключение первого шанса.

Я понимаю, как использовать поле «Исключения» в меню «Отладка».У меня проверено прерывание необработанных исключений.Если я проверю исключения первой возможности для конкретного возникшего исключения, отладчик остановится.

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

Вот последние несколько строк моей вкладки «Вывод»:

A first chance exception of type 'System.ArgumentOutOfRangeException' occurred in mscorlib.dll
The thread 0x60c has exited with code 0 (0x0).
The program '[3588] ALMSSecurityManager.vshost.exe: Managed' has exited with code -532459699 (0xe0434f4d).

Я не понимаю, почему исключение помечается как исключение «первого шанса», когда оно не обработано.

Я считаю, что код выхода 0xe0434f4d является общей ошибкой COM.

Есть идеи?

Метро.

Это было полезно?

Решение

Если вы используете 64-битную ОС, вполне вероятно, что вас укусило поведение на уровне ОС, которое приводит к исчезновению исключений.Самый надежный способ воспроизвести это — создать новое приложение WinForm, которое просто выдает исключение в OnLoad;будет казаться, что его не бросают.Взгляните на это:

  1. Visual Studio не прерывает работу из-за необработанного исключения в 64-разрядной версии Windows.
    • http://social.msdn.microsoft.com/Forums/en/vsdebug/thread/69a0b831-7782-4bd9-b910-25c85f18bceb
  2. Случай исчезновения исключения OnLoad
  3. Тихие исключения на машинах разработки x64 (Microsoft Connect)
    • https://connect.microsoft.com/VisualStudio/feedback/details/357311/silent-Exceptions-on-x64-development-machines

Первое — это то, что я нашел в Google (после того, как эта тема не помогла), и эта тема привела меня к следующим двум.Второе имеет лучшее объяснение, а третье — это ошибка/заявка Microsoft (которая еще раз подтверждает, что такое поведение является «задуманным»).

Таким образом, по сути, если ваше приложение выдает исключение, которое достигает границы режима ядра на пути обратно в стек, оно блокируется на этой границе.И команда Windows решила, что лучший способ справиться с этим — сделать вид, что исключение обработано;выполнение продолжается, как если бы все завершилось нормально.

О, и это случается повсюду.Отладка или выпуск не имеют значения..Net против C++ не имеет значения.Это поведение на уровне ОС.

Представьте, что вам нужно записать на диск некоторые важные данные, но происходит сбой на неправильной стороне границы режима ядра.Другой код попытается использовать его позже, и, если вам повезет, вы обнаружите, что с данными что-то не так... но почему?Могу поспорить, что вы никогда не задумывались о том, что вашему приложению не удалось записать данные, потому что вы ожидали, что будет выдано исключение.

Придурки.

Другие советы

Когда я прочитал ответ о наличии двух флажков в диалоговом окне «Исключение...», я вернулся и снова открыл диалоговое окно.У меня был только один столбец флажков — для разрыва «Выброшено».

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

Я выбрал параметр «Включить только мой код» и убедился, что флажок «Необработано пользователем» в диалоговом окне «Исключения» установлен для всех категорий исключений.

Мне удалось получить необработанные исключения для взлома отладчика за один сеанс.Но когда я вернулся на следующий день, поведение было прежним.

Метро.

Ctl-D, E открывает окно «Исключения».Вы можете установить, какие исключения вы хотите и не хотите прерывать.

В поле «Исключения...» есть два флажка, обычно мне приходится устанавливать оба флажка, чтобы он прерывался при необработанных исключениях.Несмотря на то, что это читается так, будто вам нужно его проверить.

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top