Pontos de interrupção

Os pontos de quebra permitem aos utilizadores suspender a execução de um programa em determinada localização. Os pontos de quebra são normalmente mostrados na UI junto com o código fonte. Ao deparar com um ponto de quebra durante a execução de um programa, este suspende-se e desencadeia um evento de depuração SUSPEND com BREAKPOINT como razão.

Se o plug-in precisar de mostrar pontos de quebra na respectiva UI, poderá adicionar um IBreakpointListener ao IBreakpointManager. O IBreakpointManager é a autoridade central sobre todos os pontos de quebra. Os pontos de quebra são adicionados e removidos com o gestor de pontos de quebra, o qual por seu turno informa os potenciais ouvintes da actividade dos pontos de quebra. O funcionamento dos pontos de quebra pode ser activado ou desactivado com o gestor de pontos de quebra. Poderá obter o gestor de pontos de quebra junto do DebugPlugin:

IBreakpointManager mgr = DebugPlugin.getDefault().getBreakpointManager();

Os plug-ins que definem os seus próprios modelos de depuração e configurações de lançamento costumam precisar de definir os seus próprios tipos de pontos de quebra. Poderá implementar pontos de quebra para determinado modelo de depuração definido uma classe que implemente IBreakpoint.

Os pontos de quebra são implementados por via de marcadores de recursos. Lembre-se que os marcadores de recursos permitem associar meta-informações sobre um recurso sob forma de atributos denominados. Ao implementar um ponto de quebra com marcadores, o modelo de depuração pode fazer uso de todas as funcionalidades do marcador existente como, por exemplo, persistência, pesquisa, adição, eliminação e apresentação em editores.

Por que é importante saber o que são marcadores na utilização de pontos de quebra?  Ao criar um tipo de pontos de quebra, também é necessário 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. Tal pode exemplificar-se melhor observando as extensões definidas pelas ferramentas Java para pontos de quebra 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">
	<ponto de interrupção
		id="javaExceptionBreakpoint"
		markerType="org.eclipse.jdt.debug.javaExceptionBreakpointMarker"
		class="org.eclipse.jdt.internal.debug.core.breakpoints.JavaExceptionBreakpoint">
	</ponto de interrupção>
    </extension>

O plug-in de depuração define um tipo de marcador especial, org.eclipse.debug.core.breakpointMarker. Ao definir um marcador de pontos de quebra para o depurador, deve declarar-se-lo através deste marcador como supertipo. Assim se permite ao modelo de depuração localizar todos os pontos de quebra possíveis num ficheiro origem, pesquisando subtipos do respectivo marcador. No exemplo supra, o javaExceptionBreakpointMarker tem um supertipo, javaBreakpointMarker, cujo supertipo é o breakpointMarker. O javaExceptionBreakpoint (definido na extensão de pontos de quebra) designa o javaExceptionBreakpointMarker como seu marcador.

Que significa tudo isto? Quando o código de depuração obtém um ficheiro de código fonte, pode pesquisar todos os marcadores cujo supertipo seja org.eclipse.debug.core.breakpointMarker. Tendo encontrado todos os marcadores, pode em seguida utilizar o registo de extensões para correlacionar os marcadores com as classes de pontos de quebra associadas. Desta maneira, o código de depuração da plataforma pode genericamente localizar todos os tipos de pontos de quebra que tenham sido definidos num ficheiro origem determinado.