取得程式的程式碼

對某種類型的啟動模式而言,取得對應於目前程式碼中之執行點的程式碼,是很重要的。除錯或側寫程式時,這更顯得重要。除錯外掛程式會提供數個不同的延伸點,允許外掛程式登錄可協助找出程式碼位置的類別。

來源定位器

ISourceLocatorIPersistableSourceLocator 定義將執行程式對映回程式碼的介面。

來源定位器通常被實作來使用一個對應的啟動配置和啟動配置委派。定義啟動配置類型時,可指定來源定位器 ID,或用 ILaunchConfiguration.ATTR_SOURCE_LOCATOR_ID 屬性,依程式化方式建立來源定位器 ID 與啟動配置的關聯性。無論是哪一種情況下,都必須在某一個執行點將配置的來源定位器 ID 解析到實際實作 IPersistableSourceLocator 的類別中。 您可以使用 org.eclipse.debug.core.sourceLocators 延伸點來建立來源定位器 ID 和其類別之間的關聯性。

下列的標記來自於 Java 工具開發:

<extension point = "org.eclipse.debug.core.sourceLocators">
	<sourceLocator
		id = "org.eclipse.jdt.debug.ui.javaSourceLocator"
	   	class="org.eclipse.jdt.debug.ui.JavaUISourceLocator"
	   	name="%javaSourceLocator"/>
   </extension>

由於可以保留啟動配置,來源定位器 ID 可能會與啟動配置存放在一起。 要建立來源定位器的實例時,除錯外掛程式會查閱來源定位器 ID 屬性,然後建立與該 ID 相關之類別的實例。

查閱程式碼的必要性視要啟動的程式類型而定。然而,平台會定義來源定位器的抽象實作方式,這個方式會查閱給定路徑上的程式檔,該路徑內含目錄、zip 檔、Jar 檔等。如果想要利用這個實作方式,您的外掛程式可以延伸 AbstractSourceLookupDirector。 這個特殊實作方式的目的就是要能提供適當的 ISourceLookupParticipant,以將堆疊框對映到一個檔名。例如您可以參閱 AbstractSourceLookupDirector 的延伸器。

來源路徑電腦

AbstractSourceLookupDirector 會依據特定的程式碼查閱路徑來搜尋程式檔。這個路徑會被表示成 ISourceContainer 的陣列。一般會依據啟動之來源配置的特殊狀況,來計算應搜尋其程式碼的來源儲存器。ISourcePathComputer 會針對為物件定義一個用來計算啟動配置之適當來源路徑的介面。 來源路徑電腦(和來源定位器相似)由 ID 所指定,可在定義啟動配置類型的延伸時指定,或藉由設定 ISourceLocator.ATTR_SOURCE_PATH_COMPUTER_ID 屬性以程式化方式建立其與啟動配置的關聯。 來源路徑電腦的 ID 與其實作類別的關聯性是在 org.eclipse.debug.core.sourcePathComputers 延伸點中建立的。下列標記顯示 JDT 針對其 Java 來源路徑電腦所使用的定義:

<extension point="org.eclipse.debug.core.sourcePathComputers">
	<sourcePathComputer
		id="org.eclipse.jdt.launching.sourceLookup.javaSourcePathComputer"
		class="org.eclipse.jdt.launching.sourcelookup.containers.JavaSourcePathComputer">
 	</sourcePathComputer>
 	...

來源路徑電腦負責計算 ISourceContainer 的陣列,其代表來源查閱路徑。例如,Java 來源路徑電腦在建置路徑時,會考量類別路徑。

來源儲存器類型

屬於來源查閱路徑之一部份的儲存器必須實作 ISourceContainer, 它可以搜尋代表具名來源元素的儲存器。您可能需要以不同類型的來源儲存器,以代表不同類型的程式碼存放地方。例如,JDT 定義代表程式碼存放在 Java 專案中、類別路徑上,以及套件片段中的來源儲存器。用於啟動配置的來源儲存器可能以 ID 的形式存放在啟動配置中。由於啟動配置可以保留,所以必須要有方法可以建立來源儲存器 ID 與其實作類別之間的關聯性。做法為使用 org.eclipse.debug.core.sourceContainerTypes 延伸點。下列範例來自 JDT:

<extension point="org.eclipse.debug.core.sourceContainerTypes">
	<sourceContainerType
		id="org.eclipse.jdt.launching.sourceContainer.javaProject"
		name="%javaProjectSourceContainerType.name"
		description="%javaProjectSourceContainerType.description"
		class="org.eclipse.jdt.internal.launching.JavaProjectSourceContainerTypeDelegate">
	</sourceContainerType> 
	...