- 浏览: 3431655 次
- 性别:
- 来自: 珠海
文章分类
- 全部博客 (1633)
- Java (250)
- Android&HTML5 (111)
- Struts (10)
- Spring (236)
- Hibernate&MyBatis (115)
- SSH (49)
- jQuery插件收集 (55)
- Javascript (145)
- PHP (77)
- REST&WebService (18)
- BIRT (27)
- .NET (7)
- Database (105)
- 设计模式 (16)
- 自动化和测试 (19)
- Maven&Ant (43)
- 工作流 (36)
- 开源应用 (156)
- 其他 (16)
- 前台&美工 (119)
- 工作积累 (0)
- OS&Docker (83)
- Python&爬虫 (28)
- 工具软件 (157)
- 问题收集 (61)
- OFbiz (6)
- noSQL (12)
最新评论
-
HEZR曾嶸:
你好博主,这个不是很理解,能解释一下嘛//左边+1,上边+1, ...
java 两字符串相似度计算算法 -
天使建站:
写得不错,可以看这里,和这里的这篇文章一起看,有 ...
jquery 遍历对象、数组、集合 -
xue88ming:
很有用,谢谢
@PathVariable映射出现错误: Name for argument type -
jnjeC:
厉害,困扰了我很久
MyBatis排序时使用order by 动态参数时需要注意,用$而不是# -
TopLongMan:
非常好,很实用啊。。
PostgreSQL递归查询实现树状结构查询
Byteman 3.0.5 发布,Java 字节码注入工具 https://m.oschina.net/blog/375413
场景描述
生产服务器上出现了一个 bug,通过现象无法定位这个 bug 产生的原因,这个时候要求修复这个 bug,你的一般做法是?
使用 println 打印的方法(或者记录日志)记录详细内容?
使用远程 debug?
使用字节码操作工具 btrace?
很多时候在 online 的应用出现问题时,我们需要知道更多的程序的运行细节,但又不可能在开发的时候就把程序中所有的运行细节都打印到日志上, 通常这个时候能采取的就是修改代码,重新部署,然后再观察,但这种方法对于 online 应用来说不是很好,另外一方面如果碰到不好改的代码,例如引用的其他的外部的包什么的,就很麻烦了。使用远程 debug 会使得线程挂起,对于 online 环境是不可接受的。虽然使用 btrace 字节码工具可以避免上面两种方式的缺点,但是 btrace 的限制太多了,例如
不能创建对象
不能抛出或者捕获异常
不能用synchronized关键字
不能对目标程序中的instace或者static变量
不能调用目标程序的instance或者static方法
脚本的field、method都必须是static的
脚本不能包括outer,inner,nested Class
脚本中不能有循环,不能继承任何类,任何接口与assert语句
我使用了一段时间 btrace,一直没有找到得到局部变量的方法(若是有网友知道,可以教我一下),这是我最不能接受的,因为这个场景使用很普遍。若是你也有这个需求和困扰,那么 byteman 是你理想的选择。
Byteman 简介
byteman是jboss下的一个项目,是一个非常方便的java分析工具,能够拦截字节码执行,执行代码和修改变量,是一个诊断问题的利器。在linux下使用起来非常方便,不用对目标应用做任何修改,可以动态打开目标应用的监听端口,当然仅限于openjdk,hotspot 和 jrockit,ibm jdk 不支持。
详细看原文
使用 Byteman 对运行中的系统进行定位 http://wangzaixiang.blogspot.com/2014/05/byteman.html
如果一个生产环境的Java应用,出现了问题,我们可以采用哪些工具,来协助我们进行定位呢?
jstack 可以帮助我们了解这个进程的线程状态,一些诸如死锁的问题,可以通过查看线程状态获得反馈。jmap 可以帮助我们进行定位。(很容易出现的一种情况是类的静态初始化导致的死锁,在这里我碰到过一个很奇特的案列,正常的情况下没有发生死锁,但进行了Emma处理后,却产生了死锁的现象,以后有计划的话,可以重现一下这个现象,并作一个深入的分析)
jmap/mat 可以帮助我们抓取内存,并且进行复盘,这个对于内存泄漏的定位来说,是一个非常有效的工具。需要注意的是,MAT会消耗大量的内存,因此,需要合理的配置jvm的堆设置,以及准备好运行MAT的服务器环境:64位是必须的,有足够大的内存也是必须的。
jcmd 可以帮助我们了解 Java进程的启动标志、系统属性等诸多信息。
不过,如果需要对这个进程进行一定的代码级调试工作,上述工具就力不能及了。而打开一个远程调试工具,连接到这个进程,除非在启动时设置了相关的选项,否则,也是无能为力的。 Linux 的 strace 可以对一个正在运行的进程进行System Call的跟踪操作(这个在系统级定位时也是一个利刃),Java则可以选择 btrace 来完成类似的工作。不过,这里,我会推荐一个更强大的工具: Byteman(http://byteman.jboss.org/)。
我个人对btrace的实战经验并不多,总感觉使用起来有一些不顺手的地方,不过,接触到 byteman 后,却有一种亲切感,当然,这可能跟我对 Java bytecode 较为熟悉有关,所以Byteman的各种切入点对我来说,是一个比较自然的技术。ByteMan 有自己的描述代码切入的规则语言(这一点与drools类似,最早的drools是没有自己的语法的,使用起来反而复杂了),因此,通过一定的学习后,ByteMan的规则描述会更加简单、可读。
ByteMan 的 代码插入能力相比btrace而言更强,似乎你可以在代码中任意的位置插入我们的跟踪代码(当然,你可能需要一定的对Java代码生成、字节码有一定的了解),以及访问当前方法中变量的能力(包括方法参数、局部变量、甚至于调用其它函数的参数值、返回值等),而btrace在这方面的能力要弱很多。如果你熟悉了Java的字节码知识的的话,理解起Byteman的这一套切入点是比较简单的,甚至相比起btrace来说,要更简单更直接得多。
不过,建议如果希望能够让ByteMan对我们的生产故障定位能力提供帮助的话,我们需要提前对Byteman尽可能的熟悉,熟读其文档是必须的,也应该先在开发环境多做一些测试工作,建立不错的熟练度。如果等到真实的生产问题需要定位,再来边学边用的话,估计就是来不及的了。(Byteman本身的专业性知识,以及生产环境的紧迫性要求,会让你手忙脚乱的)。
我将我个人学习整理的ByteMan的一些知识,构成一个简单的CheetSheet,一来作为个人学习的一个提炼,二来也可以作为后续的一个快速参考。
RULE <rule-name>
CLASS <class-name> | INTERFACE <class-name-pattern>
METHOD <method-name>
HELPER <qualified-class-name>
<localtions>
BIND <bindings>
IF <condition>
DO <actions>
ENDRULE
<class-name-pattern>: HelloWorld | com.foo.HelloWorld | ^java.lang.Object
<locations>
AT ENTRY
AT EXIT
AT LINE number
AT READ [ type . ] field [ count | ALL ]
AT READ $var-or-idx [count | ALL ]
AFTER READ [ type .] field [count | ALL ]
AFTER READ $ var-or-idx [count | ALL ]
AT WRITE [ type .] field [count | ALL ]
AT WRITE $ var-or-idx [count | ALL ]
AFTER WRITE [ type .] field [count | ALL ]
AFTER WRITE $ var-or-idx [count | ALL ]
AT INVOKE [ type .] method [ ( argtypes ) ] [count | ALL ]
AFTER INVOKE [ type .] method [ ( argtypes ) ][count | ALL ]
AT SYNCHRONIZE [count | ALL ]
AFTER SYNCHRONIZE [count | ALL ]
AT THROW [count | ALL ]
BIND engine:CoordinatorEngine = $0;
recovered:boolean = engine.isRecovered();
identifier:String = engine.getId()
BIND Expression: $! (return value), $^(exception), $#(argc), $*(args for this method), $@(args for AT INVOKE), $CLASS(class name) and $METHOD(method signature)
场景描述
生产服务器上出现了一个 bug,通过现象无法定位这个 bug 产生的原因,这个时候要求修复这个 bug,你的一般做法是?
使用 println 打印的方法(或者记录日志)记录详细内容?
使用远程 debug?
使用字节码操作工具 btrace?
很多时候在 online 的应用出现问题时,我们需要知道更多的程序的运行细节,但又不可能在开发的时候就把程序中所有的运行细节都打印到日志上, 通常这个时候能采取的就是修改代码,重新部署,然后再观察,但这种方法对于 online 应用来说不是很好,另外一方面如果碰到不好改的代码,例如引用的其他的外部的包什么的,就很麻烦了。使用远程 debug 会使得线程挂起,对于 online 环境是不可接受的。虽然使用 btrace 字节码工具可以避免上面两种方式的缺点,但是 btrace 的限制太多了,例如
不能创建对象
不能抛出或者捕获异常
不能用synchronized关键字
不能对目标程序中的instace或者static变量
不能调用目标程序的instance或者static方法
脚本的field、method都必须是static的
脚本不能包括outer,inner,nested Class
脚本中不能有循环,不能继承任何类,任何接口与assert语句
我使用了一段时间 btrace,一直没有找到得到局部变量的方法(若是有网友知道,可以教我一下),这是我最不能接受的,因为这个场景使用很普遍。若是你也有这个需求和困扰,那么 byteman 是你理想的选择。
Byteman 简介
byteman是jboss下的一个项目,是一个非常方便的java分析工具,能够拦截字节码执行,执行代码和修改变量,是一个诊断问题的利器。在linux下使用起来非常方便,不用对目标应用做任何修改,可以动态打开目标应用的监听端口,当然仅限于openjdk,hotspot 和 jrockit,ibm jdk 不支持。
详细看原文
使用 Byteman 对运行中的系统进行定位 http://wangzaixiang.blogspot.com/2014/05/byteman.html
如果一个生产环境的Java应用,出现了问题,我们可以采用哪些工具,来协助我们进行定位呢?
jstack 可以帮助我们了解这个进程的线程状态,一些诸如死锁的问题,可以通过查看线程状态获得反馈。jmap 可以帮助我们进行定位。(很容易出现的一种情况是类的静态初始化导致的死锁,在这里我碰到过一个很奇特的案列,正常的情况下没有发生死锁,但进行了Emma处理后,却产生了死锁的现象,以后有计划的话,可以重现一下这个现象,并作一个深入的分析)
jmap/mat 可以帮助我们抓取内存,并且进行复盘,这个对于内存泄漏的定位来说,是一个非常有效的工具。需要注意的是,MAT会消耗大量的内存,因此,需要合理的配置jvm的堆设置,以及准备好运行MAT的服务器环境:64位是必须的,有足够大的内存也是必须的。
jcmd 可以帮助我们了解 Java进程的启动标志、系统属性等诸多信息。
不过,如果需要对这个进程进行一定的代码级调试工作,上述工具就力不能及了。而打开一个远程调试工具,连接到这个进程,除非在启动时设置了相关的选项,否则,也是无能为力的。 Linux 的 strace 可以对一个正在运行的进程进行System Call的跟踪操作(这个在系统级定位时也是一个利刃),Java则可以选择 btrace 来完成类似的工作。不过,这里,我会推荐一个更强大的工具: Byteman(http://byteman.jboss.org/)。
我个人对btrace的实战经验并不多,总感觉使用起来有一些不顺手的地方,不过,接触到 byteman 后,却有一种亲切感,当然,这可能跟我对 Java bytecode 较为熟悉有关,所以Byteman的各种切入点对我来说,是一个比较自然的技术。ByteMan 有自己的描述代码切入的规则语言(这一点与drools类似,最早的drools是没有自己的语法的,使用起来反而复杂了),因此,通过一定的学习后,ByteMan的规则描述会更加简单、可读。
ByteMan 的 代码插入能力相比btrace而言更强,似乎你可以在代码中任意的位置插入我们的跟踪代码(当然,你可能需要一定的对Java代码生成、字节码有一定的了解),以及访问当前方法中变量的能力(包括方法参数、局部变量、甚至于调用其它函数的参数值、返回值等),而btrace在这方面的能力要弱很多。如果你熟悉了Java的字节码知识的的话,理解起Byteman的这一套切入点是比较简单的,甚至相比起btrace来说,要更简单更直接得多。
不过,建议如果希望能够让ByteMan对我们的生产故障定位能力提供帮助的话,我们需要提前对Byteman尽可能的熟悉,熟读其文档是必须的,也应该先在开发环境多做一些测试工作,建立不错的熟练度。如果等到真实的生产问题需要定位,再来边学边用的话,估计就是来不及的了。(Byteman本身的专业性知识,以及生产环境的紧迫性要求,会让你手忙脚乱的)。
我将我个人学习整理的ByteMan的一些知识,构成一个简单的CheetSheet,一来作为个人学习的一个提炼,二来也可以作为后续的一个快速参考。
RULE <rule-name>
CLASS <class-name> | INTERFACE <class-name-pattern>
METHOD <method-name>
HELPER <qualified-class-name>
<localtions>
BIND <bindings>
IF <condition>
DO <actions>
ENDRULE
<class-name-pattern>: HelloWorld | com.foo.HelloWorld | ^java.lang.Object
<locations>
AT ENTRY
AT EXIT
AT LINE number
AT READ [ type . ] field [ count | ALL ]
AT READ $var-or-idx [count | ALL ]
AFTER READ [ type .] field [count | ALL ]
AFTER READ $ var-or-idx [count | ALL ]
AT WRITE [ type .] field [count | ALL ]
AT WRITE $ var-or-idx [count | ALL ]
AFTER WRITE [ type .] field [count | ALL ]
AFTER WRITE $ var-or-idx [count | ALL ]
AT INVOKE [ type .] method [ ( argtypes ) ] [count | ALL ]
AFTER INVOKE [ type .] method [ ( argtypes ) ][count | ALL ]
AT SYNCHRONIZE [count | ALL ]
AFTER SYNCHRONIZE [count | ALL ]
AT THROW [count | ALL ]
BIND engine:CoordinatorEngine = $0;
recovered:boolean = engine.isRecovered();
identifier:String = engine.getId()
BIND Expression: $! (return value), $^(exception), $#(argc), $*(args for this method), $@(args for AT INVOKE), $CLASS(class name) and $METHOD(method signature)
发表评论
-
FFmpeg常用基本命令
2016-07-15 11:52 0http://www.cnblogs.com/dwdxdy/p ... -
iF.SVNAdmin安装
2016-06-27 17:13 1426http://blog.linhere.com/archive ... -
Java Comparable和Comparator
2016-06-26 08:52 706http://my.oschina.net/android52 ... -
Java集合框架之fastutil & koloboke
2016-06-23 14:04 2480Java集合框架之fastutil http://rensan ... -
ehcache 分布式支持
2016-06-05 22:26 1104原文 http://my.oschina.net/glenxu ... -
Intellij IDEA插件开发入门
2016-05-26 11:42 2889原文: http://blog.csdn.net/dc_726 ... -
阿里巴巴Druid数据源的配置与使用
2016-05-24 17:42 1551http://my.oschina.net/wjme/blog ... -
apache调优
2016-05-21 10:10 1145http://my.oschina.net/renqingsh ... -
mysql中间件研究(Atlas,cobar,TDDL), 分库分表插件
2016-05-09 14:15 3457http://www.guokr.com/blog/47576 ... -
Java集合: Queue和Deque
2016-05-09 09:49 1869Queue http://my.oschina.net/kev ... -
使用gzip优化web应用(filter实现)
2016-05-07 01:45 1035使用gzip优化web应用(filter实现) http:// ... -
tomcat命令
2016-04-28 09:56 950./startup.sh : 启动tomcat ./shutd ... -
Shiro 基于注解和标签实现的授权认证过程
2016-04-25 13:24 5951将 Shiro 作为应用的权限 ... -
安装Hadoop, Hbase, Phoenix
2016-04-22 09:22 1489http://my.oschina.net/jrrx/blog ... -
RandomStringUtils的说明和生成随机汉字
2016-04-20 15:21 1406更多参考: http://my.oschina.net/wil ... -
通过IP地址获取地理位置
2016-04-20 15:19 900http://my.oschina.net/githubhty ... -
jenkins+ant+jmeter搭建持续集成的接口测试平台实例
2016-04-15 13:29 1573http://my.oschina.net/u/1425843 ... -
Java编程中使用正则表达式过滤非数字字符串
2016-04-14 13:51 1726/** * * @param str ... -
Dubbo 介绍
2016-04-14 10:26 1064官方 http://dubbo.io/ DUBBO是一个分布式 ... -
Hadoop 2.6.4分布式集群环境搭建
2016-04-13 11:45 756http://my.oschina.net/jackieyea ...
相关推荐
在字节码操作方面,ASM 提供了底层字节码的生成和分析能力,Byte Buddy 则以更简洁的流式 API 降低了字节码操作的复杂性,Byteman 利用 DSL 实现运行时的字节码操作,Javassist 则是一个用于编辑和分析字节码的库。...
Byteman是一个开源项目,主要用于Java程序的故障注入和监控。这个项目的主回购ZIP文件包含了Byteman的源代码和相关资源,文件名为"byteman-master",这表明我们获得的是项目的完整仓库。 Byteman的核心功能是允许...
Byteman项目是开源社区的一个重要工具,它提供了动态规则注入的能力,用于监控和修改Java应用程序的行为,尤其是在测试、调试和性能分析时非常有用。 1. **Java源码编译**: 在生成jar包之前,首先需要将Java源...
Byteman是一种Java字节码操作库,它可以使用ECA规则和动态污点分析来检测SQL注入攻击。Byteman可以在Web应用程序中加载ECA规则脚本,以达到在线检测SQL注入攻击的目的。 知识点6:_online检测SQL注入攻击的优点 在线...
Byteman作为一款强大的字节码操作工具,为Java开发者提供了前所未有的调试和性能优化手段。通过对Byteman原理、规则语言、内置功能及使用方式的深入了解,开发人员可以更加高效地定位问题、优化代码,从而提升软件...
它通过注入额外的字节码到正在运行的Java程序中,帮助开发者在运行时动态地修改程序的行为。Byteman-examples项目提供了许多实际示例,帮助初学者更好地理解和使用Byteman。下面将详细探讨这些例子及其背后的原理。 ...
jar包,亲测可用
8. **byteman-master.zip**:Byteman是一个动态字节码注入工具,用于测试和调试。在Cassandra中,Byteman可能用于插入跟踪代码,帮助分析和诊断性能问题。 9. **guava-master.zip**:Google Guava是Google的Java库...
Byteman supports injection of side effects into Java programs for the purpose of tracing and testing application behaviour. Installation When you unzip the downloaded release it will explode to a ...
-javaagent:${BYTEMAN_HOME}/lib/byteman.jar=script:${BYTEMAN_SCRIPTS}/drools-byteman.btm,boot:${BYTEMAN_HOME}/lib/byteman.jar -Dorg.jboss.byteman.transform.all 将 ${BYTEMAN_HOME} 和 ${BYTEMAN_SCRIPTS...
byteman-rulecheck-maven-plugin-example 本教程的示例代码解释了如何使用 Byteman rulecheck maven 插件。 该教程链接自 Byteman 项目文档页面 ( )
jar包,亲测可用
jar包,亲测可用
jar包,亲测可用
jar包,亲测可用
jar包,亲测可用
jar包,亲测可用
jar包,亲测可用
涵盖了诸如构建工具(如Apache Ant、Apache Maven、Gradle)、JVM语言(如Clojure、Golo、Apache Groovy、Jython、Scala)、开发工具(如Arquillian、Byteman、Checkstyle、EasyMock、Findbugs、JaCoCo、JUnit 5等)...
jar包,亲测可用