HouseMD
是一款非常敏捷的Java
进程运行时的诊断调式命令行工具, 它具备安全易用高效的特点, 让它非常适合在要求严格的线上(生产)环境中使用.
特性
- 交互式命令行
- 查看加载类
- 跟踪方法
- 支持类短名字(
SimpleName
)和方法名(可选)限定跟踪目标
- 支持根据抽象类或接口来限定其实现类的跟踪目标
- 支持实时显示跟踪目标的摘要统计
- 支持输出跟踪目标调用日志文件输出
- 支持输出跟踪目标调用栈文件输出
- 查看环境变量和属性(
Comming soon
)
为什么要有HouseMD
点击这里查看
与BTrace
相比
- 仅一个
jar
包, 部署简单, 使用简单
- 无需编写脚本, 借助指令完成常见诊断操作, 且切换快速高效
- 借助命令行提示, 能够快速准确定位要跟踪的目标
- 支持查看加载类的信息, 这在容器的应用诊断场景非常有用
- 通过跟踪限时和限次数的机制, 来控制给跟踪过程带来的消耗
- 自动检测并解决容器应用中类加载的问题
- 自身源码精简短小, 易于阅读掌握, 易于定制扩展
安装
快速安装
在Linux
或Unix
的系统下, 在要安装HouseMD
的路径下(建议将该路径加入系统PATH变量), 运行:
> curl -Lk https://raw.github.com/zhongl/HouseMD/master/bin/install | bash
HouseMD
目前对Windows
还不支持(相关Issue), 期待有需要的同志来贡献代码!
下载安装
> java -Xbootclasspath/a:$JAVA_HOME/lib/tools.jar -jar housemd-assembly-x.x.x.jar
注意: 在 Mac OSX下, 选项-Xbootclasspath
是不需要的.
入门
启动
假定你在 快速安装并将安装路径加入PATH 之后, 在命令行输入:
> housemd -h
你会看到HouseMD
的帮助信息, 如下:
Usage: housemd [OPTIONS] pid
a runtime diagnosis tool of JVM.
Options:
-h, --help
show help infomation of this command.
-p, --port=[INT]
set console local socket server port number.
default: 54321
Parameters:
pid
id of process to be diagnosing.
真正要用起来, 则需要拿到你要诊断的java
进程的ID
(通过jps
或ps
), 假设pid
是1234
, 然后执行:
> housemd 1234
帮助
在显示若干行INFO
信息后, 此时进入HouseMD
的Shell
提示符, 键入help
指令, 可以查看其支持的内置指令:
housemd> help
quit terminate the process.
help display this infomation.
trace display or output infomation of method invocaton.
loaded display loaded classes information.
在help
后加上指令的名字, 如loaded
, 便会显示具体指令的帮助信息:
housemd> help loaded
Usage: loaded [OPTIONS] name
display loaded classes information.
Options:
-h, --classloader-hierarchies
display classloader hierarchies of loaded class.
Parameters:
name
class name without package name.
退出
退出支持三种方式:
- 键入
quit
指令
- 键入
Ctrl + D
- 键入
Ctrl + C
常见问题解答
点击这里查看
指令范例
loaded
housemd> loaded String
java.lang.String -> /usr/lib/jvm/java-6-sun-1.6.0.26/jre/lib/rt.jar
查看类java.lang.String
的加载路径
housemd> loaded -h ScalaObject
scala.ScalaObject -> /home/housemd/housemd.jar
- com.github.zhongl.housemd.Duck$1@1e859c0
- sun.misc.Launcher$AppClassLoader@1cde100
- sun.misc.Launcher$ExtClassLoader@16f0472
查看类scala.ScalaObject
的加载路径和类加载器层次.
注意: BootClassLoader由于不是Java
语言实现, 所以不会显示.
trace
housemd> trace -t 2 TraceTarget$A.m
INFO : probe class TraceTarget$A
TraceTarget$A.m(int, String) TraceTarget$CL@42719c 0 -ms null
TraceTarget$A.m(String) TraceTarget$CL@42719c 2 3ms TraceTarget$A@401369
TraceTarget$A.m(int, String) TraceTarget$CL@42719c 0 -ms null
TraceTarget$A.m(String) TraceTarget$CL@42719c 4 1ms TraceTarget$A@401369
INFO : Ended by timeout
INFO : reset class TraceTarget$A
跟踪接下来2秒内TraceTarget$A.m
方法的调用
每列的含义依次是: 方法全名(含参数列表), 当前类的加载器对象, 总计调用次数, 平均调用耗时, 调用的自身对象
housemd> trace -l 4 TraceTarget$D+.mD1
INFO : probe class TraceTarget$D
TraceTarget$D.mD1(int) TraceTarget$CL@42719c 2 <1ms TraceTarget$B@80cac9
INFO : Ended by overlimit
INFO : reset class TraceTarget$D
跟踪接下来4次抽象类TraceTarget$D
的mD1
方法的调用
这里可以看到, 这个方法调用的触发对象是其实现类TraceTarget$B
的实例
housemd> trace -i 4 TraceTarget$D+
INFO : probe class TraceTarget$D
INFO : probe class TraceTarget$B
TraceTarget$B.mC(String) TraceTarget$CL@42719c 8 <1ms TraceTarget$B@80cac9
TraceTarget$B.mD2(int, int) TraceTarget$CL@42719c 8 <1ms TraceTarget$B@80cac9
TraceTarget$D.mD1(int) TraceTarget$CL@42719c 8 <1ms TraceTarget$B@80cac9
TraceTarget$B.mC(String) TraceTarget$CL@42719c 16 <1ms TraceTarget$B@80cac9
TraceTarget$B.mD2(int, int) TraceTarget$CL@42719c 16 <1ms TraceTarget$B@80cac9
TraceTarget$D.mD1(int) TraceTarget$CL@42719c 16 <1ms TraceTarget$B@80cac9
INFO : Ended by timeout
INFO : reset class TraceTarget$D
INFO : reset class TraceTarget$B
跟踪抽象类TraceTarget$D
所有方法的调用, 设定每隔4秒进行一次实时摘要显示, 直至默认结束条件达成
housemd> trace -d TraceTarget.addOne TraceTarget$A
......
跟踪TraceTarget.addOne
方法和 TraceTarget$A
的所有方法的调用, 并输出详细日志到文件
文件的路径, 请通过help trace
查看-d
选项的说明获知
输出的detail
文件内容:
2012-06-14 14:38:29 8ms [main] null TraceTarget.addOne [0] 1
2012-06-14 14:38:29 2ms [main] TraceTarget$A@995a79 TraceTarget$A.m [123] void
2012-06-14 14:38:30 0ms [main] null TraceTarget.addOne [0] 1
2012-06-14 14:38:30 0ms [main] TraceTarget$A@995a79 TraceTarget$A.m [123] void
日志每行以一个空格分隔, 每列的含义依次是: 日期, 时间戳, 调用耗时, 调用线程名, 调用方法的自身对象, 调用方法全名, 调用方法参数值列表, 返回值(或异常)
housemd> trace -s TraceTarget.addOne
......
跟踪TraceTarget.addOne
方法, 并输出其调用栈到文件
文件的路径, 请通过help trace
查看-s
选项的说明获知
输出的stack文件内容:
TraceTarget.addOne(Integer) call by thread [main]
TraceTarget.main(TraceTarget.java:42)
更多信息请见常见问题解答, 或指令帮助
历史版本和未来规划
点击这里查看
疑问, 建议, 缺陷
欢迎任何疑问, 建议还有缺陷, 请至这里提交给我.
后记
HouseMD
是基于字节码技术的诊断工具, 因此除了Java
意外, 任何最终以字节码形式运行于JVM
之上的语言, HouseMD
都支持对它们进行诊断, 如Clojure
(感谢@Killme2008提供了它的使用入门)), scala
, Groovy
, JRuby
, Jython
, kotlin
等.
相关推荐
HouseMD是一款基于Scala开发的强大诊断工具,其设计目标是超越BTrace,为开发者提供更为高效、精准的问题排查手段。在Java生态系统中,诊断工具对于识别和解决应用性能问题至关重要,而HouseMD就是这类工具中的杰出...
4. BTrace:文档中提到了BTrace这一神器,BTrace是一个动态追踪工具,它允许Java开发者在不重启应用的情况下,通过Java代码来跟踪调试正在运行的Java程序。BTrace可以用于追踪生产环境中的问题,从而减少停机时间。 ...
走进科学带您了解 Greys,Java 线上问题诊断工具。关联文档关于软件程序安装入门说明常见问题更新記事編輯英文-README程序安装远程安装curl -sLk http://ompc.oss.aliyuncs.com/greys/install.sh|sh远程安装(短...
housemd 类加载工具查看 查看类的加载包 定位类加载异常等问题
Greys是一个java进程执行过程中的异常诊断工具。 在不中断程序执行的情况下轻松完成问题排查工作。 和HouseMD一样,Greys-Anatomy取名同名美剧“实习医生格蕾”,目的是向前辈致敬。代码编写的时候参考了BTrace...
总结起来,HouseMD是一款强大且灵活的Java进程诊断工具,它通过提供实时监控、命令行操作、日志分析、插件扩展等功能,极大地简化了Java应用的调试过程,提升了开发效率。无论你是个人开发者,还是团队中的核心成员...
- **HouseMD**:故障诊断工具,可以收集各种信息帮助诊断问题。 - **jmxterm**:基于终端的JMX客户端。 - **TBJMap**:分析JVM堆转储文件的工具。 **1.1.4 Java诊断工具** - **Eclipse Memory Analyzer (MAT)**:...
集成开源java运维工具脚本:housemd,greys,sjk,jtop等 部分脚本的编写 运行/安装环境 Linux git1.7 + 安装 三种方法 curl -s ...
Ali-tomcat 基于Apache-‐Tomcat 7 – JDK6、JDK7 (websocket) 改动(减掉的) 1) 集群 2) 多应用部署 (只支持单个应用) ...3) 诊断⼯工具:HouseMD2 4) 统⼀一⽇日志框架:Taobao-‐logback