Os pontos de interrupção permitem que os usuários suspendam a execução de um programa em uma determinada localização.Os pontos de interrupção são tipicamente mostrados na UI juntamente com o código fonte. Quando um ponto de interrupção é encontrado durante a execução de um programa, o programa é suspenso e aciona um evento de depuração SUSPEND com BREAKPOINT como a razão.
Se o plug-in precisar mostrar pontos de interrupção na UI, será possível incluir um IBreakpointListener no IBreakpointManager. O IBreakpointManager é a autoridade central sobre todos os pontos de interrupção. Pontos de interrupção são incluídos e removidos, utilizando o gerenciador de ponto de interrupção, que por sua vez informa a quaisquer listeners sobre as atividades do ponto de interrupção. A operação de pontos de interrupção pode ser ativada ou desativada utilizando o gerenciador de ponto de interrupção. O gerenciador do ponto de interrupção pode ser obtido a partir do DebugPlugin:
IBreakpointManager mgr = DebugPlugin.getDefault().getBreakpointManager();
Os plug-ins que definem seus próprios modelos de depuração e configurações de ativação geralmente precisam definir seus próprios tipos de ponto de interrupção. É possível implementar pontos de interrupção para um modelo de depuração específico, definindo a classe que implementa o IBreakpoint.
Os pontos de interrupção são implementados utilizando marcadores de recursos. A recuperação desses marcadores de recursos permite associar meta informações sobre um recurso na forma de atributos nomeados. Ao implementar um ponto de interrupção utilizando marcadores, o modelo de depuração pode fazer uso de todas as funções de marcador existentes como persistência, procura, inclusão, exclusão e visualização em editores.
Por que é importante saber sobre marcadores ao utilizar pontos de interrupção? Quando você cria um tipo de ponto de interrupção, também deve especificar um tipo de marcador associado. Cada extensão de org.eclipse.debug.core.breakpoints deve ser acompanhada por uma extensão de org.eclipse.core.resources.markers. Isso é demonstrado melhor vendo as extensões definidas pelas ferramentas Java para pontos de interrupção Java.
<extension id="javaBreakpointMarker" point="org.eclipse.core.resources.markers"> <super type="org.eclipse.debug.core.breakpointMarker"/> </extension> <extension id="javaExceptionBreakpointMarker" point="org.eclipse.core.resources.markers"> <super type="org.eclipse.jdt.debug.javaBreakpointMarker"/> <persistent value="true"/> <attribute name="org.eclipse.jdt.debug.core.caught"/> <attribute name="org.eclipse.jdt.debug.core.uncaught"/> <attribute name="org.eclipse.jdt.debug.core.checked"/> </extension>
<extension point="org.eclipse.debug.core.breakpoints"> <breakpoint id="javaExceptionBreakpoint" markerType="org.eclipse.jdt.debug.javaExceptionBreakpointMarker" class="org.eclipse.jdt.internal.debug.core.breakpoints.JavaExceptionBreakpoint"> </breakpoint> </extension>
O plug-in de depuração define um tipo especial de marcador, org.eclipse.debug.core.breakpointMarker. Quando você define um marcador de ponto de interrupção para o depurador, deve declará-lo utilizando esse marcador como um supertipo. Isso permite que o modelo de depuração localize todos os pontos de interrupção possíveis dentro de um arquivo de origem, procurando por subtipos de seu marcador. No exemplo acima, o javaExceptionBreakpointMarker possui um supertipo, javaBreakpointMarker, cujo supertipo é o breakpointMarker. O javaExceptionBreakpoint (definido na extensão do ponto de interrupção) designa o javaExceptionBreakpointMarker como seu marcador.
O que significa tudo isso? Quando o código de depuração obtém um arquivo de código fonte, ele pode procurar por todos os marcadores cujo supertipo é org.eclipse.debug.core.breakpointMarker. Tendo localizado todos os marcadores, ele pode utilizar o registro de extensão para mapear os marcadores para suas classes de ponto de interrupção associadas. Desse modo, o código de depuração da plataforma pode localizar genericamente todos os tipos de pontos de interrupção que foram configurados em um arquivo de origem específico.