首页 > 其他分享 >记:针对框架级别的bug如何高效排查及如何修复

记:针对框架级别的bug如何高效排查及如何修复

时间:2023-07-21 11:35:18浏览次数:48  
标签:java 排查 jdk11 如何 日志 chaosblade bug

笔记最近从事公司混沌工程平台的搭建及研发工作。在平台研发及用户使用过程中发现了大量的框架级别的bug。并修复大量bug,并对插件做了扩展。

平台是基于阿里开源的chaosblade框架搭建而成。我选取了一个典型的故障排查过程作为故障排查思路总结

一:基于jdk11版本的jvm下的脚本故障注入失败

在业务部门做异常测试的过程中,对于一些复杂的场景测试下,很难针对方法源码级别的故障注入异常模拟,但是这种场景又大量需要。这时候我们就需要使用到java脚本自定义脚本故障注入。但chaosblade1.7.2以下的版本中,java脚本自定义故障存在bug,脚本注入失败。

1. 排查第一步:看日志

这时候我们需要查看多个位置的日志,优先到注入目标容器查看第一现场日志:/root/logs/chaosblade/chaosblade.log

2. 排查第二步:重现bug

从日志中可以看到,脚本编译失败。但是这已经是所有能看到的错误日志了。如果看到这里。我们只知道脚本编译失败了,没有任何其他信息了,如果经验不够,很容易造成误判,觉得这是脚本写的有问题导致了编译异常。笔者也犯了同样的错误。和也业务方做了大量沟通,同时我花了很多时间去重现 这个问题无果。在观察用户服务配置发现用户使用的jdk版本和笔者使用的jdk版本有差别。用户使用的是jdk11,笔者使用到的jdk8。为此,我通过将环境和用户保持一致重现了这个bug。

3. 排查第三步:深究原因

通过第二步的操作,我们知道出现的原因是用户使用的jdk版本导致出现了这个bug。但是jdk11版本下为啥会出现这个问题,就需要我们进一步深究了。这时候我们查看原生打出的日志,似乎又走进了死胡同。因为日志给出的信息实在有限。但是也足够进一步排查故障了。我们通过日志堆栈,找到框架报错的代码。这时候报错的位置定位到了JavaCodeScriptEngine类中compileClass方法。

从日志报错信息看,代码进入了else逻辑,这时候也能看出,确实是代码编译报错。但是除了日志中打印的错误,并没有看到程序本身出现了什么错误。无法继续排查。

4. 排查第四步:查看官方github issues

这时候我们没有思路的情况下,不应该死磕,需要另辟蹊径查看别人是否也和我们遇到了同样的问题。但是笔者针对这个问题在官网查看一圈下来,也没有遇到相同的问题。事情再一次走进死胡同。

5. 排查第五步:添加自定义日志,辅助排查

 我们看 compileClass方法的源码的时候,看到了使用到了jdk的编译工具javacompiler类,根据我对该类的了解,该方法使用的时候,可以out更多的信息,但是框架开发者对该参数采取了null设置。所以这时候我们需要手动添加打印信息,如下:

 最后一番折腾下我们终于看到了隐藏在编译报错下的真实内容了,找不到java.lang

6. 排查第六步:根据日志针对性定位到问题代码

从日志我们可以看到明显的报错,找不到java.lang,我们都知道java属于编译运行的。在之前需要对依赖类进行类加载操作。同时我需要明白chaosblade底层运行机制,这个读者可自行研究。

这时候我们需要找到框架加载依赖类库的代码

可以看到这段代码是对java类文件内存加载的代码,我们进入源码仔细阅读源码

从上图这可以看到,重现了list方法。在这里做了处理。至此我们找到了定位到了加载类库这里我们遗漏了java.lang包。同时为了验证,笔者当时对加载的逻辑也注入了日志打印。并在过程中,终于找到了,包没有走到加载的逻辑,导致没有被加载进去。(因为现场没有保留,笔者这里不做贴图)

7. 排查第七步:找出问题根因

从以上我们已经知道了,是框架在类库的时候漏掉了java.lang包,所以这时候我思考,为啥jdk8以下情况下正常运行,jdk11出现了java.lang加载被漏掉。这时候我们需要弄清楚jdk8和jdk11在依赖库location做了什么变化,我们需要查看资料弄清楚的问题:

