Как мне написать анализируемый формат дампа потока - PullRequest
4 голосов
/ 16 марта 2010

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

ManagementFactory.getThreadMXBean().dumpAllThreads(true, true);

Проблема состоит в том, чтобы записать информацию в анализируемый формат для TDA. Есть ли «простой» способ форматирования информации вместо написания формата самостоятельно?

РЕДАКТИРОВАТЬ: Я хотел бы иметь полный дамп потока, чтобы я мог найти проблемные темы. Вышеупомянутый метод доставляет массив ThreadInfo-Objects, поэтому у меня есть данные. Моя проблема в том, что записанный вывод не в формате, который TDA распознает как дамп потока.

Ответы [ 3 ]

3 голосов
/ 04 мая 2010

Если вы не хотите копировать код TDA (в конце концов, это LGPL), вы также можете использовать Attach API для получения данных в стандартном формате. Насколько я знаю, единственный встроенный код JVM для создания дампа - это собственный код в агенте Attach.

String selfName = ManagementFactory.getRuntimeMXBean().getName();
final int selfPid = Integer.valueOf(selfName.substring(0, selfName.indexOf('@')));                

HotSpotVirtualMachine vm = (HotSpotVirtualMachine) VirtualMachine.attach(Integer.toString(selfPid));

InputStream sDump = vm.remoteDataDump(new Object[]{"-l"}); // lowercase L for lock dump

Дамп данных вернет дамп в поток символьных данных.

1 голос
/ 07 апреля 2010

Просто используйте код, который TDA использует для вывода JMX-данных: MBeanDumper.java

0 голосов
/ 16 марта 2010

Если вы работаете в Windows, то bwithers имеет описанный способ сообщить JVM о дампе потока.

Существует также подход чистого java , но я не уверен, что вывод в стандартном формате.

...