[alibaba/arthas]启动Arthas报空指针异常

2024-07-17 941 views
3
环境信息
  • arthas-boot.jar 或者 as.sh 的版本: 3.6.9
  • Arthas 版本: 3.6.9
  • 操作系统版本: CentOS Linux release 7.9.2009 (Core)
  • 目标进程的JVM版本: openjdk "1.8.0_362-362"
  • 执行arthas-boot的版本: 3.6.9
重现问题的步骤
  1. 在我们内部环境中,使用Arthas挂载到具体的Java进程时,出现了空指针异常。
  2. 查看Arthas源码后发现,Arthas对Java系统变量(System properties)中值为null的情况没有做处理。
期望的结果
  1. 首先希望针对Java系统变量(System properties)中值为null的情况,做一下判空处理,不至于导致Arthas启动失败。虽然这种情况理论上来说是不可能出现的。
  2. 再者请教一下贵团队是否有办法排查出当前JVM出现这种异常情况的原因(初步判断可能是当前Java版本的BUG)。
实际运行的结果

image

回答

6

查看Arthas源码后发现,Arthas对Java系统变量(System properties)中值为null的情况没有做处理。

具体在arthas代码哪个位置?

另外,可能是 pid 1的问题。 在issue 里找下。

5

我这边重新看了一下代码,应该跟Arthas没有关系。是因为调用HotspotVirtualMachine.getSystemProperties()方法时,获取到目标JVM系统变量,然后load到Properties的时候,由于目标系统变量中有包含null的值,所以导致这个方法抛出了空指针异常。是我弄错了,非常感谢!! 这里是否可以请教一个问题,对于我们这里出现这样的情况,您是否有比较好的办法去排查,毕竟正常情况下操作Properties的话是不可能存在里面有null值的情况,而且HotspotVirtualMachine类这里的代码也认为Properties中不会有null值的情况,但是我们这边的现象就是确实存在null值,Arthas启动失败的报错也能证明这一点。

public Properties getSystemProperties() throws IOException {
    InputStream inputStream = null;
    Properties properties = new Properties();
    try {
      inputStream = executeCommand("properties", new Object[0]);
      properties.load(inputStream);
    } finally {
      if (inputStream != null)
        inputStream.close(); 
    } 
    return properties;
  }

鄙人愚钝,望先生赐教!

6

不是很清楚。正常来说 System#setProperty 是不允许 null 的。

8

System.getProperties().put("a", Boolean.FALSE); Object aObject = System.getProperties().get("a");// false String a = System.getProperty("a");// null java的坑,当系统属性中包含非String类型的value,无法attach