从官方文件中我无法找到jdk8和jdk11在类库路径上对比,最后找到微软官方一篇文章从java8过渡到java11中找到了重点。https://learn.microsoft.com/en-us/java/openjdk/transition-from-java-8-to-java-11

 从这句话清楚告诉了我们,在迁移到jdk11过程中需要注意将类路径迁移到模块化路径上。这时候再看官方资料就能更清楚我们需要查找什么内容。java9之后的版本中引入SYSTEM_MODULE,所以该段代码会在jdk9之后无法获取对应模块化包,所以需要进行相关的兼容(相关修复代码已经提交给chaosblade团队并已经更新到1.7.2版本中) https://github.com/chaosblade-io/chaosblade-exec-jvm/pull/301

 

 

标签:java,排查,jdk11,如何,日志,chaosblade,bug
From: https://www.cnblogs.com/clovejava/p/17570837.html

相关文章

  • Newtonsoft.Json 解析时 导致 List 增加的bug
    测试用例publicclassChild{publicinta=1;}publicclassParent{privateList<Child>_Children=newList<Child>(){newChild()};publicList<Child>Children{get......
  • Bug_ku source (WEB) wp
    在源代码中注释中发现了flag,提交发现是假的。我们打开kali用dirserch扫描一下网站后台目录吧 发现.git,这题应该是一个git泄露的题,用wget吧文件下载到本地,-r选项的作用是递归下载该目录及其子目录的所有文件Linux必备下载命令之wget详解-知乎(zhihu.com)cd进我们下......
  • Eclipse如何安装JavaEE插件
     Eclipse是Java编程领域最常用的开发工具之一,它提供了丰富的插件来支持各种编程语言和框架。对于JavaEE开发者来说,安装JavaEE插件是非常必要的,因为它可以为我们提供更多的工具和功能,使我们的开发工作更加高效和便捷。本文将一步步教你如何在Eclipse中安装JavaEE插件。首先,我们......
  • idea启动总是报错Error running 'Tomcat 9.0.6': Unable to open debugger port (127.
    问题:当遇到idea启动报错"Errorrunning'Tomcat9..6':Unabletoopendebuggerport(127.0.0.1:57757):java.net.SocketException"socketclosed""时,很多人可能会尝试改变debugger的端口来解决问题。但是有时候即使改了几次端口,仍然提示端口被占用,但实际上并没有使用该端口。......
  • JavaIO中的缓冲流有什么作用如何使用缓冲流进行IO操作
     缓冲流在JavaIO中扮演着非常重要的角色,它可以提高IO操作的效率,减少访问硬盘的次数。在本文中,我们将探讨JavaIO中的缓冲流的作用,并演示如何使用缓冲流进行IO操作。首先,让我们了解一下什么是缓冲流。缓冲流是一种高级流,它通过在内存中创建缓冲区来提高IO的效率。当我们使用缓冲......
  • 9Java中如何判断一个字符串是否包含另一个子串
    在Java中,我们经常会遇到需要判断一个字符串是否包含另一个子串的情况。对于这个问题,我们可以使用一些简单而有效的方法来解决。本文将介绍几种常见的方法,以及它们的优缺点。方法一:使用contains方法Java中的String类提供了一个contains方法,可以很方便地判断一个字符串是否包含另......
  • 如何理解小程序插件?微信及支付宝官方详解
    一、小程序插件功能介绍1、如何理解插件插件,英文名可称作“Plug-in、Plugin、add-in、addin、add-on、addon或extension”,是一个依附于主程序的辅助程序,透过和主程序的互动,用来代替主程序需要增加一些所需的特定功能。更通俗的来讲,就类似机器的零件,可以“插入”的形式添加到程......
  • 如何在EasyCVR平台播放MP4视频文件?两种方法!
    目前EasyCVR平台可支持国标GB28181、RTSP/Onvif、RTMP、海康Ehome、SDK等方式接入,这些接入方式主要是针对设备或视频流的接入。在有些项目现场也会遇到播放MP4视频文件的需求,今天我们来介绍下,如何在EasyCVR平台实现MP4视频文件的播放?这里介绍以下2种方式:1、使用OBS工具推流到Ea......
  • 在CSDN中如何快速转载文章
    问题:在CSDN中如何快速转载文章解决步骤:1.在CSDN中找到想要转载的文章,右击点击"检查"(或者快捷键F12)出现以下界面(图下图右侧所示)2.按住Ctrl+F快捷键,寻找"article_content"3.选中divid="article_content"那一行,如下图所示右击"Copy"—"CopyHTML"4.打开CSDN,依次点击......
  • STM32CubeMx LL库BUG之一
    STM32CubeMx是目前最新的V5.5STM32F407,输出LL库,使用FreeRTOS,任务堆栈大小错误:在STM32CubeMx上任务堆栈的单位是word,即4个byte。但是实际上这里的单位是byte,就是说你设置256的话(即1024bytes),实际上给你生成的代码只有256byte,这可能导致任务堆栈溢出,发生各种各样的问题,最常......