Не может отладить Java Windows Services с jhat, jps, jstack

Оператор запятой комбинирует эти два выражения любая сторона его в один, оценивая их обоих в слева направо порядке. Значение правой стороны возвращается как значение целого выражения. (expr1, expr2) похож { expr1; expr2; }, но можно использовать результат expr2 в вызове функции или присвоении.

Это часто замечается в for циклы, чтобы инициализировать или поддержать несколько переменных как это:

for (low = 0, high = MAXSIZE; low < high; low = newlow, high = newhigh)
{
    /* do something with low and high and put new values
       in newlow and newhigh */
}

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

unsigned char outbuff[BUFFSIZE];
unsigned char *ptr = outbuff;

*ptr++ = first_byte_value;
*ptr++ = second_byte_value;

send_buff(outbuff, (int)(ptr - outbuff));

, Где значения были short с или int с, мы сделали это:

*((short *)ptr)++ = short_value;
*((int *)ptr)++ = int_value;

Позже мы читаем, что это не было действительно допустимым C, потому что (short *)ptr больше не l-значение и не может быть увеличено, хотя наш компилятор в то время не возражал. Для фиксации этого мы разделяем выражение в два:

*(short *)ptr = short_value;
ptr += sizeof(short);

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

#define ASSIGN_INCR(p, val, type)  ((*((type) *)(p) = (val)), (p) += sizeof(type))

При помощи оператора запятой мы смогли использовать это в выражениях или как операторы, как мы желали:

if (need_to_output_short)
    ASSIGN_INCR(ptr, short_value, short);

latest_pos = ASSIGN_INCR(ptr, int_value, int);

send_buff(outbuff, (int)(ASSIGN_INCR(ptr, last_value, int) - outbuff));

я не предполагаю, что любым из этих примеров является хороший стиль! Действительно, я, кажется, помню Steve McConnell Код, Завершенный отговаривание от ровного использования операторов запятой в for цикл: для удобочитаемости и пригодности для обслуживания, циклом должны управлять только одна переменная и выражения в for, сама строка должна только содержать управляющий код цикла, не другие дополнительные биты обслуживания цикла или инициализации.

13
задан stepancheg 28 March 2010 в 20:55
поделиться

4 ответа

Вы получаете только те процессы, которые "принадлежат" вам - тот же идентификатор пользователя.

Можно ли подключиться к нему с помощью jvisualvm?

1
ответ дан 2 December 2019 в 00:18
поделиться

Мне повезло с отладкой процессов, запущенных пользователем SYSTEM, запустив это из командной строки:

c:> time/t
11:18 AM
c:> at 11:19 /interactive cmd.exe
Added a new job with job ID = 1

Используйте время на 1 минуту в будущем. При выполнении задания "at" откроется командная строка Windows, запущенная от имени пользователя SYSTEM. Оттуда вы должны увидеть процессы Java.

Если служба работает от имени локального пользователя (проверьте подробности в "mmc% windir% \ system32 \ SERVICES.MSC", дважды щелкнув службу и выбрав Вкладка "Вход в систему") вы можете сделать то же самое с помощью "runas":

runas /user:USERNAME cmd.exe
4
ответ дан 2 December 2019 в 00:18
поделиться

Я нашел только предложение запустить visuamvm (или другие инструменты) в качестве службы Windows: Мониторинг процессов Java, выполняемых как служба Windows

Возможно, кто-то еще знает лучшее решение .

1
ответ дан 2 December 2019 в 00:18
поделиться

Чтобы запустить утилиты, вы можете подключиться к сеансу консоли с помощью «mstsc / admin», используя учетную запись для входа (не знаю точных разрешений, необходимых для есть, я был в группе администраторов) и использую инструмент Sysinternals psexec для работы в качестве системы. Вот пример использования jstack.exe:

psexec -s "%JAVA_HOME%\bin\jstack.exe" PID >stack.txt
Где PID - это идентификатор вашего процесса. Вам также может потребоваться заменить фактический путь к JDK в зависимости от вашей конкретной среды.

Кроме того, каталог TEMP должен быть установлен правильно или еще раз инструменты работать не будут.

8
ответ дан 2 December 2019 в 00:18
поделиться
Другие вопросы по тегам:

Похожие вопросы: