HotSpot SA #4:输出类加载路径
2015-03-29 13:02
155 查看
参考R大的文章,也写了一个SA的小工具,可以输出指定类(使用
执行以下命令(
-Dme.kisimple.just4fun.ClassPathDump=类名指定)是从什么地方加载进来的,
[code]package me.kisimple.just4fun; import sun.jvm.hotspot.oops.*; import sun.jvm.hotspot.runtime.VM; import sun.jvm.hotspot.tools.Tool; public class ClassPathDump extends Tool { private String className; public ClassPathDump(String className) { super(); this.className = className; } public static void main(String[] args) { String className = System.getProperty("me.kisimple.just4fun.ClassPathDump"); if(className != null) { ClassPathDump dump = new ClassPathDump(className.replace(".", "/")); dump.start(args); dump.stop(); } } @Override public void run() { VM vm = VM.getVM(); final ObjectHeap objectHeap = vm.getObjectHeap(); objectHeap.iteratePerm(new HeapVisitor() { @Override public void prologue(long l) { } @Override public boolean doObj(Oop oop) { if(oop instanceof InstanceKlass) { InstanceKlass klass = (InstanceKlass)oop; if(klass.getName() != null && className.equals(klass.getName().asString())) { Oop protectionDomain = klass.getProtectionDomain(); if(protectionDomain == null) return true; Oop codesource = getOopFieldValue(protectionDomain, "codesource", "Ljava/security/CodeSource;"); if(codesource == null) return true; Oop location = getOopFieldValue(codesource, "location", "Ljava/net/URL;"); if(location == null) return true; Oop path = getOopFieldValue(location, "path", "Ljava/lang/String;"); if (path == null) return true; System.out.println("////////////////////////////////////////"); System.out.println("[LOADED]" + className); System.out.println("[FORM]"+ OopUtilities.stringOopToString(path)); return true; } } return false; } @Override public void epilogue() { } }); } private Oop getOopFieldValue(Oop oop, String name, String sig) { InstanceKlass klass = (InstanceKlass) oop.getKlass(); OopField field = (OopField) klass.findField(name, sig); return field.getValue(oop); } }
执行以下命令(
sa-jdi.jar需要放在classpath上),
[code]> java -Dme.kisimple.just4fun.ClassPathDump=groovy.lang.GroovyClassLoader me.kisimple.just4fun.ClassPathDump 6376
6376是目标进程pid,示例输出如下,
[code]Attaching to process ID 6376, please wait... Debugger attached successfully. Server compiler detected. JVM version is 24.51-b03 //////////////////////////////////////// [LOADED]groovy/lang/GroovyClassLoader [FORM]/C:/Java/jdk1.7.0_51/jre/lib/ext/groovy-2.4.0.jar
参考资料
http://rednaxelafx.iteye.com/blog/1295944相关文章推荐
- HotSpot SA #1:JStack
- ld加载so路径设置
- HotSpot JVM 对象的内存结构和对象成员的堆内存分配原则
- unity3D android下路径加载
- 使用路径通配符加载Resource,
- 加载动态DLL,实现查询进程路径
- andorid 调用拍照功能回调的图片路径无法加载图片
- Huawei E587 3G Mobile Hotspot Command Injection
- maven关于jsp页面加载图片和css路径的问题
- Linux下指定动态库的加载路径
- AxureRP7.0基础教程 部件详解图片热区 HOT SPOT WIDGET
- Hotspot JVM and GC basics studynote(1)
- jvm HotSpot虚拟机主要参数表
- Oracle直接路径加载--append的深度解析
- HotSpot VM源码 目录结构
- 图片资源加载路径分析以及netbeans打包java程序,并包含图片资源
- vs2013制定加载动态链接库的路径
- URLClassLoader加载类的路径
- linux设置库文件加载包含路径
- 开启ActiveMQ时加载指定路径下的配置文件