Мод для Майнкрафт, который помогает найти причину вылетов ConcurrentModificationException и IndexOutOfBoundsException в сборках. Он отслеживает изменения выбранного списка, множества или карты и записывает в журнал потоки и моды, обращавшиеся к этой коллекции.
Возможности
- Следит за контейнерами
List,SetиMapв указанном поле класса. - Создаёт файл
CMESuckMyDuck.logс историей изменений и стеками вызовов: по нему можно определить мод или поток, вызвавший конфликт. - Может отслеживать вызовы метода в режиме внедрения и локальную переменную указанного индекса.
- Позволяет исключить из журнала ожидаемые потоки, ограничить размер страниц лога и отфильтровать объекты по стеку конструктора.


Как пользоваться
Поместите файл мода в папку mods, затем добавьте в аргументы JVM лаунчера:
-javaagent:mods/CMESuckMyDuck-<version>.jar=<class full name>;<field name>;<type>;<phase>
После следующего вылета откройте CMESuckMyDuck.log. В параметрах укажите:
<class full name>— внутреннее имя класса через/вместо точек;<field name>— имя отслеживаемого поля; для Forge используется SRG-имя, для Fabric — intermediary-имя, для NeoForge — официальное имя;<type>—List,SetилиMap;<phase>—staticдля статического поля либоnonstaticдля обычного.
Для режима отслеживания вызова метода используйте:
-Dcme_suck_my_duck.inject_method=true
-javaagent:CMESuckMyDuck-<version>.jar=<class full name>;<method name>
Настройки
-Dcme_suck_my_duck.log_level=<level>— уровень журнала;0включает отладочные сообщения и сильно увеличивает лог.-Dcme_suck_my_duck.file_max_entries=<size>— число записей на странице журнала.-Dcme_suck_my_duck.whitelist_constructor_stacktrace=<str>— строка для отбора контейнеров по стеку конструктора.-Dcme_suck_my_duck.ignore_threads=<thread name>— потоки, которые следует игнорировать.-Dcme_suck_my_duck.local_var_index=<index>— индекс локальной переменной для отслеживания; при необходимости используйте-Dcme_suck_my_duck.match_local_index=<ordinal>.-Dcme_suck_my_duck.transform_to_thread_safe=true— заменяет поле потокобезопасным контейнером, но может заметно замедлить игру.
Требования и совместимость
Для старых сред Майнкрафт может потребоваться указать совместимый уровень ASM через -Dcme_suck_my_duck.asm_api_version=<version>. Мод также подходит для отладки других Java-проектов: перед агентом добавьте GSON и ASM в classpath через -cp, а файл мода — в classpath после агента.
