Альтернатива программному обеспечению, подобному VisualVM, для программного поиска значений запущенных приложений Java и т. Д. Путем поиска дампов кучи? - PullRequest
2 голосов
/ 07 января 2010

У меня нет опыта работы с java-приложениями, но я обнаружил, что поиск статических указателей и т. Д. Для адресов памяти этих приложений часто (почти) невозможен, по-видимому, из-за java-движка, который обрабатывает код (поправьте меня, если так называть это неправильно, пожалуйста).

Теперь я использовал VisualVM (https://visualvm.dev.java.net/), и это здорово. Я могу выбрать свой процесс Java и создать дамп кучи. Затем он показывает мне все классы и их значения.

Можно ли использовать этот метод для непрерывного опроса дампа кучи и получения значений объектов, например X Y и Z игры? Как бы я программно взаимодействовал с таким приложением, и если этого не следует делать с VisualVM, что может быть альтернативой?

Редактировать: это то, что мне нужно сделать: Мне нужно быть в состоянии найти все классы со свойствами, которые имеют определенное значение. Например: я бы искал координату X (число с плавающей точкой), и он должен возвращать класс "PlayerCoordsHandler" (просто пример) и соответствующий объект с плавающей точкой со своим значением ... или, альтернативно, просто способ снова найти этот тот же самый объект с плавающей точкой (после перезапуска например). Этот процесс не обязательно должен быть программным, поскольку запрос значения теперь известного свойства (x float) может быть получен программным способом (например, с помощью утилиты командной строки или чтения из файла).

Edit2: Целевое приложение - это исполняемый файл Windows (но созданный с использованием Java), который запускает собственную Java-VM. Невозможно добавить параметры Java для отладки. Это, кажется, не требуется, поскольку VirtualVM может отлаживать процесс просто отлично. Кто-нибудь знает как?

Заранее спасибо.

Ответы [ 7 ]

3 голосов
/ 07 января 2010

Похоже, вы хотите отлаживать запущенные Java-приложения.

"Официальным" отладчиком Java является JDB. Я считаю, что это часть JDK. Он имеет возможность устанавливать точки останова, исследовать кучи, выводить список и отображать и даже изменять переменные, показывать запущенные потоки и так далее. Обычные вещи отладчика. Но это командная строка, которая делает боль в шее при работе.

Вместо этого имеет смысл использовать IDE со встроенным отладчиком. Я использую Eclipse. Вы можете делать все обычные вещи отладки, включая отображение окон с переменными. Вы можете установить условные контрольные точки и многое другое. В частности, в ответ на ваш вопрос, вы можете настроить выражения наблюдения, которые будут оцениваться во время выполнения программы, а их дисплеи обновляться новыми значениями при их изменении.

Возможно, вы не захотите запускать ваше Java-приложение внутри IDE; или он может быть запущен на сервере веб-приложений. Это не проблема для JDB или Eclipse (или других IDE, таких как NetBeans или IntelliJ Idea): они могут подключаться к работающей JVM и отлаживать удаленно с тем же уровнем удобства.

Программа, отлаживаемая таким образом, удаленно или нет, работает несколько медленнее, чем если бы это было не так. Ваша игра, будучи отлаженной, будет работать на довольно плохо выглядящем FPS; но он все равно должен более или менее нормально реагировать на игровой процесс.


Удаленная отладка:

Чтобы иметь возможность подключить отладчик Eclipse NetBeans к работающему процессу Java, необходимо запустить этот процесс со следующими параметрами Java…

-Xdebug -Xrunjdwp:transport=dt_socket,address=3704,server=y,suspend=n
2 голосов
/ 07 января 2010

Вы можете легко создать дамп кучи, создав собственное соединение JMX с JVM, как это делает VisualVM. Анализ heapdump очень возможен (данные там и полностью отсоединены от JVM, поэтому нет помех от gc).

Тем не менее, если это не очень специфический сценарий, который вы ищете, вам, вероятно, гораздо лучше дать heapdump для MAT и найти там хороший рабочий процесс для использования.

Редактировать: В этом конкретном случае, вероятно, лучше создать какой-то определенный API для доступа к значениям извне (и, возможно, опубликовать значения как MBeans с использованием JMX). Взятие дампов кучи - это путь к большой работе, если все, что вам нужно, это отслеживать несколько значений.

Edit2: Исходя из ваших правок, мне кажется, что вы действительно выиграете от публикации своего собственного MBean поверх JMX. Я должен баллотироваться на встречу, но, если кто-то другой не сделает этого, пока меня нет, я постараюсь не забыть дать вам несколько советов позже. Либо в редактировании этого, либо в новом сообщении.

2 голосов
/ 07 января 2010

Хорошая отправная точка - инструменты jps и jstat, добавленные в Java 6 (я думаю). jps дает вам pid и основной класс для каждого приложения. jstat даст вам более подробную информацию о процессе

2 голосов
/ 07 января 2010

Посмотрите на YourKit . Вы можете отслеживать работу процессора, памяти и потоков, а также создавать дампы в любое время. Он даже может сравнивать различные дампы памяти, чтобы показать вам, какие объекты были добавлены / удалены.

Это не бесплатно, хотя у него есть 15-дневный (или 30-дневный?) Полнофункциональный период оценки. Если бесплатность не является реальной проблемой, это, безусловно, отличный инструмент.

2 голосов
/ 07 января 2010

Запуск heapdump полезен для посмертного анализа, скажем, утечек памяти, но, поскольку сборщик мусора Java перемещает объекты, вы не можете использовать значения памяти heapdump для надежного доступа к этим объектам.

Если вам нужен способ запроса внутренних значений извне приложения, вы можете настроить API службы RMI, с помощью которого вы можете получить нужные значения.

Другим способом (если вам просто нужно что-то протестировать) может быть подключение к процессу через API отладки de Java.

Если вам известно расположение JRE, которое вы используете, вы можете переименовать java.exe и написать оболочку (C / C ++), которая добавляет параметры отладки, указанные Carl, и по очереди вызывает renamed_java.exe.

Другой возможностью может быть добавление или обновление классов в файле .jar приложения. Вам не нужен источник для этого.

Том, вы пытаетесь перепроектировать приложение, которое специально пытается запутать его работу? Если это так, вы можете пойти дальше, если обратитесь к производителю и спросите его, какие возможности они видят для того, чего вы пытаетесь достичь?

1 голос
/ 07 января 2010

Если вы хотите опрашивать значения определенных объектов во время работы вашего Java-приложения, вы, вероятно, обнаружите, что использование JMX - это лучший и более эффективный подход, чем использование дампа кучи.С помощью JMX вы можете определить, какие значения следует отображать, и использовать такие инструменты, как VisualVM или JConsole, для их просмотра во время выполнения.

0 голосов
/ 07 июля 2014

С помощью VisualVM и heapdump вы можете найти все классы с определенным свойством по OQL:

var out = "";
var cls = filter(heap.classes(), "/java./(it.name)")

while (cls.hasNext()) {
  var cl = cls.next();
  var fls = cl.fields;
  while (fls.hasMoreElements()) {
    var fl = fls.nextElement();
    if (/size/(fl.name)) {
      out = toHtml(cl) + "." + fl.name + "()\n";
    }
  }
}

out.toString()

и запись пользовательских журналов для BTrace

Это альтернатива для отладки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...