Как отключить исключения в visual studio

Обновлено: 06.07.2024

Я использую библиотеку из CGAL, которая на этапе связывания моей компиляции кода создает множество предупреждений о связывании этой формы:

Как отключить это конкретное предупреждение компоновщика в Visual C++ / Studio 2008?

добавить следующее в качестве дополнительной опции компоновщика:

это в свойствах - >Компоновщик - > Командная строка

вы не можете отключить конкретные предупреждения.

по данным Джефф Чеппел предупреждение 4099 рассматривается как слишком важное, чтобы игнорировать, даже используя в сочетании с /wx (который будет рассматривать предупреждения как ошибки и игнорировать указанное предупреждение в других ситуациях)

вот соответствующий текст из ссылки:

(для записи и до того, как поток исчезнет на форумах msdn) Вы не можете отключить предупреждение (по крайней мере, в VS2010), потому что оно находится в списке предупреждений, которые нельзя отключить (поэтому /wd4099 не будет работать), но вместо этого вы можете сделать ссылку на исправление.exe (обычно C:\Program файлы (x86)\Microsoft Visual Studio 10.0\VC\bin\link.exe), чтобы удалить его из указанного списка . Звучит как отбойный молоток, я знаю. Но это работает.

например, если вы хотите снять предупреждение для 4099, откройте ссылку.exe с шестнадцатеричным редактором, goto line 15A0, который читает 03 10 (little endian для 4099) и заменяет его FF 00 (который не существует.)

для пользы других, я бы включил то, что я сделал.

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

но по умолчанию все PDF-файлы называются одинаково: vc100.pdb в моем случае. Как вам нужно .pdb для каждого .Либ, это создает проблема, особенно если вы используете что-то вроде ImageMagik, который создает около 20 статических.lib-файлы. Вы не можете иметь 20 lib-файлов в одном каталоге (который ссылается компоновщик вашего приложения на ссылку в библиотеках) и иметь все 20 .pdb файлы называют то же самое.

моим решением было пойти и перестроить мои статические файлы библиотеки и настроить VS2010 на имя.pdb-файл в отношении проекта. Сюда, каждый .lib получает аналогичное имя .pdb, и вы можете положить все библиотеки и PDBs в одном каталоге для вашего проекта.

поэтому для конфигурации "Debug" я отредактировал:

Свойства - >Свойства Конфигурации - > C / C++ - > Выходные Файлы - > Имя Файла Базы Данных Программы С

будет следующим значением:

$(OutDir)vc$(PlatformToolsetVersion) D$(имя проекта).pdb

сейчас, а не где-то в промежуточные каталога .pdb-файлы записываются в каталог, где .файлы lib также пишутся, и самое главное, они называются суффиксом D+название проекта. Это означает, что каждая библиотека проект produduces проект .lib и конкретный проект .распределительная плата.

теперь я могу скопировать весь мой релиз .lib-файлы, моя отладка .lib-файлы и отладки .pdb-файлы в одном месте в моей системе разработки и проект, который использует эта сторонняя библиотека в режиме отладки имеет файлы pdb, которые ей нужны в режиме отладки.

файл PDB обычно используется для хранения отладочной информации. Это предупреждение вызвано, вероятно, потому, что файл vc80.pdb не найден при связывании целевого объектного файла. Прочитайте запись MSDN на LNK4099 здесь.

кроме того, можно отключить генерацию отладочной информации в поле свойства проекта > Компоновщик > отладка > генерация отладочной информации.

EDIT: не используйте vc80 / Visual Studio 2005, Но версии Visual Studio 2008 / vc90 библиотеки CGAL (возможно С здесь).

вы также можете скомпилировать с /Z7, поэтому pdb не нужно использовать, или удалите параметр компоновщика / DEBUG, если нет .pdb файлы для объектов вы соединяетесь.

вы не можете отключить предупреждение компоновщика 4099, как сказал @John Weldon.

вы должны перестроить библиотеку с некоторыми изменениями конфигурации проекта. У вас есть несколько вариантов:

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

Подавлять нарушения с помощью файла EditorConfig

В файле EditorConfig задайте уровень серьезности none , например dotnet_diagnostic.CA1822.severity = none . Сведения о добавлении файла EditorConfig см. в разделе Добавление файла EditorConfig в проект.

Подавлять нарушения в исходном коде

В редакторе кода

Поместите курсор в строку кода с нарушением и нажмите клавишу CTRL + (.) , чтобы открыть меню быстрые действия . Выберите ПОДАВЛЯТЬ какскскскс, а затем выберите в источнике или в источнике (атрибут).

