2012-05-03 12 views
2

私は、Eclipse RCPアプリケーションでclassmexerを使用しようとしましたが、私はIllegalStateExceptionを得た:Eclipse RCPアプリケーションでclassmexerを使用しますか?

-javaagent:C:/ユーザー/ KD /ワークスペース/ ClassmexerTester私は入れて実行時設定で

java.lang.IllegalStateException: Agent not initted 
at com.javamex.classmexer.Agent.getInstrumentation(Agent.java:33) 
at com.javamex.classmexer.MemoryUtil.deepMemoryUsageOf(MemoryUtil.java:104) 
at com.javamex.classmexer.MemoryUtil.deepMemoryUsageOf(MemoryUtil.java:80) 
at classmexertester.ViewPart.createPartControl(ViewPart.java:22) 
at org.eclipse.ui.internal.ViewReference.createPartHelper(ViewReference.java:375) 
at org.eclipse.ui.internal.ViewReference.createPart(ViewReference.java:229) 
at org.eclipse.ui.internal.WorkbenchPartReference.getPart(WorkbenchPartReference.java:595) 
at org.eclipse.ui.internal.PartPane.setVisible(PartPane.java:313) 
at org.eclipse.ui.internal.ViewPane.setVisible(ViewPane.java:534) 
at org.eclipse.ui.internal.presentations.PresentablePart.setVisible(PresentablePart.java:180) 
at org.eclipse.ui.internal.presentations.util.PresentablePartFolder.select(PresentablePartFolder.java:270) 
at org.eclipse.ui.internal.presentations.util.LeftToRightTabOrder.select(LeftToRightTabOrder.java:65) 
at org.eclipse.ui.internal.presentations.util.TabbedStackPresentation.selectPart(TabbedStackPresentation.java:473) 
at org.eclipse.ui.internal.PartStack.refreshPresentationSelection(PartStack.java:1245) 
at org.eclipse.ui.internal.PartStack.setSelection(PartStack.java:1198) 
at org.eclipse.ui.internal.PartStack.showPart(PartStack.java:1597) 
at org.eclipse.ui.internal.PartStack.createControl(PartStack.java:643) 
at org.eclipse.ui.internal.PartStack.createControl(PartStack.java:570) 
at org.eclipse.ui.internal.PartSashContainer.createControl(PartSashContainer.java:568) 
at org.eclipse.ui.internal.PerspectiveHelper.activate(PerspectiveHelper.java:272) 
at org.eclipse.ui.internal.Perspective.onActivate(Perspective.java:981) 
at org.eclipse.ui.internal.WorkbenchPage.onActivate(WorkbenchPage.java:2714) 
at org.eclipse.ui.internal.WorkbenchWindow$28.run(WorkbenchWindow.java:3030) 
at org.eclipse.swt.custom.BusyIndicator.showWhile(BusyIndicator.java:70) 
at org.eclipse.ui.internal.WorkbenchWindow.setActivePage(WorkbenchWindow.java:3011) 
at org.eclipse.ui.internal.WorkbenchWindow.busyOpenPage(WorkbenchWindow.java:799) 
at org.eclipse.ui.internal.Workbench$23.runWithException(Workbench.java:1229) 
at org.eclipse.ui.internal.StartupThreading$StartupRunnable.run(StartupThreading.java:31) 
at org.eclipse.swt.widgets.RunnableLock.run(RunnableLock.java:35) 
at org.eclipse.swt.widgets.Synchronizer.runAsyncMessages(Synchronizer.java:135) 
at org.eclipse.swt.widgets.Display.runAsyncMessages(Display.java:4140) 
at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3757) 
at org.eclipse.ui.application.WorkbenchAdvisor.openWindows(WorkbenchAdvisor.java:803) 
at org.eclipse.ui.internal.Workbench$33.runWithException(Workbench.java:1600) 
at org.eclipse.ui.internal.StartupThreading$StartupRunnable.run(StartupThreading.java:31) 
at org.eclipse.swt.widgets.Synchronizer.syncExec(Synchronizer.java:180) 
at org.eclipse.ui.internal.UISynchronizer.syncExec(UISynchronizer.java:150) 
at org.eclipse.swt.widgets.Display.syncExec(Display.java:4683) 
at org.eclipse.ui.internal.StartupThreading.runWithoutExceptions(StartupThreading.java:94) 
at org.eclipse.ui.internal.Workbench.init(Workbench.java:1595) 
at org.eclipse.ui.internal.Workbench.runUI(Workbench.java:2628) 
at org.eclipse.ui.internal.Workbench.access$4(Workbench.java:2499) 
at org.eclipse.ui.internal.Workbench$7.run(Workbench.java:679) 
at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:332) 
at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:668) 
at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:149) 
at classmexertester.Application.start(Application.java:20) 
at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:196) 
at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:110) 
at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:79) 
at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:344) 
at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:179) 
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
at java.lang.reflect.Method.invoke(Method.java:597) 
at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:622) 
at org.eclipse.equinox.launcher.Main.basicRun(Main.java:577) 
at org.eclipse.equinox.launcher.Main.run(Main.java:1410) 
at org.eclipse.equinox.launcher.Main.main(Main.java:1386) 

