在已整合 MyEclipse 的 Eclipse RCP/RAP 環境中安裝 CDT 插件後:
java.lang.IllegalArgumentExceptionENTRY org.eclipse.core.jobs 4 2 2011-07-19 02:27:53.796
MESSAGE An internal error occurred during: "Launching tst".
STACK 0
java.lang.IllegalArgumentException
at org.eclipse.osgi.framework.internal.core.PackageAdminImpl.getBundles(PackageAdminImpl.java:571)
at org.eclipse.core.internal.runtime.InternalPlatform.getBundle(InternalPlatform.java:181)
at org.eclipse.core.runtime.Platform.getBundle(Platform.java:1416)
at org.springframework.ide.eclipse.core.BundleStateLocationVariableResolver.resolveValue(BundleStateLocationVariableResolver.java:32)
at org.eclipse.core.internal.variables.DynamicVariable.getValue(DynamicVariable.java:54)
at org.eclipse.cdt.internal.core.cdtvariables.EclipseVariablesVariableSupplier$EclipseVarMacro.loadValue(EclipseVariablesVariableSupplier.java:103)
at org.eclipse.cdt.internal.core.cdtvariables.EclipseVariablesVariableSupplier$EclipseVarMacro.getStringValue(EclipseVariablesVariableSupplier.java:90)
at org.eclipse.cdt.dsf.gdb.launching.LaunchUtils.getLaunchEnvironment(LaunchUtils.java:389)
at org.eclipse.cdt.dsf.gdb.launching.LaunchUtils.getGDBVersion(LaunchUtils.java:281)
at org.eclipse.cdt.dsf.gdb.launching.GdbLaunchDelegate.getGDBVersion(GdbLaunchDelegate.java:243)
at org.eclipse.cdt.dsf.gdb.launching.GdbLaunchDelegate.launchDebugSession(GdbLaunchDelegate.java:129)
...
BundleStateLocationVariableResolverLaunchUtils.getLaunchEnvironment() 遍歷所有動態變量獲取值bundle_loc、bundle_state_loc、bundle_version 等變量,但在 CDT 的目標平台上下文中這些 Bundle 信息不可用,導致 PackageAdminImpl.getBundles 拋出 IllegalArgumentException由於不熟悉 CDT 與 Spring IDE 內部機制,且不願修改上游插件源碼,選擇在 LaunchUtils.getLaunchEnvironment() 中捕獲並忽略特定異常。
envMap.put(var.getName(), var.getStringValue());
try {
envMap.put(var.getName(), var.getStringValue());
} catch (IllegalArgumentException e) {
if (var.getName() == null || !var.getName().startsWith("bundle_")) throw e;
ResourcesPlugin.getPlugin().getLog().log(
new Status(IStatus.INFO, GdbPlugin.PLUGIN_ID,
"ignore env variable [" + var.getName() + "] fetch error!", e));
}
IllegalArgumentExceptionbundle_ 開頭(Spring IDE 相關),記錄日誌並忽略,繼續處理其他變量LaunchUtils.getLaunchEnvironment 設置斷點,對比純 CDT 環境與 MyEclipse 環境的 env 內容差異,確認關鍵變量為 bundle_loc、bundle_state_loc、bundle_versionLaunchUtils.classorg.eclipse.cdt.dsf.gdb_3.0.0.201102110609.jar 中對應的類文件LaunchUtils.class:修復後的字節碼org.eclipse.cdt.dsf.gdb_3.0.0.201102110609.jar:已替換的完整插件包DynamicVariable.getValue())應內部捕獲並轉換為狀態碼,而非拋出運行時異常BundleStateLocationVariableResolver 中增強容錯,或 CDT 提供變量過濾擴展點通過定向捕獲 Spring IDE 引入的特定動態變量解析異常,以最小代價恢復了混合開發環境下的 CDT 調試功能。此類「插件衝突→異常傳播→功能失效」模式在 Eclipse 生態中常見,掌握堆疊分析、動態變量機制、片段補丁部署等技能,對維護複雜 IDE 環境至關重要。