При выборе в поле Источник вы увидите предварительную версию директивы препроцессора, которая будет добавлена в код.

Подавлять диагностику в меню быстрых действий

Подавлять диагностику в меню быстрых действий

При выборе в поле Источник (атрибут) отображается предварительный просмотр атрибута SuppressMessage , который будет добавлен в код.

Подавлять диагностику в меню быстрых действий с помощью атрибута

Из Список ошибок

Выберите правила, которые необходимо отключить, и щелкните правой кнопкой мыши и выберите подавлять > в источнике.

В диалоговом окне Просмотр изменений нажмите кнопку Применить.

Если в Обозреватель решений не отображается пункт подавить , то, скорее всего, это произошло из-за сборки, а не для интерактивного анализа. Список ошибок отображает диагностические или нарушения правил, как в реальном коде, так и в сборке. Так как диагностика сборки может быть устаревшей, например, если вы изменили код, чтобы устранить нарушение, но оно не было перестроено, вы не сможете отключить эти диагностические данные от Список ошибок. Диагностика из интерактивного анализа или IntelliSense всегда актуальны с текущими источниками и могут быть подавлены из Список ошибок. Чтобы исключить диагностику сборки из выбора, переключите фильтр источника Список ошибок с сборки + IntelliSense на IntelliSense. Затем выберите диагностику, которую необходимо отключить, и продолжайте, как описано выше.

Фильтр источника список ошибок в Visual Studio

Подавлять нарушения с помощью файла глобального подавления

На Список ошибок выберите правила, которые необходимо отключить, а затем щелкните правой кнопкой мыши и выберите пункт подавлять > в файле подавления. Откроется диалоговое окно Просмотр изменений , в котором будет показан предварительный просмотр SuppressMessageAttribute атрибута, добавляемого в глобальный файл подавления.

Предварительный просмотр добавления атрибута SuppressMessage в файл подавления

В редакторе кода поместите курсор в строку кода с нарушением и нажмите клавиши быстрого действия и рефакторинга (или нажмите клавишу CTRL + period (. )), чтобы открыть меню быстрые действия . Выберите ПОДАВЛЯТЬ какскскскс, а затем выберите в файле подавления. Вы увидите предварительную версию файла глобального подавления , который будет создан или изменен.

  • В меню анализ выберите пункт анализировать > сборку и подавлять активные проблемы в строке меню, чтобы отключить все текущие нарушения. Иногда это называется "задания базовых показателей".
  • в меню анализ выберите анализировать > выполнение Code Analysis и подавлять активные проблемы в строке меню, чтобы отключить все текущие нарушения. Иногда это называется "задания базовых показателей".

Подавлять нарушения с помощью параметров проекта

Подавлять нарушения с помощью набора правил

В редакторе набора правил снимите флажок рядом с его именем или действием задать значение нет.

Подавление в исходном код и атрибут SuppressMessage

Подавление в исходном код (ISS) использует SuppressMessageAttribute атрибут для подавления предупреждения. Атрибут можно поместить ближе к сегменту кода, вызвавшему предупреждение. Можно добавить SuppressMessageAttribute атрибут в исходный файл, введя его в, или можно использовать контекстное меню предупреждения в Список ошибок , чтобы добавить его автоматически.

SuppressMessageAttributeАтрибут является условным атрибутом, включенным в метаданные Il сборки управляемого кода, только если символ компиляции CODE_ANALYSIS определен во время компиляции.

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

если вы переносите проект на Visual Studio 2017, то, возможно, внезапно посталкивается с большим количеством предупреждений анализа кода. если вы не готовы устранить предупреждения, их можно отключить, выбрав пункт анализ > выполнения Code Analysis и подавлять активные проблемы.

Выполнение анализа кода и отключение проблем в Visual Studio

если вы переносите проект на Visual Studio 2019, то, возможно, внезапно посталкивается с большим количеством предупреждений анализа кода. Если вы не готовы устранить предупреждения, их можно отключить, выбрав пункт анализировать > сборку и подавлять активные проблемы.

SuppressMessage - атрибут

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

SuppressMessageAttributeАтрибут имеет следующий формат:

К свойствам атрибута относятся:

Category — Категория, в которой определено правило. Дополнительные сведения о категориях правил анализа кода см. в разделе предупреждения управляемого кода.

