调试

Mixin提供了一些用于调试的系统参数或者注解属性

调试参数

Wiki: Mixin Java System Properties
文档: MixinEnvironment.Option

  • mixin.debug: 启用所有调试选项
  • mixin.debug.export: 导出所有合并后的类文件至.mixin.out文件夹内,如果在类路径中存在Fernflower反编译器,还会输出反编译后的文件
  • mixin.debug.export.filter: 一个用于指定要导出哪些类的过滤器,如果需要反编译,这个属性非常有用,因为反编译所有类需要消耗较长时间,支持以下模糊匹配规则:
    • * : 匹配一个或多个字符,除了点(.)
    • ** : 匹配任意数量的字符
    • ? : 匹配单个任意字符
  • mixin.debug.export.decompile: 启用反编译,仅当类路径中存在Fernflower反编译器时有效
  • mixin.debug.export.decompile.async: 启用独立的线程反编译,通常会大大缩短反编译导致的启动游戏的时间。如果启动中游戏崩溃,则可能会输出未反编译的类
  • mixin.debug.export.decompile.mergeGenericSignatures: 如果启用反编译器,那么会合并注入类中的泛型签名,有时候会让某些进行泛型验证的子系统出现问题,启用此属性禁用泛型合并
  • mixin.debug.verify: 检查Mixin是否正确注入,仅当调试Mixin库本身的时候才建议启用,用于调试使用Mixin的模组则不建议启用
  • mixin.debug.verbose: 将DEBUG级别的日志消息降低为INFO级别,这样就能在运行时在控制台中显示更多信息
  • mixin.debug.countInjections: 参见@Inject.expect属性文档
  • mixin.debug.strict: 启用严格的检查
  • mixin.debug.strict.unique: 如果启用,则@Unique方法在遇到相同方法签名的方法时会直接抛出异常终止游戏,而不是默认的仅在控制台打印警告
  • mixin.debug.strict.targets: 启用对注入目标严格的检查
  • mixin.debug.profiler: 启用性能分析
  • mixin.dumpTargetOnFailure: 通常在Mixin使用时出现异常后会打印一些消息,有时候这些消息并不准确,通常是其他CoreMod对相关的目标进行了更改,启用此属性允许输出应用Mixin前的类文件到.mixin.out文件夹内,以确定出现异常的原因
  • mixin.checks: 启用所有检查选项
  • mixin.checks.interfaces: 检查使用@Inplements实现的接口,启用此属性,会在控制台输出一个报告,指示了哪些方法未实现,调用这些方法时,会抛出AbstractMethodError错误。报告会生成在.mixin.out文件夹下
  • mixin.checks.interfaces.strict: 当启用了mixin.checks.interfaces,但未启用此属性,Mixin会跳过对目标类是抽象类的检查,如果启用了此属性,抽象类也将被检查
  • mixin.ignoreConstraints: 启用此属性,会对注入注解中的constraints属性的检查出现异常后的抛出错误降级为仅在控制台输出一个警告
  • mixin.hotSwap: 启用热加载(?),如果用-javaagent参数加载Mixin的jar包,则会自动启用此属性
  • mixin.env: 意义不明,Mixin并未使用过此属性,可能是仅为了设计模式而存在
  • mixin.env.obf: 启用强制使用mcp name
  • mixin.env.disableRefMap: 启用此属性会禁用映射表
  • mixin.env.remapRefMap: 启用此属性需要手动指定映射表
  • mixin.env.refMapRemappingFile: 手动指定一个映射到searge name的映射表,仅当mixin.env.remapRefMap启用时有效
  • mixin.env.refMapRemappingEnv: 如果mixin.env.refMapRemappingFile指定的映射表不是映射到searge name的,需要设置此属性指定映射表指向notch name还是mcp name
  • mixin.env.allowPermissiveMatch: 此属性默认启用,效果是当启用了mixin.env.remapRefMap属性时,只匹配目标的名称,不匹配目标的类型/参数类型,将此属性设置为false则禁用此行为
  • mixin.env.ignoreRequired: 启用此属性则忽略所有注解的require属性设置
  • mixin.env.compatLevel: 设置兼容的Java最低版本,仅有JAVA_6JAVA_7JAVA_8JAVA_9四种选择
  • mixin.env.shiftByViolation: 当@At.shift属性设置得超出最大允许的值时,目前会抛一个警告,高版本Mixin可能会抛出错误,允许以下取值:
    • ignore: Mixin 0.7以前版本的默认值,忽略警告
    • warn: 当前的默认值,打印一个警告
    • error: 直接抛出一个错误
  • mixin.initialiserInjectionMode: 设置初始化注入时的行为,默认为default,可以改为safe

调试注解

  • @Debug文档
    标记在注入类或者注入方法上

    • export: 仅当此注解标记在注入类上有效。当mixin.debug.export未设置时,允许输出单个反编译后的合并类,但是当mixin.debug.export设置为false时,需要设置mixin.debug.export.decompiletrue才能正常输出。这个属性在当你不想输出所有合并类,只想输出单个合并类时非常有用
    • print: 在控制台打印合并后的方法的字节码,仅当mixin.debug.verbose设置为true时才有效
  • 每个注入注解下的expect: 功能和require属性一致,不过仅当mixin.debug.countInjections属性设置为true时才有效,而且这个属性默认值是1,而不是require的-1

results matching ""

    No results matching ""