Доступ к ручкам текущих процессов - PullRequest
2 голосов
/ 30 октября 2019

В нашем приложении RCP 4 были сгенерированы исключения SWT, вызванные отсутствием доступных дескрипторов. Это может быть вызвано утечкой ресурсов или другими запущенными сторонними приложениями. Мы не можем воспроизвести это в процессе разработки, поэтому мы хотели бы регистрировать любую информацию, которая могла бы помочь нам исправить это в будущем.

Мы хотели бы получить информацию о ручках. Например, общие ручки и то, что они используются для изображений, шрифтов и композитов.

Я искал это и изо всех сил пытаюсь найти что-нибудь о том, как это можно сделать в Java. Мы могли бы выполнить командную строку для получения информации, но это не похоже на отличный способ сделать это.

По Handles Я имею в виду GDI Handles и User Handles в Windows.

Как это можно сделать?

Handles

plugin.xml

<plugin>
   <extension
         id="product"
         point="org.eclipse.core.runtime.products">
      <product
            application="org.eclipse.e4.ui.workbench.swt.E4Application"
            name="appid">
         <property
               name="modelResourceHandler"
               value="bundleclass://a.model.resource.handler.ModelResourceHandler">
         </property>
      </product>
   </extension>
</plugin>

1 Ответ

1 голос
/ 31 октября 2019

Eclipse Sleak может отслеживать распределения, сделанные SWT - код здесь .

Однако для этого требуется, чтобы SWT Display был создан с объектом 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. Итак, что-то вроде:

   <extension
         id="product"
         point="org.eclipse.core.runtime.products">
      <product
            name="%product.name"
            application="my.plugin.application">

В качестве еще одного примера ниже приводится часть проверенного рабочего plugin.xml от одного из моих RCP R4:

<plugin>
   <extension
         id="application"
         name="%app.name"
         point="org.eclipse.core.runtime.applications">
      <application
            cardinality="singleton-global"
            thread="main"
            visible="true">
         <run
               class="greg.music.e4.rcp.MusicApplication">
         </run>
      </application>
   </extension>
   <extension
         id="product"
         point="org.eclipse.core.runtime.products">
      <product
            name="%product.name"
            application="greg.music.e4.rcp.application">
            ...... properties
       </product>
   </extension>

Это в плагинес идентификатором greg.music.e4.rcp. Это определяет приложение с идентификатором greg.music.e4.rcp.application и продукт с идентификатором greg.music.e4.rcp.product

...