在我们的RCP 4应用程序中,由于没有可用的句柄而引发了SWT异常。这可能是由于资源泄漏或其他运行的第三方应用程序引起的。我们无法在开发中重现此问题,因此我们希望记录任何将来可能会帮助我们解决此问题的信息。
我们希望获取有关手柄的信息。例如。总控点及其用途,例如图像,字体和合成。
我一直在寻找这个东西,我一直在努力寻找有关如何用Java做到这一点的任何东西。我们可以执行命令行来获取信息,但这并不是一种很好的方式。
通过Handles
,我指的是Windows上的GDI Handles
和User Handles
。
怎么办?
plugin.xml
<plugin>
<extension
id="product"
point="org.eclipse.core.runtime.products">
<product
application="org.eclipse.e4.ui.workbench.swt.E4Application"
name="Our App name">
<property
name="modelResourceHandler"
value="bundleclass://a.model.resource.handler.ModelResourceHandler">
</property>
</product>
</extension>
</plugin>
Eclipse Sleak可以监视SWT进行的分配-代码为here。
但是,这需要使用启用跟踪的Display
对象创建SWT DeviceData
。标准的E4Application
不执行此操作。
因此,要使用此功能,您需要使用自己的扩展E4Application的应用程序类-类似于:
import org.eclipse.e4.ui.internal.workbench.swt.E4Application;
import org.eclipse.swt.graphics.DeviceData;
import org.eclipse.swt.widgets.Display;
public class MyApplication extends E4Application
{
/** Enable tracking */
private static final boolean TRACKING = true;
/** Enable debug */
private static final boolean DEBUG = false;
public MyApplication()
{
super();
}
@Override
public Display getApplicationDisplay()
{
Display current = Display.getCurrent();
if (current == null)
{
if (TRACKING || DEBUG)
{
DeviceData data = new DeviceData();
data.tracking = TRACKING;
data.debug = DEBUG;
current = new Display(data);
if (data.tracking)
{
Sleak sleak = new Sleak();
sleak.open();
}
}
else
{
current = new Display();
}
}
return super.getApplicationDisplay();
}
}
您将需要在plugin.xml中声明此应用程序:
<extension
id="application"
name="Application name"
point="org.eclipse.core.runtime.applications">
<application
cardinality="singleton-global"
thread="main"
visible="true">
<run
class="your.package.MyApplication">
</run>
</application>
</extension>
更改plugin.xml中的产品声明以使用此应用程序代替org.eclipse.e4.ui.workbench.swt.E4Application