2015-12-04 2 views
4

Я только что обновил свой VS2013, и тот же код имеет другое поведение в режиме отладки.VS2015 исключение броска поймали в DebuggerStepTrough?

В VS2013 у меня был отладочный разрыв по исключению, которое я получил.

Некоторые из них, которые могут случится и обработаны был введены в действии Try-Catch блоке с DebuggerStepTrough:

Пример:

[DebuggerStepThrough] 
private void DoSomething(){ 
    try{ 
     throw new InvalidOperationException();//Obviously in my case, it's not a throw exception here but a method 
    }catch(InvalidOperationException){ 
     //log something & handling this case 
    } 
} 


private void SomeEntryPoint(){ 
    DoSomething();//In VS2015 I got the debug breaking here. In VS2013 I don't 
} 

у меня не был таким поведения в VS2013. Есть ли способ избежать этого?

(Я на «Just My Code» включен)

+0

В VS 2015 код работает без какого-либо нарушения исключения. –

+0

Как выглядят ваши настройки исключений? 'DEBUG> Исключения ...' ('Ctrl + Alt + E') – test

+0

@test' Debug> Исключения' больше не существуют на VS2015. В окне «Исключительные настройки» у меня установлен флажок по умолчанию (я сделал «Восстановить значения по умолчанию» в окне настроек исключения). – J4N

ответ

5

Вы правильно, поведение вы описали является результатом нового performance improvement, который был введен в Visual Studio 2015. Новая функция значительно снижает отладку накладные расходы на обработку исключений clr, брошенных и пойманных в не-пользовательских модулях (с включенным только моим кодом).

К сожалению, при надзоре исключения, брошенные и пойманные в рамках функций с помощью [DebuggerHidden], [DebuggerNonUserCode] и/или [DebuggerStepThrough] атрибутов, больше не обрабатываются так, как если бы они были выброшены и пойманы внутри не-пользовательского кода - отладчик по существу игнорирует эти атрибуты в отношении исключений в Visual Studio 2015 (фильтрация по шагам и фильтрация стека вызовов по-прежнему работают так же, как и в Visual Studio 2013).

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

  1. Целевые приложение, чтобы использовать рамки .net версии < 4,0
  2. рефакторинг кода, что функции/классы с этими атрибутами отладчика в другом модуле и построить этот модуль оптимизированный и/или без символов.

Хорошая новость заключается в том, что команда Visual Studio отладчик признал проблему и обеспечит временное решение в следующем обновлении для Visual Studio 2015.

Update

обходной путь для этой проблемы доступно в Visual Studio 2015 Update 2 и подробно описано в блоге Using the DebuggerNonUserCode Attribute in Visual Studio 2015.

Для тех, кто просто хочет знать, что делать. Выполните следующее в командной строке:

reg add HKCU\Software\Microsoft\VisualStudio\14.0_Config\Debugger\Engine /v AlwaysEnableExceptionCallbacksOutsideMyCode /t REG_DWORD /d 1 
+0

Черт ... Нам нужно переустановить VS2013, тем временем у нас слишком много исключений (например, TimeoutException при попытке подключиться к некоторым устройствам, которые не доступны), которые мешают нам выполнять какую-либо отладку ... У нас есть идея, когда появится следующее обновление? У вас есть ссылка, которая указывает, что они восстановят это поведение? – J4N

+0

Это действительно отстой, что вам нужно переустановить VS 2013.И я сожалею, что нет никаких указаний на следующее обновление, и нет публичного объявления о том, что этот вопрос будет исправлен. Я попытаюсь обновить этот ответ, когда обходной путь доступен публично. – John

+0

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

Смежные вопросы