を/classmexer.jar

私はplugin.xmlに何かを追加する必要がありますか?実行時設定で

答えて

3

私が入れ:

-javaagent:C:/Users/kd/workspace/ClassmexerTester/classmexer.jar

右の音ではありません。 JVMの引数として-javaagent:C:/Users/kd/workspace/ClassmexerTester/classmexer.jarを渡す必要があります。これらは、製品設定の起動タブのJM引数ペインで指定します。

また、plugin.xmlの「実行時」タブのクラスパスペインにあるインクルードされたjarのリストにclassmexer.jarが必要です。

+0

私は '-javaagent:C:/ Users/kd/workspace/ClassmexerTester/classmexer.jar'をJVM引数として置き、plugin.xmlのクラスパスペインに.jarを追加します。しかし、私はまだ同じ例外を取得します。 MANIFEST.MF:Manifest-Version:1.0 Bundle-ManifestVersion:2 バンドル名:ClassmexerTester バンドルシンボリック名:ClassmexerTester;シングルトン:=真 バンドル・バージョン:1.0.0.qualifier バンドル・アクティベーター:classmexertester.Activator 必要-バンドル:org.eclipse.ui、 org.eclipse.core.runtimeを バンドル-ActivationPolicy:怠惰 Bundle- RequiredExecutionEnvironment:JavaSE-1.6 バンドルクラスパス:classmexer.jar、 。 – kj249

2

これをもう少し見て、同じ状況で終わった。この問題はOSGiのフレームワークがバンドルをロードするために別々のクラスローダーを使用することに起因するので、私は単純な解決策はないと思います。 How can I use java.lang.instrument in an Eclipse RCP application?

問題は、-javaagentによって初期化されるclassmexerエージェントのインスタンスです。VM argは、再生中のクラスローダーが異なるため、プラグインで取得したものと同じインスタンスではありません。この問題を解決するには、上記の例で示したオブジェクト共有のSystem.propertiesを使用するか、Starting Agents After VM Startupメカニズムを実装し、プラグインにプログラムでプログラムを追加するか、Agentクラスを修正するしかありません。両方のアプローチでは、classmexer Agentクラスを変更する必要があるため、ソースが公開されていないようにすぐに実行できるわけではありません。

ただし、次のステップは、私のために仕事をしたEclipse Test & Performance Tools Platform

+0

あなたの答えに感謝します。私は現在java.lang.instrumentを使用しています – kj249

+0

問題を再現し、根本的な原因を調査し、代替案を提案するのに十分な時間を費やしました。あなたはそれを受け入れるかどうかにかかわらず、私の答えをアップアップするという礼儀を示していません。 >:\ –

0

で利用できる優秀アプリケーション・プロファイリングツールを利用することができます。 Eclipse Java IDEで、「Run Configuration」 - >「Arguments」タブに移動し、VM引数の下に「-javaagent:classmexer.jar」と入力して変更を適用します。 Eclipse Buildパスにclassmexer.jarが含まれていることを確認してください。

関連する問題