The NetBeans Debugger SPI definition defines interface to Debugger Plug-ins. It allows to extend some already existing debugger, or create a new implementation of debugger.
Debugger SPI allows to:

- create a new instance of session: {@link org.netbeans.spi.debugger.SessionProvider}, {@link org.netbeans.spi.debugger.DelegatingSessionProvider}
- add support for a new language to some Session: {@link org.netbeans.spi.debugger.DebuggerEngineProvider}, {@link org.netbeans.spi.debugger.DelegatingDebuggerEngineProvider}
- install new watch evaluation engine: You can register a new evaluator for watches - {@link org.netbeans.spi.debugger.WatchesProvider} and {@link org.netbeans.spi.debugger.WatchImpl}.
- add a new actions: A support for some new debugger action (like Step Into Action) can be installed to some {@link org.netbeans.api.debugger.DebuggerEngine} - {@link org.netbeans.spi.debugger.ActionsProvider}, {@link org.netbeans.spi.debugger.ActionsProviderSupport} and {@link org.netbeans.spi.debugger.ActionsProviderListener}.

## Registration

Debugger Core SPI contains service providers extending basic Debugger Core API model. Each service provider must be registerred in Meta-inf/debugger. Meta-inf/debugger is special folder in module *.jar file.
If you would like to register some implementation(s) of some service to some Debugger Core API interface of type {type name}, you should create file with name {service full class name}in folder Meta-inf/debugger/{type name}.
The file should contain a list of fully-qualified class names, one per line, of classes implementing the service interface and having default public constructor. It's also possible to append a name of a static method followed by paranthesis, which returns the implementation of the service. That method is then called instead of the default constructor. The method can not take any arguments. If there is a need to remove a service that is provided by some other module, append `'-hidden'` after the class or method name. Space and tab characters surrounding each name, as well as blank lines, are ignored. The comment character is `'#'` (`\u0023`); on each line all characters following the first comment character are ignored. The file must be encoded in UTF-8.
Example I:
I would like to register org.netbeans.modules.debugger.jpda.actions.StepAction and org.netbeans.modules.debugger.jpda.actions.StartAction service implementations for JPDA DebuggerEngine. In this case I should create file named org.netbeans.spi.debugger.ActionsProvider in folder Meta-inf/debugger/netbeans-JPDADebuggerEngine/. "netbeans-JPDADebuggerEngine" is a name of JPDA DebuggerEngine, and it can be obtained from DebuggerEngine.getTypeID(). This file should contain two lines:
org.netbeans.modules.debugger.jpda.actions.StepAction
org.netbeans.modules.debugger.jpda.actions.StartAction
Example II:
I would like to remove the default 'type' and 'toString' columns in LocalVariables view and add a 'builtin' column instead. This is supposed to work for ANT debugger. In this case I should create file named org.netbeans.spi.viewmodel.ColumnModel in folder META-INF/debugger/AntSession/LocalsView/. This file should contain three lines, the first two remove columns we do not want to appear for ANT debugger, the third adds ANT-specific column:
org.netbeans.modules.debugger.ui.models.ColumnModels.createLocalsTypeColumn()-hidden
org.netbeans.modules.debugger.ui.models.ColumnModels.createLocalsToStringColumn()-hidden
org.netbeans.modules.ant.debugger.ColumnModels.createBuiltInColumn()
List of all default service providers:

Service provider interface | Should be registerred to: | File names:
{@link org.netbeans.spi.debugger.SessionProvider} | {@link org.netbeans.api.debugger.DebuggerInfo} | folder name: Meta-inf/debugger/{DebuggerInfo type name} file name: org.netbeans.spi.debugger.SessionProvider
{@link org.netbeans.spi.debugger.DelegatingSessionProvider} | {@link org.netbeans.api.debugger.DebuggerInfo} | folder name: Meta-inf/debugger/{DebuggerInfo type name} file name: org.netbeans.spi.debugger.DelegatingSessionProvider
{@link org.netbeans.spi.debugger.DebuggerEngineProvider} | {@link org.netbeans.api.debugger.Session} | folder name: Meta-inf/debugger/{Session type name} file name: org.netbeans.spi.debugger.DebuggerEngineProvider
{@link org.netbeans.spi.debugger.DelegatingDebuggerEngineProvider} | {@link org.netbeans.api.debugger.Session} | folder name: Meta-inf/debugger/{Session type name} file name: org.netbeans.spi.debugger.DelegatingDebuggerEngineProvider
{@link org.netbeans.spi.debugger.WatchesProvider} | {@link org.netbeans.api.debugger.DebuggerEngine} | folder name: Meta-inf/debugger/{DebuggerEngine type name} file name: org.netbeans.spi.debugger.WatchesProvider |
{@link org.netbeans.spi.debugger.ActionsProvider} | {@link org.netbeans.api.debugger.DebuggerEngine} | folder name: Meta-inf/debugger/{DebuggerEngine type name} file name: org.netbeans.spi.debugger.ActionsProvider |