IT评测·应用市场-qidao123.com

标题: java故障注入 [打印本页]

作者: 梦应逍遥    时间: 2025-1-3 00:03
标题: java故障注入
一、故障注入概述

(一)故障注入的定义

故障注入是一种软件测试和系统验证的技能,旨在通过向系统或应用程序中引入人工故障,来评估系统的可靠性、可用性、性能和容错性。这些人工故障可以模仿各种异常情况,如硬件故障、软件错误、网络故障、异常数据输入、资源耗尽等,帮助开辟人员和测试人员发现系统中潜在的漏洞和弱点,从而对系统的结实性进行评估和改进。
(二)故障注入的目的


二、使用 Arthas 进行故障注入

(一)Arthas 简介

Arthas 是一款阿里巴巴开源的 Java 诊断工具,它可以对正在运行的 Java 程序进行监控和诊断。除了通例的诊断功能,它也可以在肯定程度上实现故障注入。
(二)使用 Arthas 进行故障注入的步调

1. 启动 Arthas

首先必要下载 Arthas(curl -O https://arthas.aliyun.com/arthas-boot.jar)
 并启动它,通常可以使用以下命令:
  1. java -jar arthas-boot.jar
复制代码
启动后会列出正在运行的 Java 进程,你可以选择要诊断的进程编号进行连接。
2. 反编译源码

jad --source-only com.example.demo.web.IndexController > /tmp/IndexController.java
3. 修改源码

4. 内存编译java文件

mc -c 18b4aac2 /tmp/ActivateCodeBo.java -d /tmp
备注:18b4aac2 通过sc -d com.example.demo.web.IndexController | grep classLoaderHash ,通过这种方式,直接使用内存编译情况,如果编译失败,也可以直接使用本地的class文件
5. 字节码变动

retransform /tmp/com/example/demo/web/IndexController.class
6. 查看是否变动

7、恢复arthas变动
    1)reset *IndexController
    2)stop
(三)Arthas 故障注入的特点


三、使用 Byteman 进行故障注入

(一)Byteman 简介

Byteman 是一个基于字节码操纵的故障注入工具,通过编写 Byteman 规则文件(.btm),可以在运行时修改 Java 程序的行为,实现对类和方法的监控、修改返回值、注入异常等操纵。
(二)使用 Byteman 进行故障注入的步调

1. 编写 Byteman 规则文件

以下是一个简单的 Byteman 规则文件示例,用于在 com.example.demo.web.IndexController 的 index 方法入口处注入异常:
  1. RULE InjectException
  2.   CLASS com.example.demo.web.IndexController
  3.   METHOD index
  4.   AT ENTRY
  5.   DO
  6.    traceln("Injecting RuntimeException into myMethod");
  7.    throw new RuntimeException("Simulated RuntimeException");
  8.   ENDRULE
复制代码
2. 应用 Byteman 规则

将上述规则生存为 inject.btm 文件,然后在运行 Java 程序时添加 Java Agent 来应用规则:
premain启动:java -javaagent:/Users/javazhangyi/Desktop/demo/src/main/resources/byteman-download-4.0.23/lib/byteman.jar=script:/Users/javazhangyi/Desktop/demo/src/main/resources/inject.btm -jar /Users/javazhangyi/Desktop/demo/target/demo-0.0.1-SNAPSHOT.jar
agentmain启动:
1)attach pid:bminstall -b -Dorg.jboss.byteman.transform.all -Dorg.jboss.byteman.verbose  pid
2)加载规则:bmsubmit -l  /Users/javazhangyi/newcy/server/sdk-gateway/branches/gateway_m105/src/test/java/cc.btm
3)卸载规则:bmsubmit -u  /Users/javazhangyi/newcy/server/sdk-gateway/branches/gateway_m105/src/test/java/cc.btm
3. 更复杂的 Byteman 规则

可以实现更多的功能,如修改返回值:
脚本1:

RULE IndexController.index
CLASS com.example.demo.web.IndexController
METHOD index
AT EXIT
IF true
DO
$! = "{\"errorCode\":0,\"obj\":{\"uid\":\"189882714\",\"openid\":\"\",\"pi\":\"1hoc88acppysexjcfdtbkxhjgn961p38n5m5uh\",\"age\":108,\"canModified\":0,\"status\":0,\"token\":\"3D9641DB4E9662AD6F9CE6D4EAD71B5563A156CCCABE2F5956BA7E46BCE9B7947F94E611BC10854A5E7BA353968157BAAC494D6440AA31C8\"},\"ret\":true}";
ENDRULE

脚本2:
  1. RULE OrangeloAccountService.cysidToUserInfo
  2. CLASS com.cyou.modules.account.webservice.rest.NewOrangeloAccountController
  3. METHOD cysidToUserInfo
  4. AFTER WRITE $map ALL
  5. IF (!$map.isEmpty() && $map.get("uid").equals("189882714"))
  6.     DO
  7.         traceln("After write local variable: " + cn.hutool.json.JSONUtil.toJsonStr($map));
  8.         $map.put("age", 116);
  9. ENDRULE
复制代码
(三)Byteman 故障注入的特点


四、Arthas 与 Byteman 的比较

(一)使用场景


(二)操纵难度


(三)功能丰富度


(四)对系统的影响


五、总结

故障注入是一种紧张的软件测试和系统验证技能,Arthas 和 Byteman 是两种不同的工具,分别实用于不同的场景和需求。Arthas 更侧重于运行时的诊断和简单的故障注入,适合开辟人员快速排查问题和进行简单测试;而 Byteman 更适合系统级的测试和复杂的故障注入,能够编写详细的规则对系统进行深度测试。在使用这些工具时,都必要谨慎操纵,避免对生产系统造成不可恢复的影响,最好在测试情况中充实测试和验证后再考虑在更高级的情况中使用。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 IT评测·应用市场-qidao123.com (https://dis.qidao123.com/) Powered by Discuz! X3.4