arthas获取、更改静态变量值

作者 Billy 日期 2025-08-14
arthas获取、更改静态变量值

背景

农业盲盒:
单投标人签章异常后,即使修复了,可能也会由于第一次将文件锁住,没有办法重新签章。
由于jingyi将锁写在内存中,原本只能重启程序来解决。 现在可以用arthas来进行处理。
主要是被锁对象的定位,释放锁的话,release方法是public的,可以提供接口调用。

方法

  1. 下载、启动arthas: 简介

    curl -O https://arthas.aliyun.com/arthas-boot.jar
    java -jar arthas-boot.jar
  2. 获取类加载器:

    sc -d com.be.common.utils.spring.SpringUtils

    class-info com.be.common.utils.spring.SpringUtils
    code-source file:/mnt-local-disk/service/xbox-admin/xbox-admin.jar!/BOOT-INF/lib/be-common-3.8.3.jar!/
    name com.be.common.utils.spring.SpringUtils
    isInterface false
    isAnnotation false
    isEnum false
    isAnonymousClass false
    isArray false
    isLocalClass false
    isMemberClass false
    isPrimitive false
    isSynthetic false
    simple-name SpringUtils
    modifier final,public
    annotation org.springframework.stereotype.Component
    interfaces org.springframework.beans.factory.config.BeanFactoryPostProcessor,org.springframework.context.ApplicationContextAware
    super-class +-java.lang.Object
    class-loader +-org.springframework.boot.loader.LaunchedURLClassLoader@20ad9418
    +-sun.misc.Launcher$AppClassLoader@70dea4e
    +-sun.misc.Launcher$ExtClassLoader@637e88fb
    classLoaderHash 20ad9418

    Affect(row-cnt:1) cost in 63 ms.
  3. 找到管理锁的单例对象

    ognl -c classLoaderHash的值  '@com.be.common.utils.spring.SpringUtils@getBean("pdfBlocker")'
    @PdfBlocker[
    blockerMap=@HashMap[isEmpty=false;size=482],
    timeout=@Long[3],
    timeoutUnit=@[MINUTES],
    ]
  4. 导出文件

    # 导出文件
    ognl -c 20ad9418 '@com.be.common.utils.spring.SpringUtils@getBean("pdfBlocker").blockerMap' > /tmp/blockerMap.txt

    # 导出map的key值
    ognl -c 20ad9418 '@com.be.common.utils.spring.SpringUtils@getBean("pdfBlocker").blockerMap.keySet()'
  5. 格式化map的key值

    退出arthas(stop)后,执行
    grep -oP '@String\[\K[^]]*' blockerMap.txt |uniq > key.txt
  6. 找到被锁的key值

    将key.txt用列模式修改为命令:
    ognl -c 20ad9418 '@com.be.common.utils.spring.SpringUtils@getBean("pdfBlocker").blockerMap.get("authorize_1cc3c718cc7446cdb2f82267243e26d4").isLocked'

    进入arthas批量执行,找到返回值为true的
  7. 释放:

    ognl -c 20ad9418 '@com.be.common.utils.spring.SpringUtils@getBean("pdfBlocker").release("authorize_807f62c7d57441a1a6794b9bb8acdad0")'