2010-08-30 1 views
4

Я пытаюсь отлаживать некоторые привязки C/Java, которые используют некоторые пользовательские refcounting/locking. Я хотел бы, чтобы JVM печатал сообщение каждый раз, когда данный объект включал или выходил из своего монитора. Есть какой-либо способ сделать это? В принципе, я хочу это:В Java, как регистрировать сообщение каждый раз, когда монитор или объект данного объекта вводится или выходит?

synchronized(lock) { 
    ... 
    System.out.println("hi"); 
    ... 
} 

напечатать это:

*** "lock" monitorenter 
hi 
*** "lock" monitorexit 

Я смотрел на XX варианты и ничего не нашли. Это OpenJDK 6.

+0

Вы имеете в виду «конкретный монитор» или «любой монитор»? Должен признаться, что я не понимаю, какие вещи можно облегчить с такой дополнительной информацией. – PypeBros

+0

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

ответ

2

Хороший вопрос. Единственное решение, которое я мог бы придумать, в основном таково:

Используйте специальный загрузчик классов и предварительно обработайте файлы с помощью библиотеки обработки байт-кода, например ASM. (ASM имеет хороший пример того, как работать с перезаписью байт-кода в классных загрузчиках.)

Затем просто позвоните System.out.println перед каждым monitorenter и monitorexit.

Благодаря приятному шаблону посетителя в библиотеке ASM это не должно быть больше, чем экран или два кода.

+0

Мне нравится эта идея ... тогда мне просто нужно добавить операторы печати в код C JNI, который вручную вызывает monitorenter/monitorexit. –

+0

Ах, есть также 'Thread.holdsLock()', что полезно. –

0

Попытка отладить проблему совпадения при использовании объявлений в печати с использованием творческих применений - это проигрышная битва, так как ваши операторы печати могут иметь собственную ошибку параллелизма и не печатать в ожидаемом порядке. Попытка отладить или распечатать ваш выход из ошибки concurreny может показаться хорошей, но я не думаю, что это даст вам результат, который вы хотите. Вы должны использовать тщательное мышление и логику, чтобы обосновать, что ваш код верен (больше компьютерных наук, чем программная инженерия).

Проблемы с параллелизмом очень сложны. Если вы не читали «Совместимость на практике», убедитесь, что вы прочитали его. Затем просмотрите все возможные способы достижения вашего синхронизированного блока, все, что он может изменить, выходящие за рамки блокировки и т. Д.

0

Это идеальная ситуация для использования dTrace.

К сожалению, это требует Solaris или OS X.

К счастью OpenSolaris все еще может быть загружен и запущен в виртуальной машине. Он работает лучше всего в VirtualBox.

0

Я не верю, что существует способ привязки к событию «блокировки» в java. Но вы можете заглянуть в java.lang.management для различной информации о блокировке. Например, есть ThreadMXBean.findDeadlockedThreads()

0

Если вы не напишете собственный класс блокировки (или не измените существующий), я предполагаю, что было бы довольно сложно делать то, что вы хотите, особенно если вы используете синхронизированный блок над монитором объект, а не класс блокировки. Однако вы можете использовать команду jstack, поставляемую вместе с JDK, для анализа вашего процесса во время выполнения, отметьте here для справочной страницы, а также есть опция JVM -XX: -PrintConcurrentLocks для печати ваших блокировок, если вы остановите свой JVM-процесс, используя Ctrl- Перерыв (дополнительные опции here).

0

Я предлагаю вам реализовать существующую реализацию класса Lock или реализовать один из вас (http://download.oracle.com/javase/tutorial/essential/concurrency/newlocks.html). Теперь вы можете переопределить метод блокировки и разблокировки.Поэтому вместо использования синхронизированных методов/утверждений использовать этот объект, а методы блокировки/разблокировки записывают ваш журнал :)

Смежные вопросы