CheckId — идентификатор правила. Поддержка включает короткое и длинное имя для идентификатора правила. Короткое имя — КАКСКСКСКС; длинное имя — КАКСКСКСКС: Фриендлитипенаме.

Scope — целевой объект, в котором предупреждение подавляется. Если целевой объект не указан, ему присваивается значение целевого объекта атрибута. В число поддерживаемых областей входят следующие.

module — Эта область подавляет предупреждения для сборки. Это глобальное подавление, которое применяется ко всему проекту.

type — Эта область подавляет предупреждения для типа.

member — Эта область подавляет предупреждения для элемента.

namespace — Эта область подавляет предупреждения относительно пространства имен. Он не отключает предупреждения для типов в пространстве имен.

namespaceanddescendants -(требуется компилятор версии 3. x или выше и Visual Studio 2019). эта область подавляет предупреждения в пространстве имен и всех его дочерних символах. namespaceanddescendants Значение игнорируется устаревшим анализом.

Target — идентификатор, который используется для указания целевого объекта, в котором предупреждение подавляется. Он должен содержать полное имя элемента.

при появлении предупреждений в Visual Studio можно просмотреть примеры SuppressMessage , добавив подавление в глобальный файл подавления. Атрибут подавления и его обязательные свойства отображаются в окне предварительного просмотра.

Использование SuppressMessage

Code Analysis предупреждения подавляются на уровне, к которому SuppressMessageAttribute применяется атрибут. Например, атрибут можно применить на уровне сборки, модуля, типа, члена или параметра. Целью этого является тесное связывание информации о подавлении с кодом, в котором происходит нарушение.

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

При наличии достаточной производительности для минимизации метаданных подавления в исходном виде имя правила можно опустить. Категория правила и идентификатор его правила вместе составляют достаточно уникальный идентификатор правила. Пример:

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

Подавлять выборочные нарушения внутри тела метода

К методу могут применяться атрибуты подавления, но они не могут быть внедрены в тело метода. Это означает, что все нарушения конкретного правила подавляются при добавлении SuppressMessageAttribute атрибута в метод.

Чтобы отключить определенное нарушение правила, укажите имя символа для MessageId свойства SuppressMessageAttribute атрибута. В следующем примере показан код с двумя нарушениями CA1500: вариабленамесшаулднотматчфиелднамес — один для name переменной и другой для age переменной. Подавляется только нарушение для age символа.

Подавления на глобальном уровне

[module: SuppressMessage("Microsoft.Design", "CA1020:AvoidNamespacesWithFewTypes", Scope = "namespace", Target = "MyNamespace")]

При подавлении предупреждения с namespace областью предупреждение подавляется по самому пространству имен. Предупреждение не подавляется по типам в пространстве имен.

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

[module: SuppressMessage("Microsoft.Design", "CA1055:AbstractTypesDoNotHavePublicConstructors", Scope="member", Target="Microsoft.Tools.FxCop.Type..ctor()")]

Target всегда содержит полное имя элемента.

Файл глобального подавления

Область подавления модуля

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

Созданный код

Компиляторы управляемого кода и некоторые сторонние средства создают код для упрощения разработки кода. Созданный компилятором код, который отображается в исходных файлах, обычно отмечается GeneratedCodeAttribute атрибутом.

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

Анализ кода игнорируется GeneratedCodeAttribute при применении к целой сборке или одному параметру.

Какие параметры мне нужно изменить, чтобы вернуть привычное поведение?

Изменить: в Debug / Exceptions у меня есть опция User-unhandled для исключений CLR.

Debug->Exceptions->Check Thrown/User-Unhandled для исключений общеязыковой среды выполнения

Edit: Может быть, попробовать сделать чистую / перестроить и снова запустить? Может быть, символы отладки повреждены или что-то в этом роде ..

Я пробовал много предложений здесь, но, наконец, для меня переключение x86 / x64 помогло мне решить проблему завершения работы отладчика VS без каких-либо ошибок или исключений.

Screenshot

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

У меня до сих пор нет нигде "необработанных пользователем", которые можно было бы найти в VS 2019, но, по крайней мере, теперь это работает.

Если вы наведете курсор на точку останова и увидите предупреждение «Нет загруженных символов»,

enter image description here

Вам может потребоваться изменить конфигурацию решения с «Выпуск» на «Отладка».

enter image description here

Если в вашем решении несколько проектов веб-сайтов, убедитесь, что проект, который вы хотите отладить, активен. Щелкните его правой кнопкой мыши и выберите Установить как запускаемый проект .

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

Мне помогла смена целевой платформы с x64 на x86

Единственное, что у меня сработало, это:

Программа «[2624] MyApplication.vshost.exe» завершилась с кодом -1073741819 (0xc0000005) «Нарушение доступа».

У меня действительно нет возможности копировать все в новый проект, и ни одно из приведенных выше предложений не помогло мне. Методом проб и ошибок я нашел кое-что, что сработало: Снимите флажок «Разматывать стек вызовов при необработанных исключениях» в разделе «Параметры»> «Отладка»> «Общие»> «Включить помощника по исключениям» .

У меня была такая же проблема долгое время. В меню «Отладка-> Исключения» отсутствовал столбец «Необработанные пользователем»! Крайне раздражает.

Я удалил все свои плагины, переустановил VS, но ничего не получилось (Visual Studio, вероятно, оставила некоторые настройки на моей машине, которые она повторно использовала после переустановки).

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

В зависимости от приложения вам могут помочь следующие параметры:

Инструменты → Параметры . → Отладка → Общие

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

    [ Примечание: на основании комментариев ниже, следующий совет не сработал, а для некоторых возник вопрос, для решения которого был предназначен ответ: используйте с осторожностью . ]

    • Снимите флажок Включить только мой код ← JMC может предотвратить перехват исключений в чужом коде и / или в коде с отсутствующими символами.

    Для Visual Studio 2015:

    1.Откройте окно настроек исключений (новое в 2015 году)

    2.Проверьте все исключения CLR

    3.Если вам не нужна визуальная студия для выдачи определенных исключений, снимите этот флажок.

    Visual Studio: как отключить обработанные исключения?

    например, я хочу, чтобы отладчик остановился при исключении:

    Но они не применимы к Visual Studio 2005 (в меню « Отладка» нет опции « Исключения» ).

    Кто-нибудь знает, где находится диалоговое окно с этими параметрами в Visual Studio, что в групповом поле « Когда возникает исключение » с параметром « Взломать отладчик »?

    Обновление: проблема заключалась в том, что в моем меню « Отладка» не было пункта « Исключения» .

    Ответы

    Открыв решение, перейдите в пункт меню «Отладка - Исключения» ( Ctrl + D , E ). Оттуда вы можете выбрать разбиение на выброшенные или необработанные пользователем исключения.

    В VS2005 есть окно «исключения» . попробуйте Ctrl + Alt + E при отладке и установите флажок «Выброшено» для исключения, на котором вы хотите остановиться.

    Beginner picture

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

    Начиная с Visual Studio 2015, вы управляете тем, какие исключения следует останавливать в окне настроек исключений (Отладка-> Windows-> Настройки исключений). Ярлык по-прежнему Ctrl - Alt - E.

    Самый простой способ обработки настраиваемых исключений - выбрать «все исключения не в этом списке».

    Вот скриншот из английской версии:

    enter image description here

    Вот скриншот из немецкой версии:

    enter image description here

    Sameer Alibhai picture

    Начиная с Visual Studio 2015 и новее, вам нужно перейти в диалоговое окно «Параметры исключений» ( Ctrl + Alt + E ) и отметить «Исключения среды CLR» (или конкретный вариант, который вы хотите, например ArgumentNullException ). чтобы заставить его прерываться при обработанных исключениях.

    Guy Starbuck picture

    По сути, вот шаги (во время отладки):

    В меню «Отладка» выберите «Исключения».

    В диалоговом окне «Исключения» выберите «Выброшено» для всей категории исключений, например «Исключения среды CLR».

    Разверните узел для категории исключений, например «Исключения среды CLR», и выберите «Выброшено» для определенного исключения в этой категории.

    Я использую следующую технику. Определите глобальную переменную, которую вы можете использовать для одного или нескольких блоков try catch в зависимости от того, что вы пытаетесь отлаживать, и используйте следующую структуру:

    Я считаю, что это дает мне немного больше гибкости с точки зрения тестирования, потому что все еще есть некоторые исключения, которые я не хочу, чтобы IDE ломалась.

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

    Связанные вопросы

    Как вы автоматически форматируете код в Visual Studio?

    Ошибка «LINK: фатальная ошибка LNK1123: сбой при преобразовании в COFF: файл недействителен или поврежден» после установки Visual Studio 2012 Release Preview

    Удалять безопасные предупреждения (_CRT_SECURE_NO_WARNINGS) из проектов по умолчанию в Visual Studio

    Читайте также:

[module name="footer"]