├── nuget.config
├── #assets
├── Commands.VS2010.pdn
├── Commands.VS2012.pdn
└── screenshots
│ ├── VS2012.Menu.png
│ ├── Exceptions.Set.png
│ ├── VS2012.Toolbar.png
│ ├── VS2013.Options.png
│ └── VS2012.Toolbar.NoToolTip.png
├── ExceptionBreaker
├── Screenshot.png
├── Resources
│ ├── Add.png
│ ├── Delete.png
│ ├── Package.ico
│ ├── Commands.VS2010.png
│ └── Commands.VS2012.png
├── Implementation
│ ├── IDiagnosticLogger.cs
│ ├── IExceptionListProvider.cs
│ ├── VersionSpecific
│ │ ├── IDebuggerInternalAdapter.cs
│ │ ├── VersionSpecificAdapterFactory.cs
│ │ ├── DebuggerInternal11Adapter.cs
│ │ └── DebuggerInternal10Adapter.cs
│ ├── ExtensionLogger.cs
│ ├── ExceptionBreakState.cs
│ ├── DebugSessionManager.cs
│ ├── DebugSessionEventSink.cs
│ ├── CommandController.cs
│ └── ExceptionBreakManager.cs
├── packages.config
├── CommandIDs.cs
├── ComImports
│ ├── ReadMe.txt
│ ├── BREAKPOINT_FILTER_TYPE.cs
│ ├── BREAKPOINT_EDIT_OPERATION.cs
│ ├── EBreakpointType.cs
│ ├── IMAGEINFO_TYPE.cs
│ ├── DataTipIdentity.cs
│ ├── IBreakpointEvents.cs
│ ├── DEBUGGER_STRING_OPTIONS.cs
│ ├── IDataTipEvents.cs
│ ├── IBreakpoint.cs
│ ├── IBreakpointManager.cs
│ ├── IDebuggerInternalEvents.cs
│ ├── IDataTipManager.cs
│ ├── DEBUGGER_OPTIONS.cs
│ ├── IDebuggerInternal10.cs
│ └── IDebuggerInternal11.cs
├── Options
│ ├── Support
│ │ ├── IObservableResult.cs
│ │ ├── BindingDelayExtension.cs
│ │ ├── ProperListPropertyDescriptor.cs
│ │ ├── CollectionSyncExtensions.cs
│ │ ├── ObservableValue.cs
│ │ ├── ObservableCollectionExtensions.cs
│ │ └── BindingDelay.cs
│ ├── ImprovedComponentModel
│ │ ├── PropertyDescriptorAttribute.cs
│ │ ├── ImprovedTypeDescriptorProvider.cs
│ │ ├── ImprovedTypeDescriptor.cs
│ │ └── CustomPropertyDescriptor.cs
│ ├── PatternData.cs
│ ├── RegexValidationRule.cs
│ ├── ExceptionViewModel.cs
│ ├── OptionsPageView.xaml.cs
│ ├── PatternViewModel.cs
│ ├── ProvideOptionPageInExistingCategoryAttribute.cs
│ ├── FailSafeJsonTypeConverter.cs
│ ├── OptionsPageData.cs
│ ├── PatternCollectionViewModel.cs
│ ├── OptionsViewModel.cs
│ └── OptionsPageView.xaml
├── Guids.cs
├── GlobalSuppressions.cs
├── ExceptionBreaker.2010.vsct
├── ExceptionBreaker.2012.vsct
├── Properties
│ └── AssemblyInfo.cs
├── source.extension.vsixmanifest
├── ExceptionBreaker.vsct
├── ExceptionBreakerPackage.cs
└── VSPackage.resx
├── .gitignore
├── ExceptionBreaker.OptionsUITester
├── App.config
├── Properties
│ ├── Settings.settings
│ ├── Settings.Designer.cs
│ ├── AssemblyInfo.cs
│ ├── Resources.Designer.cs
│ └── Resources.resx
├── App.xaml
├── MainWindow.xaml
├── App.xaml.cs
├── MainWindow.xaml.cs
└── ExceptionBreaker.OptionsUITester.csproj
├── ExceptionBreaker.Tests.Unit
├── packages.config
├── CollectionSyncExtensionsTests.cs
├── MoqExtensions.cs
├── Properties
│ └── AssemblyInfo.cs
├── PatternViewModelTests.cs
├── PatternCollectionViewModelTests.cs
├── OptionsPageDataTests.cs
└── ExceptionBreaker.Tests.Unit.csproj
├── #testing
├── ExceptionTest.LibraryOnly
│ ├── ExceptionTest.LibraryOnly.sln
│ ├── Properties
│ │ └── AssemblyInfo.cs
│ └── ExceptionTest.Library.csproj
├── ExceptionTest
│ ├── ExceptionTest
│ │ ├── Program.cs
│ │ ├── Properties
│ │ │ └── AssemblyInfo.cs
│ │ └── ExceptionTest.csproj
│ └── ExceptionTest.sln
└── ExceptionTest.VS2013
│ ├── ExceptionTest
│ ├── Program.cs
│ ├── Properties
│ │ └── AssemblyInfo.cs
│ └── ExceptionTest.csproj
│ └── ExceptionTest.sln
├── readme.md
├── ExceptionBreaker.sln.DotSettings
└── ExceptionBreaker.sln
/nuget.config:
--------------------------------------------------------------------------------
1 |
2 | #packages
3 |
--------------------------------------------------------------------------------
/#assets/Commands.VS2010.pdn:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/madskristensen/ExceptionBreaker/master/#assets/Commands.VS2010.pdn
--------------------------------------------------------------------------------
/#assets/Commands.VS2012.pdn:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/madskristensen/ExceptionBreaker/master/#assets/Commands.VS2012.pdn
--------------------------------------------------------------------------------
/ExceptionBreaker/Screenshot.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/madskristensen/ExceptionBreaker/master/ExceptionBreaker/Screenshot.png
--------------------------------------------------------------------------------
/ExceptionBreaker/Resources/Add.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/madskristensen/ExceptionBreaker/master/ExceptionBreaker/Resources/Add.png
--------------------------------------------------------------------------------
/#assets/screenshots/VS2012.Menu.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/madskristensen/ExceptionBreaker/master/#assets/screenshots/VS2012.Menu.png
--------------------------------------------------------------------------------
/ExceptionBreaker/Resources/Delete.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/madskristensen/ExceptionBreaker/master/ExceptionBreaker/Resources/Delete.png
--------------------------------------------------------------------------------
/#assets/screenshots/Exceptions.Set.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/madskristensen/ExceptionBreaker/master/#assets/screenshots/Exceptions.Set.png
--------------------------------------------------------------------------------
/#assets/screenshots/VS2012.Toolbar.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/madskristensen/ExceptionBreaker/master/#assets/screenshots/VS2012.Toolbar.png
--------------------------------------------------------------------------------
/#assets/screenshots/VS2013.Options.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/madskristensen/ExceptionBreaker/master/#assets/screenshots/VS2013.Options.png
--------------------------------------------------------------------------------
/ExceptionBreaker/Resources/Package.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/madskristensen/ExceptionBreaker/master/ExceptionBreaker/Resources/Package.ico
--------------------------------------------------------------------------------
/ExceptionBreaker/Resources/Commands.VS2010.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/madskristensen/ExceptionBreaker/master/ExceptionBreaker/Resources/Commands.VS2010.png
--------------------------------------------------------------------------------
/ExceptionBreaker/Resources/Commands.VS2012.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/madskristensen/ExceptionBreaker/master/ExceptionBreaker/Resources/Commands.VS2012.png
--------------------------------------------------------------------------------
/#assets/screenshots/VS2012.Toolbar.NoToolTip.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/madskristensen/ExceptionBreaker/master/#assets/screenshots/VS2012.Toolbar.NoToolTip.png
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 |
2 | bin/
3 | obj/
4 | \#packages/
5 | *.suo
6 | *.psess
7 | *.vsp
8 | _ReSharper.*
9 | *.user
10 | *.snk
11 | *.ncrunchsolution
12 |
--------------------------------------------------------------------------------
/ExceptionBreaker.OptionsUITester/App.config:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/ExceptionBreaker/Implementation/IDiagnosticLogger.cs:
--------------------------------------------------------------------------------
1 | namespace ExceptionBreaker.Implementation {
2 | public interface IDiagnosticLogger {
3 | void WriteLine(string message);
4 | void WriteLine(string format, params object[] args);
5 | }
6 | }
--------------------------------------------------------------------------------
/ExceptionBreaker.OptionsUITester/Properties/Settings.settings:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
--------------------------------------------------------------------------------
/ExceptionBreaker/Implementation/IExceptionListProvider.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Collections.Generic;
3 |
4 | namespace ExceptionBreaker.Implementation {
5 | public interface IExceptionListProvider {
6 | event EventHandler ExceptionNamesChanged;
7 | IEnumerable GetExceptionNames();
8 | }
9 | }
--------------------------------------------------------------------------------
/ExceptionBreaker/packages.config:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/ExceptionBreaker/CommandIDs.cs:
--------------------------------------------------------------------------------
1 | // PkgCmdID.cs
2 | // MUST match PkgCmdID.h
3 |
4 | using System;
5 | using System.ComponentModel.Design;
6 |
7 | namespace ExceptionBreaker {
8 | internal static class CommandIDs {
9 | public static readonly CommandID BreakOn = new CommandID(GuidList.CommandSet, 0x100);
10 | };
11 | }
--------------------------------------------------------------------------------
/ExceptionBreaker/ComImports/ReadMe.txt:
--------------------------------------------------------------------------------
1 | This folder contains manual COM imports from Microsoft.VisualStudio.Debugger.Interop.Internal.
2 | I do not reference this assembly because it creates certain definition conflicts with Microsoft.VisualStudio.Debugger.Interop.
3 |
4 | This is not the whole list of APIs available in Internal assembly -- if you need something else please take a look at it.
--------------------------------------------------------------------------------
/ExceptionBreaker.OptionsUITester/App.xaml:
--------------------------------------------------------------------------------
1 |
5 |
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/ExceptionBreaker/ComImports/BREAKPOINT_FILTER_TYPE.cs:
--------------------------------------------------------------------------------
1 | // ReSharper disable CheckNamespace
2 | namespace Microsoft.VisualStudio.Debugger.Interop.Internal {
3 | // ReSharper restore CheckNamespace
4 | public enum BREAKPOINT_FILTER_TYPE {
5 | NONE,
6 | IS_ENABLED,
7 | IS_CONDITION,
8 | IS_HIT_COUNT,
9 | IS_CONSTRAINTS,
10 | IS_ACTION
11 | }
12 | }
--------------------------------------------------------------------------------
/ExceptionBreaker.OptionsUITester/MainWindow.xaml:
--------------------------------------------------------------------------------
1 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/ExceptionBreaker/ComImports/BREAKPOINT_EDIT_OPERATION.cs:
--------------------------------------------------------------------------------
1 | // ReSharper disable CheckNamespace
2 | namespace Microsoft.VisualStudio.Debugger.Interop.Internal {
3 | // ReSharper restore CheckNamespace
4 | public enum BREAKPOINT_EDIT_OPERATION {
5 | Edit_Location,
6 | Edit_Condition,
7 | Edit_HitCount,
8 | Edit_Constraint,
9 | Edit_Action,
10 | Edit_Labels,
11 | Edit_Export
12 | }
13 | }
--------------------------------------------------------------------------------
/ExceptionBreaker.OptionsUITester/App.xaml.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Collections.Generic;
3 | using System.Configuration;
4 | using System.Data;
5 | using System.Linq;
6 | using System.Threading.Tasks;
7 | using System.Windows;
8 |
9 | namespace ExceptionBreaker.OptionsUITester {
10 | ///
11 | /// Interaction logic for App.xaml
12 | ///
13 | public partial class App : Application {
14 | }
15 | }
16 |
--------------------------------------------------------------------------------
/ExceptionBreaker/ComImports/EBreakpointType.cs:
--------------------------------------------------------------------------------
1 | // ReSharper disable CheckNamespace
2 | namespace Microsoft.VisualStudio.Debugger.Interop.Internal {
3 | // ReSharper restore CheckNamespace
4 | public enum EBreakpointType {
5 | NoBreakpointType,
6 | PendingBreakpoint,
7 | BoundBreakpoint,
8 | ErrorBreakpoint,
9 | WarningBreakpoint,
10 | BreakpointGroup,
11 | EBreakpointType_LAST
12 | }
13 | }
--------------------------------------------------------------------------------
/ExceptionBreaker.Tests.Unit/packages.config:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/ExceptionBreaker/Options/Support/IObservableResult.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Collections.Generic;
3 | using System.ComponentModel;
4 |
5 | namespace ExceptionBreaker.Options.Support {
6 | public interface IObservableResult : INotifyPropertyChanged {
7 | event EventHandler ValueChanged;
8 | T Value { get; }
9 | IObservableResult GetObservable(Func get, Action subscribeExtra = null);
10 | }
11 | }
12 |
--------------------------------------------------------------------------------
/ExceptionBreaker/Options/ImprovedComponentModel/PropertyDescriptorAttribute.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Collections.Generic;
3 |
4 | namespace ExceptionBreaker.Options.ImprovedComponentModel {
5 | public class PropertyDescriptorAttribute : Attribute {
6 | public Type PropertyDescriptorType { get; private set; }
7 |
8 | public PropertyDescriptorAttribute(Type propertyDescriptorType) {
9 | PropertyDescriptorType = propertyDescriptorType;
10 | }
11 | }
12 | }
13 |
--------------------------------------------------------------------------------
/ExceptionBreaker/Implementation/VersionSpecific/IDebuggerInternalAdapter.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Collections.Generic;
3 | using System.Linq;
4 | using Microsoft.VisualStudio.Debugger.Interop;
5 |
6 | namespace ExceptionBreaker.Implementation.VersionSpecific {
7 | public interface IDebuggerInternalAdapter {
8 | IDebugSession3 CurrentSession { get; }
9 | int RegisterInternalEventSink(DebugSessionEventSink eventSink);
10 | int UnregisterInternalEventSink(DebugSessionEventSink eventSink);
11 | }
12 | }
13 |
--------------------------------------------------------------------------------
/ExceptionBreaker/ComImports/IMAGEINFO_TYPE.cs:
--------------------------------------------------------------------------------
1 | // ReSharper disable CheckNamespace
2 | namespace Microsoft.VisualStudio.Debugger.Interop.Internal {
3 | // ReSharper restore CheckNamespace
4 | public enum IMAGEINFO_TYPE {
5 | IMAGEINFO_ANYCPU_PLATFORM = 0x10,
6 | IMAGEINFO_CONSOLE_APPLICATION = 1,
7 | IMAGEINFO_INTEROP_APPLICATION = 8,
8 | IMAGEINFO_MANAGED_APPLICATION = 4,
9 | IMAGEINFO_NATIVE_APPLICATION = 2,
10 | IMAGEINFO_X64_PLATFORM = 0x40,
11 | IMAGEINFO_X86_PLATFORM = 0x20
12 | }
13 | }
--------------------------------------------------------------------------------
/ExceptionBreaker/Guids.cs:
--------------------------------------------------------------------------------
1 | // Guids.cs
2 | // MUST match guids.h
3 |
4 | using System;
5 |
6 | namespace ExceptionBreaker
7 | {
8 | internal static class GuidList
9 | {
10 | public const string PackageString = "a83e8a33-e775-4a79-be41-efe20007eebd";
11 | public const string CommandSetString = "9d55da8f-2be1-44dc-a94a-08154f98f634";
12 |
13 | public static readonly Guid CommandSet = new Guid(CommandSetString);
14 | public static readonly Guid OutputPane = new Guid("fb57af1a-e1f6-4a87-97f6-0b1d4add8e24");
15 | };
16 | }
--------------------------------------------------------------------------------
/ExceptionBreaker/ComImports/DataTipIdentity.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Collections.Generic;
3 | using System.Linq;
4 | using System.Runtime.InteropServices;
5 | using System.Text;
6 |
7 | // ReSharper disable CheckNamespace
8 | namespace Microsoft.VisualStudio.Debugger.Interop.Internal {
9 | // ReSharper restore CheckNamespace
10 | [StructLayout(LayoutKind.Sequential, Pack = 8)]
11 | public struct DataTipIdentity {
12 | [MarshalAs(UnmanagedType.BStr)]
13 | public string moniker;
14 | public uint position;
15 | }
16 | }
17 |
--------------------------------------------------------------------------------
/ExceptionBreaker/ComImports/IBreakpointEvents.cs:
--------------------------------------------------------------------------------
1 | using System.Runtime.CompilerServices;
2 | using System.Runtime.InteropServices;
3 |
4 | // ReSharper disable CheckNamespace
5 | namespace Microsoft.VisualStudio.Debugger.Interop.Internal {
6 | // ReSharper restore CheckNamespace
7 | [ComImport, Guid("405E9EA6-4CD0-404C-927F-477BF8E09696"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
8 | public interface IBreakpointEvents {
9 | [PreserveSig, MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
10 | int Changed();
11 | }
12 | }
--------------------------------------------------------------------------------
/ExceptionBreaker/Options/Support/BindingDelayExtension.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Collections.Generic;
3 | using System.Linq;
4 | using System.Text;
5 | using System.Windows;
6 | using System.Windows.Markup;
7 |
8 | namespace ExceptionBreaker.Options.Support {
9 | public class BindingDelayExtension : MarkupExtension {
10 | public override object ProvideValue(IServiceProvider serviceProvider) {
11 | return new[] { new BindingDelay(Property, TimeSpan.FromMilliseconds(Delay)) };
12 | }
13 |
14 | public DependencyProperty Property { get; set; }
15 | public int Delay { get; set; }
16 | }
17 | }
18 |
--------------------------------------------------------------------------------
/ExceptionBreaker/GlobalSuppressions.cs:
--------------------------------------------------------------------------------
1 | // This file is used by Code Analysis to maintain SuppressMessage
2 | // attributes that are applied to this project. Project-level
3 | // suppressions either have no target or are given a specific target
4 | // and scoped to a namespace, type, member, etc.
5 | //
6 | // To add a suppression to this file, right-click the message in the
7 | // Error List, point to "Suppress Message(s)", and click "In Project
8 | // Suppression File". You do not need to add suppressions to this
9 | // file manually.
10 |
11 | [assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1017:MarkAssembliesWithComVisible")]
12 |
--------------------------------------------------------------------------------
/ExceptionBreaker/ExceptionBreaker.2010.vsct:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
--------------------------------------------------------------------------------
/ExceptionBreaker/ExceptionBreaker.2012.vsct:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
--------------------------------------------------------------------------------
/ExceptionBreaker/Options/PatternData.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Collections.Generic;
3 | using System.Text.RegularExpressions;
4 |
5 | namespace ExceptionBreaker.Options {
6 | public class PatternData {
7 | private Regex _regex;
8 |
9 | public PatternData(Regex regex) {
10 | Argument.NotNull("regex", regex);
11 | Regex = regex;
12 | Enabled = true;
13 | }
14 |
15 | public bool Enabled { get; set; }
16 | public Regex Regex {
17 | get { return _regex; }
18 | set { _regex = Argument.NotNull("value", value); }
19 | }
20 |
21 | public bool Matches(string name) {
22 | return Enabled && Regex.IsMatch(name);
23 | }
24 | }
25 | }
26 |
--------------------------------------------------------------------------------
/ExceptionBreaker/Options/RegexValidationRule.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Collections.Generic;
3 | using System.Globalization;
4 | using System.Text.RegularExpressions;
5 | using System.Windows.Controls;
6 |
7 | namespace ExceptionBreaker.Options {
8 | public class RegexValidationRule : ValidationRule {
9 | public override ValidationResult Validate(object value, CultureInfo cultureInfo) {
10 | var @string = (string)value;
11 | try {
12 | new Regex(@string);
13 | }
14 | catch (ArgumentException ex) {
15 | // https://connect.microsoft.com/VisualStudio/feedback/details/331753/regex-should-have-a-static-tryparse-method
16 | return new ValidationResult(false, ex.Message);
17 | }
18 | return ValidationResult.ValidResult;
19 | }
20 | }
21 | }
22 |
--------------------------------------------------------------------------------
/ExceptionBreaker.OptionsUITester/MainWindow.xaml.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Collections.Generic;
3 | using System.Windows;
4 | using ExceptionBreaker.Options;
5 | using ExceptionBreaker.Options.Support;
6 |
7 | namespace ExceptionBreaker.OptionsUITester {
8 | ///
9 | /// Interaction logic for MainWindow.xaml
10 | ///
11 | public partial class MainWindow : Window {
12 | public MainWindow() {
13 | InitializeComponent();
14 | view.Model = new OptionsViewModel(
15 | new OptionsPageData(),
16 | new ObservableValue>(new string[] {
17 | "System.Exception",
18 | "System.ArgumentException",
19 | "System.NullReferenceException",
20 | "System.IO.IOException"
21 | })
22 | );
23 | }
24 | }
25 | }
26 |
--------------------------------------------------------------------------------
/ExceptionBreaker/Options/ImprovedComponentModel/ImprovedTypeDescriptorProvider.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Collections.Generic;
3 | using System.ComponentModel;
4 |
5 | namespace ExceptionBreaker.Options.ImprovedComponentModel {
6 | public class ImprovedTypeDescriptorProvider : TypeDescriptionProvider {
7 | public ImprovedTypeDescriptorProvider(TypeDescriptionProvider parent) : base(parent) {
8 | }
9 |
10 | public override ICustomTypeDescriptor GetTypeDescriptor(Type objectType, object instance) {
11 | return new ImprovedTypeDescriptor(base.GetTypeDescriptor(objectType, instance));
12 | }
13 |
14 | public static void RegisterFor(Type type) {
15 | var provider = TypeDescriptor.GetProvider(type);
16 | if (provider is ImprovedTypeDescriptorProvider)
17 | return;
18 |
19 | TypeDescriptor.AddProvider(new ImprovedTypeDescriptorProvider(provider), type);
20 | }
21 | }
22 | }
23 |
--------------------------------------------------------------------------------
/ExceptionBreaker/ComImports/DEBUGGER_STRING_OPTIONS.cs:
--------------------------------------------------------------------------------
1 | // ReSharper disable CheckNamespace
2 | namespace Microsoft.VisualStudio.Debugger.Interop.Internal {
3 | // ReSharper restore CheckNamespace
4 | public enum DEBUGGER_STRING_OPTIONS {
5 | StringOption_SourceServerExtractToDirectory,
6 | StringOption_FrameworkSourceServerName,
7 | StringOption_PublicSymbolServerName,
8 | StringOption_PublicSymbolServerName2,
9 | StringOption_DefaultTracepointMessage,
10 | StringOption_ProgramToDebugPath,
11 | StringOption_AttachToProcessDefaultEngineList,
12 | StringOption_SecureSourceLocalDirectory,
13 | StringOption_SymbolPath,
14 | StringOption_SymbolPathState,
15 | StringOption_SymbolCacheDir,
16 | StringOption_SymbolIncludeList,
17 | StringOption_SymbolIncludeListState,
18 | StringOption_SymbolExcludeList,
19 | StringOption_SymbolExcludeListState,
20 | LastStringOption
21 | }
22 | }
--------------------------------------------------------------------------------
/ExceptionBreaker/Implementation/ExtensionLogger.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Collections.Generic;
3 | using System.Diagnostics;
4 | using Microsoft.VisualStudio.Shell.Interop;
5 |
6 | namespace ExceptionBreaker.Implementation {
7 | public class ExtensionLogger : IDiagnosticLogger {
8 | private readonly IVsOutputWindowPane _outputPane;
9 | private readonly string _traceCategory;
10 |
11 | public ExtensionLogger(string name, Func getOutputPane) {
12 | _outputPane = getOutputPane("Ext: " + name + " (Diagnostic)");
13 | _traceCategory = name;
14 | }
15 |
16 | public void WriteLine(string message) {
17 | _outputPane.OutputString(message + Environment.NewLine);
18 | Trace.WriteLine(message, _traceCategory);
19 | }
20 |
21 | public void WriteLine(string format, params object[] args) {
22 | WriteLine(string.Format(format, args));
23 | }
24 | }
25 | }
26 |
--------------------------------------------------------------------------------
/ExceptionBreaker/Options/Support/ProperListPropertyDescriptor.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Collections;
3 | using System.Collections.Generic;
4 | using System.ComponentModel;
5 | using ExceptionBreaker.Options.ImprovedComponentModel;
6 |
7 | namespace ExceptionBreaker.Options.Support {
8 | public class ProperListPropertyDescriptor : CustomPropertyDescriptor {
9 | public ProperListPropertyDescriptor(PropertyDescriptor parent) : base(parent) {
10 | }
11 |
12 | public override bool IsReadOnly {
13 | get { return false; }
14 | }
15 |
16 | public override void SetValue(object component, object value) {
17 | var list = (IList)base.GetValue(component);
18 | var newList = (IEnumerable)value;
19 |
20 | list.Clear();
21 | if (newList == null)
22 | return;
23 |
24 | foreach (var item in newList) {
25 | list.Add(item);
26 | }
27 | }
28 | }
29 | }
30 |
--------------------------------------------------------------------------------
/#testing/ExceptionTest.LibraryOnly/ExceptionTest.LibraryOnly.sln:
--------------------------------------------------------------------------------
1 |
2 | Microsoft Visual Studio Solution File, Format Version 11.00
3 | # Visual Studio 2010
4 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ExceptionTest.Library", "ExceptionTest.Library.csproj", "{14602900-B8C2-4BFE-BB5D-CCD173213092}"
5 | EndProject
6 | Global
7 | GlobalSection(SolutionConfigurationPlatforms) = preSolution
8 | Debug|Any CPU = Debug|Any CPU
9 | Release|Any CPU = Release|Any CPU
10 | EndGlobalSection
11 | GlobalSection(ProjectConfigurationPlatforms) = postSolution
12 | {14602900-B8C2-4BFE-BB5D-CCD173213092}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
13 | {14602900-B8C2-4BFE-BB5D-CCD173213092}.Debug|Any CPU.Build.0 = Debug|Any CPU
14 | {14602900-B8C2-4BFE-BB5D-CCD173213092}.Release|Any CPU.ActiveCfg = Release|Any CPU
15 | {14602900-B8C2-4BFE-BB5D-CCD173213092}.Release|Any CPU.Build.0 = Release|Any CPU
16 | EndGlobalSection
17 | GlobalSection(SolutionProperties) = preSolution
18 | HideSolutionNode = FALSE
19 | EndGlobalSection
20 | EndGlobal
21 |
--------------------------------------------------------------------------------
/ExceptionBreaker/Implementation/VersionSpecific/VersionSpecificAdapterFactory.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Collections.Generic;
3 | using System.Linq;
4 | using EnvDTE;
5 | using Microsoft.VisualStudio.Debugger.Interop.Internal;
6 |
7 | namespace ExceptionBreaker.Implementation.VersionSpecific {
8 | public class VersionSpecificAdapterFactory {
9 | private readonly Version _version;
10 |
11 | public VersionSpecificAdapterFactory(DTE dte) {
12 | _version = new Version(dte.Version);
13 | }
14 |
15 | public IDebuggerInternalAdapter AdaptDebuggerInternal(object debugger) {
16 | if (_version.Major >= 11)
17 | return new DebuggerInternal11Adapter((IDebuggerInternal11)debugger);
18 |
19 | if (_version.Major == 10)
20 | return new DebuggerInternal10Adapter((IDebuggerInternal10)debugger);
21 |
22 | throw new NotSupportedException("Visual Studio version " + _version + " is not supported.");
23 | }
24 | }
25 | }
26 |
--------------------------------------------------------------------------------
/ExceptionBreaker/Implementation/ExceptionBreakState.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Collections.Generic;
3 | using System.Linq;
4 |
5 | namespace ExceptionBreaker.Implementation {
6 | public enum ExceptionBreakState {
7 | ///
8 | /// Either the session was not available yet, or the session does not have any exceptions *set*,
9 | /// whatever this means (not the same thing as *set to do not break*).
10 | ///
11 | Unknown,
12 |
13 | ///
14 | /// Some exception breaks are set, but not on all of them. This state is inferred, but can not be
15 | /// set by the user.
16 | ///
17 | Inconclusive,
18 |
19 | ///
20 | /// Break on all managed exceptions. This state can be set by the user.
21 | ///
22 | BreakOnAll,
23 |
24 | ///
25 | /// Do not break on any managed exceptions. This state can be st by the user.
26 | ///
27 | BreakOnNone
28 | }
29 | }
30 |
--------------------------------------------------------------------------------
/ExceptionBreaker/Implementation/VersionSpecific/DebuggerInternal11Adapter.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Collections.Generic;
3 | using System.Linq;
4 | using Microsoft.VisualStudio.Debugger.Interop;
5 | using Microsoft.VisualStudio.Debugger.Interop.Internal;
6 |
7 | namespace ExceptionBreaker.Implementation.VersionSpecific {
8 | public class DebuggerInternal11Adapter : IDebuggerInternalAdapter {
9 | private readonly IDebuggerInternal11 _debugger;
10 |
11 | public DebuggerInternal11Adapter(IDebuggerInternal11 debugger) {
12 | _debugger = debugger;
13 | }
14 |
15 | public IDebugSession3 CurrentSession {
16 | get { return _debugger.CurrentSession; }
17 | }
18 |
19 | public int RegisterInternalEventSink(DebugSessionEventSink pEvents) {
20 | return _debugger.RegisterInternalEventSink(pEvents);
21 | }
22 |
23 | public int UnregisterInternalEventSink(DebugSessionEventSink pEvents) {
24 | return _debugger.UnregisterInternalEventSink(pEvents);
25 | }
26 | }
27 | }
28 |
--------------------------------------------------------------------------------
/ExceptionBreaker/Implementation/VersionSpecific/DebuggerInternal10Adapter.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Collections.Generic;
3 | using System.Linq;
4 | using Microsoft.VisualStudio.Debugger.Interop;
5 | using Microsoft.VisualStudio.Debugger.Interop.Internal;
6 |
7 | namespace ExceptionBreaker.Implementation.VersionSpecific {
8 | public class DebuggerInternal10Adapter : IDebuggerInternalAdapter {
9 | private readonly IDebuggerInternal10 _debugger;
10 |
11 | public DebuggerInternal10Adapter(IDebuggerInternal10 debugger) {
12 | _debugger = debugger;
13 | }
14 |
15 | public IDebugSession3 CurrentSession {
16 | get { return _debugger.CurrentSession; }
17 | }
18 |
19 | public int RegisterInternalEventSink(DebugSessionEventSink pEvents) {
20 | return _debugger.RegisterInternalEventSink(pEvents);
21 | }
22 |
23 | public int UnregisterInternalEventSink(DebugSessionEventSink pEvents) {
24 | return _debugger.UnregisterInternalEventSink(pEvents);
25 | }
26 | }
27 | }
28 |
--------------------------------------------------------------------------------
/ExceptionBreaker/Properties/AssemblyInfo.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Reflection;
3 | using System.Resources;
4 | using System.Runtime.InteropServices;
5 |
6 | // General Information about an assembly is controlled through the following
7 | // set of attributes. Change these attribute values to modify the information
8 | // associated with an assembly.
9 | [assembly: AssemblyTitle("ExceptionBreaker")]
10 | [assembly: AssemblyCompany("Andrey Shchekin")]
11 | [assembly: AssemblyProduct("ExceptionBreaker")]
12 | [assembly: AssemblyCopyright("(c) 2013 Andrey Shchekin")]
13 | [assembly: ComVisible(false)]
14 | [assembly: CLSCompliant(false)]
15 | [assembly: NeutralResourcesLanguage("en-US")]
16 |
17 | // Version information for an assembly consists of the following four values:
18 | //
19 | // Major Version
20 | // Minor Version
21 | // Build Number
22 | // Revision
23 | //
24 | // You can specify all the values or you can default the Revision and Build Numbers
25 | // by using the '*' as shown below:
26 |
27 | [assembly: AssemblyVersion("1.0.5.0")]
28 | [assembly: AssemblyFileVersion("1.0.5.0")]
--------------------------------------------------------------------------------
/ExceptionBreaker/Options/ExceptionViewModel.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using ExceptionBreaker.Options.Support;
3 |
4 | namespace ExceptionBreaker.Options {
5 | public class ExceptionViewModel {
6 | public ExceptionViewModel(string name, ObservableValue selected) {
7 | Name = name;
8 | MatchesSelected = selected.GetObservable(
9 | s => s != null && !s.IsEmpty.Value && s.Data.Matches(name),
10 | (newItem, oldItem, changed) => {
11 | var handler = (EventHandler)delegate { changed(); };
12 | if (oldItem != null) {
13 | oldItem.Pattern.ValueChanged -= handler;
14 | oldItem.Enabled.ValueChanged -= handler;
15 | }
16 |
17 | if (newItem != null) {
18 | newItem.Pattern.ValueChanged += handler;
19 | newItem.Enabled.ValueChanged += handler;
20 | }
21 | }
22 | );
23 | }
24 |
25 | public string Name { get; private set; }
26 | public IObservableResult MatchesSelected { get; private set; }
27 | }
28 | }
--------------------------------------------------------------------------------
/ExceptionBreaker.OptionsUITester/Properties/Settings.Designer.cs:
--------------------------------------------------------------------------------
1 | //------------------------------------------------------------------------------
2 | //
3 | // This code was generated by a tool.
4 | // Runtime Version:4.0.30319.34014
5 | //
6 | // Changes to this file may cause incorrect behavior and will be lost if
7 | // the code is regenerated.
8 | //
9 | //------------------------------------------------------------------------------
10 |
11 | namespace ExceptionBreaker.OptionsUITester.Properties {
12 |
13 |
14 | [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
15 | [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "11.0.0.0")]
16 | internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase {
17 |
18 | private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings())));
19 |
20 | public static Settings Default {
21 | get {
22 | return defaultInstance;
23 | }
24 | }
25 | }
26 | }
27 |
--------------------------------------------------------------------------------
/ExceptionBreaker.Tests.Unit/CollectionSyncExtensionsTests.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Collections.Generic;
3 | using System.Linq;
4 | using ExceptionBreaker.Options.Support;
5 | using Xunit;
6 | using Xunit.Extensions;
7 |
8 | namespace ExceptionBreaker.Tests.Unit {
9 | public class CollectionSyncExtensionsTests {
10 | [Theory]
11 | [InlineData("1*,2,3*", "", "1*,3*")]
12 | [InlineData("1,2*,3", "", "2*")]
13 | [InlineData("1,2,3", "", "")]
14 | [InlineData("1,2*,3*,4", "2*,3*,4", "2*,3*")]
15 | [InlineData("1*,2,3", "2,3", "1*")]
16 | [InlineData("1*,2,3", "", "1*")]
17 | [InlineData("1,2,3", "1,2,3", "")]
18 | public void SyncToWhere_ProducesCorrectCollection(string source, string target, string expected) {
19 | var targetList = SplitToList(target);
20 | SplitToList(source).SyncToWhere(targetList, s => s.EndsWith("*"));
21 |
22 | Assert.Equal(SplitToList(expected), targetList);
23 | }
24 |
25 | private static IList SplitToList(string target) {
26 | return target.Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries).ToList();
27 | }
28 | }
29 | }
30 |
--------------------------------------------------------------------------------
/#testing/ExceptionTest/ExceptionTest/Program.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Collections.Generic;
3 | using System.Linq;
4 |
5 | namespace ExceptionTest
6 | {
7 | public static class Program
8 | {
9 | public static void Main(string[] args) {
10 | if (args.Length == 0 || args[0] != "noloop")
11 | StandaloneExceptionLoop();
12 |
13 | FirstChanceException();
14 |
15 | // second chance
16 | //throw new ArgumentException();
17 | }
18 |
19 | private static void StandaloneExceptionLoop() {
20 | Console.WriteLine("Press any key to get an exception.");
21 | while (true) {
22 | Console.ReadKey();
23 | FirstChanceException();
24 | Console.WriteLine(" Exception thrown.");
25 | }
26 | }
27 |
28 | private static void FirstChanceException()
29 | {
30 | // first chance
31 | try
32 | {
33 | throw new ArgumentException();
34 | }
35 | catch (Exception)
36 | {
37 | // do nothing
38 | }
39 | }
40 | }
41 | }
42 |
--------------------------------------------------------------------------------
/ExceptionBreaker.Tests.Unit/MoqExtensions.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Collections.Generic;
3 | using System.Reflection;
4 | using Moq.Language;
5 | using Moq.Language.Flow;
6 |
7 | namespace ExceptionBreaker.Tests.Unit {
8 | public static class MoqExtensions {
9 | public delegate void ActionOut2(T1 arg1, out T2 arg2);
10 |
11 | public static IReturnsThrows Callback(this ICallback mock, ActionOut2 action)
12 | where TMock : class
13 | {
14 | return mock.Callback((Delegate)action);
15 | }
16 |
17 | public static IReturnsThrows Callback(this ICallback mock, Delegate @delegate)
18 | where TMock : class {
19 | mock.GetType()
20 | .Assembly.GetType("Moq.MethodCall")
21 | .InvokeMember("SetCallbackWithArguments",
22 | BindingFlags.InvokeMethod | BindingFlags.NonPublic | BindingFlags.Instance,
23 | null, mock, new object[] { @delegate }
24 | );
25 | return (IReturnsThrows)mock;
26 | }
27 | }
28 | }
29 |
--------------------------------------------------------------------------------
/#testing/ExceptionTest.VS2013/ExceptionTest/Program.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Collections.Generic;
3 | using System.Linq;
4 |
5 | namespace ExceptionTest
6 | {
7 | public static class Program
8 | {
9 | public static void Main(string[] args) {
10 | if (args.Length == 0 || args[0] != "noloop")
11 | StandaloneExceptionLoop();
12 |
13 | FirstChanceException();
14 |
15 | // second chance
16 | //throw new ArgumentException();
17 | }
18 |
19 | private static void StandaloneExceptionLoop() {
20 | Console.WriteLine("Press any key to get an exception.");
21 | while (true) {
22 | Console.ReadKey();
23 | FirstChanceException();
24 | Console.WriteLine(" Exception thrown.");
25 | }
26 | }
27 |
28 | private static void FirstChanceException()
29 | {
30 | // first chance
31 | try
32 | {
33 | throw new ArgumentException();
34 | }
35 | catch (Exception)
36 | {
37 | // do nothing
38 | }
39 | }
40 | }
41 | }
42 |
--------------------------------------------------------------------------------
/ExceptionBreaker/Options/OptionsPageView.xaml.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Collections.Generic;
3 | using System.Windows;
4 | using System.Windows.Controls;
5 | using System.Windows.Data;
6 | using Microsoft.VisualStudio.PlatformUI;
7 |
8 | namespace ExceptionBreaker.Options {
9 | // This is not 'proper' WPF -- but I find it hard to spend any more
10 | // time remembering WPF when I am planning to avoid using it wherever
11 | // possible.
12 | public partial class OptionsPageView : UserControl {
13 | public OptionsPageView() {
14 | InitializeComponent();
15 | }
16 |
17 | public OptionsViewModel Model {
18 | get { return (OptionsViewModel)DataContext; }
19 | set { DataContext = value; }
20 | }
21 |
22 | private void textPattern_OnGotFocus(object sender, RoutedEventArgs e) {
23 | var item = ((UIElement)sender).FindAncestor();
24 | item.IsSelected = true;
25 | }
26 |
27 | private void buttonAdd_Click(object sender, RoutedEventArgs e) {
28 | Model.IgnoredPatterns.AddNew();
29 | }
30 |
31 | private void buttonDelete_Click(object sender, RoutedEventArgs e) {
32 | Model.IgnoredPatterns.DeleteSelected();
33 | }
34 | }
35 | }
36 |
--------------------------------------------------------------------------------
/ExceptionBreaker/Options/PatternViewModel.cs:
--------------------------------------------------------------------------------
1 | using System.Text.RegularExpressions;
2 | using System.Windows.Data;
3 | using ExceptionBreaker.Options.Support;
4 |
5 | namespace ExceptionBreaker.Options {
6 | public class PatternViewModel {
7 | public PatternViewModel(PatternData data) {
8 | Data = data;
9 | Pattern = new ObservableValue(data.Regex.ToString());
10 | Enabled = new ObservableValue(data.Enabled);
11 | IsEmpty = Pattern.GetObservable(string.IsNullOrEmpty);
12 |
13 | Enabled.PropertyChanged += (sender, e) => {
14 | data.Enabled = ((ObservableValue)sender).Value;
15 | };
16 | Pattern.PropertyChanged += (sender, e) => {
17 | var pattern = ((ObservableValue) sender).Value;
18 | if (string.IsNullOrEmpty(pattern))
19 | return;
20 |
21 | data.Regex = new Regex(pattern);
22 | };
23 |
24 | }
25 |
26 | public PatternViewModel(string pattern) : this(new PatternData(new Regex(pattern))) {
27 | }
28 |
29 | public PatternData Data { get; private set; }
30 | public ObservableValue Pattern { get; private set; }
31 | public ObservableValue Enabled { get; private set; }
32 | public IObservableResult IsEmpty { get; private set; }
33 | }
34 | }
--------------------------------------------------------------------------------
/ExceptionBreaker/Options/Support/CollectionSyncExtensions.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Collections.Generic;
3 |
4 | namespace ExceptionBreaker.Options.Support {
5 | public static class CollectionSyncExtensions {
6 | public static void SyncToWhere(this IList source, IList target, Func predicate) {
7 | var offset = 0;
8 | for (var i = 0; i < target.Count; i++) {
9 | var targetItem = target[i];
10 | var shouldContinue = false;
11 | while (!Equals(source[i + offset], targetItem)) {
12 | var notPreviouslyMatched = source[i + offset];
13 | if (predicate(notPreviouslyMatched)) {
14 | target.Insert(i, notPreviouslyMatched);
15 | shouldContinue = true;
16 | break;
17 | }
18 |
19 | offset += 1;
20 | }
21 |
22 | if (shouldContinue)
23 | continue;
24 |
25 | if (!predicate(targetItem)) {
26 | target.RemoveAt(i);
27 | i -= 1;
28 | offset += 1;
29 | }
30 | }
31 |
32 | for (var i = target.Count; i < source.Count - offset; i++) {
33 | var sourceItem = source[i + offset];
34 | if (predicate(sourceItem))
35 | target.Add(sourceItem);
36 | }
37 | }
38 | }
39 | }
40 |
--------------------------------------------------------------------------------
/ExceptionBreaker/ComImports/IDataTipEvents.cs:
--------------------------------------------------------------------------------
1 | using System.Runtime.CompilerServices;
2 | using System.Runtime.InteropServices;
3 |
4 | // ReSharper disable CheckNamespace
5 | namespace Microsoft.VisualStudio.Debugger.Interop.Internal {
6 | // ReSharper restore CheckNamespace
7 | [ComImport, Guid("C7097399-F1BF-4C37-ABEC-44A787170A46"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
8 | public interface IDataTipEvents {
9 | [PreserveSig, MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
10 | int TearOff([In, ComAliasName("Microsoft.VisualStudio.Debugger.Interop.Internal.DataTipIdentity"), MarshalAs(UnmanagedType.LPArray)] DataTipIdentity[] Id, [In, ComAliasName("AD7InteropA.DEBUG_PROPERTY_INFO")] DEBUG_PROPERTY_INFO info, [In] int screenX, [In] int screenY, [In] int width, [In] int height);
11 | [PreserveSig, MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
12 | int UndoTearOff([In, ComAliasName("Microsoft.VisualStudio.Debugger.Interop.Internal.DataTipIdentity"), MarshalAs(UnmanagedType.LPArray)] DataTipIdentity[] Id, [In, ComAliasName("AD7InteropA.DEBUG_PROPERTY_INFO")] DEBUG_PROPERTY_INFO info);
13 | [PreserveSig, MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
14 | int Closing([In, ComAliasName("Microsoft.VisualStudio.Debugger.Interop.Internal.DataTipIdentity"), MarshalAs(UnmanagedType.LPArray)] DataTipIdentity[] Id, [In, ComAliasName("AD7InteropA.DEBUG_PROPERTY_INFO")] DEBUG_PROPERTY_INFO info);
15 | }
16 | }
--------------------------------------------------------------------------------
/readme.md:
--------------------------------------------------------------------------------
1 | ### Overview
2 |
3 | ExceptionBreaker is a VS extension that provides a way to fast-toggle breaking on all CLR exceptions.
4 | It is available through both `Debug` toolbar and `Debug` top level menu.
5 |
6 | 
7 |
8 | ### Installation
9 |
10 | The extension can be installed from [Visual Studio Gallery](http://visualstudiogallery.msdn.microsoft.com/50091e25-9e75-40d3-9780-a05892f474de).
11 | Supported VS versions: 2010, 2012, 2013.
12 |
13 | ### Details
14 |
15 | Pressing the button sets (or unsets) breaking for all exceptions in `Common Language Runtime Exceptions` group:
16 |
17 |
18 |
19 | Notes:
20 |
21 | 1. If using `Just My Code`, both `Thrown` and `Unhandled` columns will be affected.
22 | (I do not use `Just My Code` so please let me know if deselecting `Unhandled` makes any sense).
23 |
24 | 2. Deselected button is not equal to "Do not break on all CLR exceptions".
25 | Some exceptions might be selected (manually through `Debug -> Exceptions`) — just not all of them.
26 |
27 | ### Options
28 |
29 | By popular demand, version 1.1 introduces support for excluding certain exceptions from being changed:
30 |
31 |