[
  {
    "path": "README.md",
    "content": "# CrashAnalysis\n\n## 功能介绍  \n这是一个jvm crash分析工具，主要分析jvm crash的原因，以及常见的解决手段。\n## 使用方式  \njava -jar CrashAnalysis-1.0-SNAPSHOT.jar ${hs_err_pid.log}   \n${hs_err_pid.log} 是jvm crash后生成的日志。  \n## 效果\n分析完成后会展示出来诊断信息，其他信息都是用来验证诊断信息的。"
  },
  {
    "path": "pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\"\n         xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n         xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n    <modelVersion>4.0.0</modelVersion>\n\n    <groupId>com.xp</groupId>\n    <artifactId>CrashAnalysis</artifactId>\n    <version>1.0-SNAPSHOT</version>\n\n    <properties>\n        <maven.compiler.target>1.8</maven.compiler.target>\n        <maven.compiler.source>1.8</maven.compiler.source>\n        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>\n    </properties>\n\n    <build>\n        <plugins>\n            <plugin>\n                <groupId>org.apache.maven.plugins</groupId>\n                <artifactId>maven-jar-plugin</artifactId>\n                <configuration>\n                    <archive>\n                        <manifest>\n                            <addClasspath>true</addClasspath>\n                            <classpathPrefix>lib/</classpathPrefix>\n                            <mainClass>com.xp.Entry</mainClass>\n                        </manifest>\n                    </archive>\n                </configuration>\n            </plugin>\n        </plugins>\n    </build>\n\n</project>"
  },
  {
    "path": "src/main/java/com/xp/Entry.java",
    "content": "package com.xp;\n\nimport com.xp.checker.*;\nimport com.xp.handler.*;\n\nimport javax.swing.*;\nimport java.io.BufferedReader;\nimport java.io.FileReader;\nimport java.io.IOException;\nimport java.util.ArrayList;\nimport java.util.List;\n\n\npublic class Entry {\n    public static void main(String[] args) throws IOException {\n        String filePath = args[0];\n\n        ReadFile(filePath, buildHandler());\n\n        showWithGui(getLayout(buildChecker()));\n\n\n    }\n\n    public static void showWithGui(GuiLayout guiLayout) {\n        if (guiLayout == null) {\n            guiLayout = new DefaultChecker().check();\n        }\n        JFrame  f =new JFrame ();\n        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);\n        JTabbedPane tp = new JTabbedPane();\n        f.setLayout(null);\n        {\n            JPanel jPanel = new JPanel();\n            JTextArea  show = new JTextArea ();\n            show.setText(guiLayout.getAdvice());\n            show.setLineWrap(true);\n            show.setEditable(false);\n            show.setColumns(100);\n            show.setAlignmentX(0);\n            jPanel.add(show);\n            tp.add(jPanel);\n            tp.setTitleAt(0,\"诊断信息\");\n        }\n        int count =1;\n        List<com.xp.element.Frame> showList = guiLayout.getShowList();\n        for (com.xp.element.Frame frame : showList) {\n            JPanel jPanel = new JPanel();\n            JTextArea  tmp = new JTextArea ();\n            tmp.setLineWrap(true);\n            tmp.setEditable(false);\n            tmp.setColumns(100);\n            tmp.setRows(50);\n            tmp.setAlignmentX(0);\n            tmp.setText(frame.toString());\n            jPanel.add(tmp);\n            tp.add(jPanel);\n            tp.setTitleAt(count++,frame.getFrameInfo());\n        }\n        f.setContentPane(tp);\n        f.pack();\n        f.setVisible(true);\n\n\n\n    }\n\n\n    public static CommonHandler buildHandler() {\n        ProblemFrameHandler problemFrameHandler = new ProblemFrameHandler();\n        ThreadFrameHandler threadFrameHandler = new ThreadFrameHandler();\n        SystemFrameHandler systemFrameHandler = new SystemFrameHandler();\n        ProcessFrameHandler processFrameHandler = new ProcessFrameHandler();\n        problemFrameHandler.setNext(threadFrameHandler);\n\n        threadFrameHandler.setNext(processFrameHandler);\n        processFrameHandler.setNext(systemFrameHandler);\n        return problemFrameHandler;\n    }\n\n    public static List<CheckerInterface> buildChecker() {\n        List<CheckerInterface> checkerLists = new ArrayList<>();\n        checkerLists.add(new MemoryChecker());\n        checkerLists.add(new CompileChecker());\n        checkerLists.add(new JVMChecker());\n\n        return checkerLists;\n    }\n\n    public static GuiLayout getLayout(List<CheckerInterface> checkerLists) {\n        GuiLayout guiLayout = null;\n        for (CheckerInterface checkerList : checkerLists) {\n            guiLayout = checkerList.check();\n            if (guiLayout != null) {\n                return guiLayout;\n            }\n        }\n\n\n        return guiLayout;\n    }\n\n    public static void ReadFile(String filePath, CommonHandler handler) throws IOException {\n        try (BufferedReader reader = new BufferedReader(new FileReader(filePath))) {\n            String line = null;\n            while ((line = reader.readLine()) != null) {\n                handler.getMessage(line, reader);\n\n            }\n        }\n\n    }\n\n\n}\n"
  },
  {
    "path": "src/main/java/com/xp/GuiLayout.java",
    "content": "package com.xp;\n\nimport com.xp.element.Frame;\n\nimport java.util.List;\n\npublic class GuiLayout {\n    private String advice;\n    private List<Frame> showList;\n\n    public String getAdvice() {\n        return advice;\n    }\n\n    public void setAdvice(String advice) {\n        this.advice = advice;\n    }\n\n    public List<Frame> getShowList() {\n        return showList;\n    }\n\n    public void setShowList(List<Frame> showList) {\n        this.showList = showList;\n    }\n}\n"
  },
  {
    "path": "src/main/java/com/xp/checker/CheckerInterface.java",
    "content": "package com.xp.checker;\n\nimport com.xp.GuiLayout;\n\npublic interface CheckerInterface {\n    public GuiLayout check();\n\n}\n"
  },
  {
    "path": "src/main/java/com/xp/checker/CompileChecker.java",
    "content": "package com.xp.checker;\n\nimport com.xp.GuiLayout;\nimport com.xp.element.*;\nimport com.xp.util.Common;\n\nimport java.util.ArrayList;\nimport java.util.List;\n\npublic class CompileChecker implements CheckerInterface {\n\n    @Override\n    public GuiLayout check() {\n        String problemInfo = ProblemFrame.frame.getProblemInfo();\n        if (problemInfo != null && (problemInfo.contains(\"0x00\")||problemInfo.contains(\" J \"))) {\n            return buildLayout();\n        }\n        return null;\n    }\n\n    public GuiLayout buildLayout(){\n\n        StringBuilder sb =new StringBuilder();\n        sb.append(\"这是一个解释器的问题，就是jvm把字节码转化成机器码出错了。\");\n        sb.append(Common.NEXT_LINE);\n        sb.append(\"引起这种情况的原因有很多，一般都是jdk的bug\");\n        sb.append(Common.NEXT_LINE);\n        sb.append(\"可以更换不同的jvm模式\");\n        sb.append(Common.NEXT_LINE);\n        sb.append(\"例如-XInt,纯解释模式\");\n        sb.append(Common.NEXT_LINE);\n        sb.append(\"在运行过程信息中有编译情况，可以查看具体编译到谁出错了\");\n        sb.append(Common.NEXT_LINE);\n        sb.append(\"可以通过排除编译这些类来试试\");\n        sb.append(Common.NEXT_LINE);\n\n\n        GuiLayout layout =new GuiLayout();\n        layout.setAdvice(sb.toString());\n        List<Frame> frameList=new ArrayList<>();\n        frameList.add(ProblemFrame.frame);\n        frameList.add(ThreadFrame.frame);\n        frameList.add(ProcessFrame.frame);\n        frameList.add(SystemFrame.frame);\n        layout.setShowList(frameList);\n        return layout;\n\n    }\n\n\n}\n"
  },
  {
    "path": "src/main/java/com/xp/checker/DefaultChecker.java",
    "content": "package com.xp.checker;\n\nimport com.xp.GuiLayout;\nimport com.xp.element.*;\n\nimport java.util.ArrayList;\nimport java.util.List;\n\npublic class DefaultChecker implements CheckerInterface {\n    @Override\n    public GuiLayout check() {\n        return buildLayout();\n    }\n    public GuiLayout buildLayout(){\n        GuiLayout layout =new GuiLayout();\n        layout.setAdvice(\"程序没有判断出问题，请联系作者。\");\n        List<Frame> frameList=new ArrayList<>();\n        frameList.add(ProblemFrame.frame);\n        frameList.add(ThreadFrame.frame);\n        frameList.add(ProcessFrame.frame);\n        frameList.add(SystemFrame.frame);\n        layout.setShowList(frameList);\n        return layout;\n    }\n}\n"
  },
  {
    "path": "src/main/java/com/xp/checker/JVMChecker.java",
    "content": "package com.xp.checker;\n\nimport com.xp.GuiLayout;\nimport com.xp.element.*;\nimport com.xp.util.Common;\n\nimport java.util.ArrayList;\nimport java.util.List;\n\npublic class JVMChecker implements CheckerInterface {\n    @Override\n    public GuiLayout check() {\n\n        String exceptionInfo = ProblemFrame.frame.getExceptionInfo();\n        if (exceptionInfo != null) {\n            return buildLayout();\n        }\n\n        return null;\n    }\n\n    public GuiLayout buildLayout() {\n        StringBuilder sb =new StringBuilder();\n        sb.append(\"这是jvm的错误导致的问题\");\n        sb.append(Common.NEXT_LINE);\n        sb.append(\"请根据后面给的问题点来进行分析，需要根据openjdk的实现来帮助分析问题。\");\n        sb.append(Common.NEXT_LINE);\n        sb.append(\"线程信息中的上下文也会告诉你代码执行到什么地方出的错\");\n        sb.append(Common.NEXT_LINE);\n        sb.append(\"在运行过程信息栏目中查看内部错误信息。\");\n        sb.append(Common.NEXT_LINE);\n        sb.append(\"这种错误有两个大方向可以排查\");\n        sb.append(Common.NEXT_LINE);\n        sb.append(\" 1,操作系统方面：是否是系统资源问题或者是参数问题导致\");\n        sb.append(Common.NEXT_LINE);\n        sb.append(\" 2,有第三方动态库的调用，导致错误\");\n        sb.append(Common.NEXT_LINE);\n        sb.append(\"如果不是以上情况，有可能是jdk的bug，换个系统，或者换个jdk吧。\");\n        sb.append(Common.NEXT_LINE);\n\n        GuiLayout layout =new GuiLayout();\n        layout.setAdvice(sb.toString());\n        List<Frame> frameList=new ArrayList<>();\n        frameList.add(ProblemFrame.frame);\n        frameList.add(ThreadFrame.frame);\n        frameList.add(ProcessFrame.frame);\n        frameList.add(SystemFrame.frame);\n        layout.setShowList(frameList);\n        return layout;\n\n\n    }\n}\n"
  },
  {
    "path": "src/main/java/com/xp/checker/MemoryChecker.java",
    "content": "package com.xp.checker;\n\nimport com.xp.GuiLayout;\nimport com.xp.element.Frame;\nimport com.xp.element.ProblemFrame;\nimport com.xp.element.SystemFrame;\nimport com.xp.element.ThreadFrame;\nimport com.xp.util.Common;\n\nimport java.util.ArrayList;\nimport java.util.List;\n\npublic class MemoryChecker implements CheckerInterface {\n    @Override\n    public GuiLayout check() {\n        String problemInfo = ProblemFrame.frame.getProblemInfo();\n        if(problemInfo.contains(\"Native memory allocation\")){\n            return buildLayout();\n        }\n        return null;\n    }\n\n    public GuiLayout buildLayout(){\n        StringBuilder sb=new StringBuilder();\n        sb.append(\"这是一个内存申请问题。\");\n        sb.append(Common.NEXT_LINE);\n        sb.append(\"jvm默认提供一些解决方案\");\n        sb.append(Common.NEXT_LINE);\n        sb.append(\"  Reduce memory load on the system\");\n        sb.append(Common.NEXT_LINE);\n        sb.append(\"  Increase physical memory or swap space\");\n        sb.append(Common.NEXT_LINE);\n        sb.append(\"  Check if swap backing store is full\");\n        sb.append(Common.NEXT_LINE);\n        sb.append(\"  Use 64 bit Java on a 64 bit OS\");\n        sb.append(Common.NEXT_LINE);\n        sb.append(\"  Decrease Java heap size (-Xmx/-Xms)\");\n        sb.append(Common.NEXT_LINE);\n        sb.append(\"  Decrease number of Java threads\");\n        sb.append(Common.NEXT_LINE);\n        sb.append(\"  Decrease Java thread stack sizes (-Xss)\");\n        sb.append(Common.NEXT_LINE);\n        sb.append(\"  Set larger code cache with -XX:ReservedCodeCacheSize=\");\n        sb.append(Common.NEXT_LINE);\n        sb.append(\"可以根据这些手段进行排查，下面的模版会提供系统内存使用的情况，可以做参考。\");\n        sb.append(Common.NEXT_LINE);\n        sb.append(\"如果发现物理内存充足，swap也充足，那可能是系统的参数限制了内存申请。\");\n        sb.append(Common.NEXT_LINE);\n        sb.append(\"例如/proc/sys/vm/max_map_count\");\n        sb.append(Common.NEXT_LINE);\n        sb.append(\"也或者是jdk版本和系统版本不对，导致内存申请失败\");\n        sb.append(Common.NEXT_LINE);\n        sb.append(\"如果想查具体原因，需要根据jvm源码和下面的堆栈进行分析\");\n        GuiLayout layout=new GuiLayout();\n        layout.setAdvice(sb.toString());\n        List<Frame> frames=new ArrayList<>();\n        frames.add(ProblemFrame.frame);\n        frames.add(SystemFrame.frame);\n        frames.add(ThreadFrame.frame);\n        layout.setShowList(frames);\n        return layout;\n    }\n\n\n}\n"
  },
  {
    "path": "src/main/java/com/xp/element/Frame.java",
    "content": "package com.xp.element;\n\npublic interface Frame {\n    String getFrameInfo();\n}\n"
  },
  {
    "path": "src/main/java/com/xp/element/ProblemFrame.java",
    "content": "package com.xp.element;\n\nimport com.xp.util.Common;\n\npublic class ProblemFrame implements Frame{\n    public static ProblemFrame frame = new ProblemFrame();\n    private String problemInfo;\n\n\n    private String exceptionInfo;\n\n    private ProblemFrame() {\n    }\n\n    public void setProblemInfo(String problemInfo) {\n        this.problemInfo = problemInfo;\n    }\n\n    public String getProblemInfo() {\n        return problemInfo;\n    }\n\n\n    public String getExceptionInfo() {\n        return exceptionInfo;\n    }\n\n    public void setExceptionInfo(String exceptionInfo) {\n        this.exceptionInfo = exceptionInfo;\n    }\n\n\n    @Override\n    public String toString() {\n        StringBuilder sb=new StringBuilder();\n        if(problemInfo!=null){\n            sb.append(\"问题模块：\");\n            sb.append(Common.NEXT_LINE);\n            sb.append(problemInfo);\n            sb.append(Common.NEXT_LINE);\n            sb.append(Common.LINE);\n            sb.append(Common.NEXT_LINE);\n        }\n        if(exceptionInfo!=null){\n            sb.append(\"异常模块：\");\n            sb.append(Common.NEXT_LINE);\n            sb.append(exceptionInfo);\n            sb.append(Common.NEXT_LINE);\n            sb.append(Common.LINE);\n            sb.append(Common.NEXT_LINE);\n\n        }\n\n\n        return sb.toString();\n    }\n\n    @Override\n    public String getFrameInfo() {\n        return \"可能的问题点\";\n    }\n}\n"
  },
  {
    "path": "src/main/java/com/xp/element/ProcessFrame.java",
    "content": "package com.xp.element;\n\nimport com.xp.util.Common;\n\npublic class ProcessFrame implements Frame {\n    public static ProcessFrame frame = new ProcessFrame();\n\n\n    private String exceptions;\n\n    private String compilation;\n\n    private String events;\n\n    private ProcessFrame() {\n    }\n\n\n    public String getExceptions() {\n        return exceptions;\n    }\n\n    public void setExceptions(String exceptions) {\n        this.exceptions = exceptions;\n    }\n\n    public String getCompilation() {\n        return compilation;\n    }\n\n    public void setCompilation(String compilation) {\n        this.compilation = compilation;\n    }\n\n    public String getEvents() {\n        return events;\n    }\n\n    public void setEvents(String events) {\n        this.events = events;\n    }\n\n    @Override\n    public String toString() {\n        StringBuilder sb = new StringBuilder();\n        if (exceptions != null) {\n            sb.append(\"jvm异常信息：\");\n            sb.append(Common.NEXT_LINE);\n            sb.append(exceptions);\n            sb.append(Common.NEXT_LINE);\n            sb.append(Common.LINE);\n            sb.append(Common.NEXT_LINE);\n        }\n        if (compilation != null) {\n            sb.append(\"编译事件：\");\n            sb.append(Common.NEXT_LINE);\n            sb.append(compilation);\n            sb.append(Common.NEXT_LINE);\n            sb.append(Common.LINE);\n            sb.append(Common.NEXT_LINE);\n        }\n        if (events != null) {\n            sb.append(\"事件信息：\");\n            sb.append(Common.NEXT_LINE);\n            sb.append(events);\n            sb.append(Common.NEXT_LINE);\n            sb.append(Common.LINE);\n            sb.append(Common.NEXT_LINE);\n        }\n        return sb.toString();\n    }\n\n    @Override\n    public String getFrameInfo() {\n        return \"运行过程信息\";\n    }\n}\n"
  },
  {
    "path": "src/main/java/com/xp/element/SystemFrame.java",
    "content": "package com.xp.element;\n\nimport com.xp.util.Common;\n\npublic class SystemFrame implements Frame {\n    public static SystemFrame frame = new SystemFrame();\n\n    private String memory;\n\n    private SystemFrame() {\n\n    }\n\n    public String getMemory() {\n        return memory;\n    }\n\n    public void setMemory(String memory) {\n        this.memory = memory;\n    }\n\n    @Override\n    public String toString() {\n        StringBuilder sb = new StringBuilder();\n        if (memory != null) {\n            sb.append(\"机器内存信息：\");\n            sb.append(Common.NEXT_LINE);\n            sb.append(memory);\n            sb.append(Common.NEXT_LINE);\n            sb.append(Common.LINE);\n            sb.append(Common.NEXT_LINE);\n        }\n        return sb.toString();\n    }\n\n    @Override\n    public String getFrameInfo() {\n        return \"系统信息\";\n    }\n}\n"
  },
  {
    "path": "src/main/java/com/xp/element/ThreadFrame.java",
    "content": "package com.xp.element;\n\nimport com.xp.util.Common;\n\npublic class ThreadFrame implements Frame {\n    public static ThreadFrame frame = new ThreadFrame();\n\n    private String currrentTheadInfo;\n    private String stack;\n\n    private ThreadFrame() {\n    }\n\n    public String getCurrrentTheadInfo() {\n        return currrentTheadInfo;\n    }\n\n    public void setCurrrentTheadInfo(String currrentTheadInfo) {\n        this.currrentTheadInfo = currrentTheadInfo;\n    }\n\n    public String getStack() {\n        return stack;\n    }\n\n    public void setStack(String stack) {\n        this.stack = stack;\n    }\n\n    @Override\n    public String toString() {\n\n        StringBuilder sb = new StringBuilder();\n        if (currrentTheadInfo != null) {\n            sb.append(\"正在执行的线程信息：\");\n            sb.append(Common.NEXT_LINE);\n            sb.append(currrentTheadInfo);\n            sb.append(Common.NEXT_LINE);\n            sb.append(Common.LINE);\n            sb.append(Common.NEXT_LINE);\n        }\n        if (stack != null) {\n            sb.append(\"对应的堆栈信息：\");\n            sb.append(Common.NEXT_LINE);\n            sb.append(stack);\n            sb.append(Common.NEXT_LINE);\n            sb.append(Common.LINE);\n            sb.append(Common.NEXT_LINE);\n        }\n        return sb.toString();\n    }\n\n    @Override\n    public String getFrameInfo() {\n        return \"线程信息\";\n    }\n}\n"
  },
  {
    "path": "src/main/java/com/xp/handler/CommonHandler.java",
    "content": "package com.xp.handler;\n\nimport java.io.BufferedReader;\n\npublic abstract class CommonHandler {\n\n    private CommonHandler next;\n\n\n    public void getMessage(String info, BufferedReader reader){\n\n        info = getMessageFromFile(info,reader);\n        if(next!=null){\n            next.getMessage(info, reader);\n        }\n    }\n    protected abstract String getMessageFromFile(String info, BufferedReader reader);\n\n    public CommonHandler getNext() {\n        return next;\n    }\n\n    public void setNext(CommonHandler next) {\n        this.next = next;\n    }\n}\n"
  },
  {
    "path": "src/main/java/com/xp/handler/ProblemFrameHandler.java",
    "content": "package com.xp.handler;\n\nimport com.xp.element.ProblemFrame;\nimport com.xp.util.Common;\nimport com.xp.util.ReaderUtil;\n\nimport java.io.BufferedReader;\nimport java.io.IOException;\n\npublic class ProblemFrameHandler extends CommonHandler {\n    private CommonHandler next;\n    private static final String FLAG = \"#\";\n\n\n    @Override\n    protected String getMessageFromFile(String info, BufferedReader reader) {\n        if (info.contains(FLAG)) {\n            try {\n                do {\n                    if(info.startsWith(Common.END_FLAG)) {\n                        break;\n                    }\n                    if(info.contains(\"Native memory allocation\")){\n                        StringBuilder sb= new StringBuilder(info);\n                        sb.append(Common.NEXT_LINE);\n                        sb.append(ReaderUtil.readFrameEndWithBlankLine(reader));\n                        ProblemFrame.frame.setProblemInfo(sb.toString());\n                    }\n                    if(info.contains(\"An unexpected error\")){\n\n                        ProblemFrame.frame.setExceptionInfo(ReaderUtil.readFrameLineWithLength(4,reader));\n                        info=reader.readLine();\n                    }\n                    if(info.contains(\"A fatal error\")){\n                        ProblemFrame.frame.setExceptionInfo(ReaderUtil.readFrameLineWithLength(4,reader));\n                        info=reader.readLine();\n                    }\n\n                    if (info.contains(\"Problematic frame\")) {\n                        ProblemFrame.frame.setProblemInfo(ReaderUtil.readFrameWithEnd(\"#\", reader));\n                    }\n\n\n                } while ((info = reader.readLine()) != null);\n            } catch (IOException e) {\n                e.printStackTrace();\n            }\n        }\n        return info;\n    }\n}\n"
  },
  {
    "path": "src/main/java/com/xp/handler/ProcessFrameHandler.java",
    "content": "package com.xp.handler;\n\nimport com.xp.element.ProcessFrame;\nimport com.xp.util.Common;\nimport com.xp.util.ReaderUtil;\n\nimport java.io.BufferedReader;\nimport java.io.IOException;\n\npublic class ProcessFrameHandler extends CommonHandler {\n    @Override\n    protected String getMessageFromFile(String info, BufferedReader reader) {\n        if (info.contains(\"P R O C E S S\")) {\n\n            try {\n                while ((info = reader.readLine()) != null) {\n\n                    if (info.startsWith(\"Compilation events\")) {\n                        ProcessFrame.frame.setCompilation(ReaderUtil.readFrameEndWithBlankLine(reader));\n                        info = reader.readLine();\n                    }\n                    if (info.startsWith(\"Internal exceptions \")) {\n                        ProcessFrame.frame.setExceptions(ReaderUtil.readFrameEndWithBlankLine(reader));\n                        info = reader.readLine();\n                    }\n\n                    if (info.startsWith(\"Events\")) {\n                        ProcessFrame.frame.setEvents(ReaderUtil.readFrameEndWithBlankLine(reader));\n                        info = reader.readLine();\n                    }\n\n                    if (info.startsWith(Common.END_FLAG)) {\n                        break;\n                    }\n\n\n                }\n\n            } catch (IOException e) {\n                e.printStackTrace();\n            }\n        }\n        return info;\n    }\n}\n"
  },
  {
    "path": "src/main/java/com/xp/handler/SystemFrameHandler.java",
    "content": "package com.xp.handler;\n\nimport com.xp.element.SystemFrame;\nimport com.xp.util.ReaderUtil;\n\nimport java.io.BufferedReader;\nimport java.io.IOException;\n\npublic class SystemFrameHandler extends CommonHandler {\n    @Override\n    protected String getMessageFromFile(String info, BufferedReader reader) {\n        if (info.contains(\"S Y S T E M\")) {\n\n            try {\n                SystemFrame.frame.setMemory(ReaderUtil.readFrameContainsWord(\"Memory\", reader));\n                info = reader.readLine();\n\n            } catch (IOException e) {\n                e.printStackTrace();\n            }\n        }\n        return info;\n\n\n    }\n}\n"
  },
  {
    "path": "src/main/java/com/xp/handler/ThreadFrameHandler.java",
    "content": "package com.xp.handler;\n\nimport com.xp.element.ThreadFrame;\nimport com.xp.util.Common;\nimport com.xp.util.ReaderUtil;\n\nimport java.io.BufferedReader;\nimport java.io.IOException;\n\npublic class ThreadFrameHandler extends CommonHandler {\n\n\n\n\n    @Override\n    protected String getMessageFromFile(String info, BufferedReader reader) {\n        if (info.contains(\"T H R E A D\")) {\n\n            try {\n                ThreadFrame.frame.setCurrrentTheadInfo(ReaderUtil.readFrameContainsWord(\"Current thread\", reader));\n                info = reader.readLine();\n                do {\n                    if(info.startsWith(Common.END_FLAG)) {\n                        break;\n                    }\n                    if (info.startsWith(\"Stack\")) {\n                        StringBuilder sb = new StringBuilder();\n                        sb.append(info);\n                        sb.append(Common.NEXT_LINE);\n                        sb.append(ReaderUtil.readFrameWithBlankCount(2,reader));\n                        ThreadFrame.frame.setStack(sb.toString());\n\n                    }\n\n                } while ((info = reader.readLine()) != null);\n\n\n            } catch (IOException e) {\n                e.printStackTrace();\n            }\n        }\n        return info;\n    }\n}\n"
  },
  {
    "path": "src/main/java/com/xp/util/Common.java",
    "content": "package com.xp.util;\n\npublic class Common {\n    public static final String NEXT_LINE=\"\\r\\n\";\n    public static final String LINE=\"-------------------------------------------------------\";\n    public static final String END_FLAG=\"--\";\n}\n"
  },
  {
    "path": "src/main/java/com/xp/util/ReaderUtil.java",
    "content": "package com.xp.util;\n\nimport java.io.BufferedReader;\nimport java.io.IOException;\n\npublic class ReaderUtil {\n\n    public static String readFrameLineWithLength(int length, BufferedReader reader) throws IOException {\n        StringBuilder sb = new StringBuilder();\n        String line = null;\n\n        while ((line = reader.readLine()) != null) {\n            if (line.trim().length() > length) {\n                sb.append(line);\n                while ((line = reader.readLine()) != null) {\n                    if (line.trim().length() > length) {\n                        sb.append(line);\n                    }else {\n                        break;\n                    }\n                }\n                break;\n\n            }\n\n        }\n        return sb.toString();\n\n    }\n\n    public static String readFrameContainsWord(String word, BufferedReader reader) throws IOException {\n        StringBuilder sb = new StringBuilder();\n        String line = null;\n        while ((line = reader.readLine()) != null) {\n            if (line.contains(word)) {\n                sb.append(line);\n                sb.append(Common.NEXT_LINE);\n                break;\n            }\n        }\n        return sb.toString();\n\n    }\n\n    public static String readFrameEndWithBlankLine(BufferedReader reader) throws IOException {\n\n        StringBuilder sb = new StringBuilder();\n        String line = null;\n        while ((line = reader.readLine()) != null) {\n            if (line.trim().equals(\"\")) {\n                break;\n            }\n            sb.append(line);\n            sb.append(Common.NEXT_LINE);\n\n        }\n        return sb.toString();\n\n    }\n\n\n\n\n\n    public static String readFrameWithEnd(String end, BufferedReader reader) throws IOException {\n\n        StringBuilder sb = new StringBuilder();\n        String line = null;\n        while ((line = reader.readLine()) != null) {\n            if (line.trim().equals(end)) {\n                break;\n            }\n            sb.append(line);\n            sb.append(Common.NEXT_LINE);\n\n        }\n        return sb.toString();\n\n    }\n\n    public static String readFrameWithBlankCount(int count, BufferedReader reader) throws IOException {\n\n        StringBuilder sb = new StringBuilder();\n        String line = null;\n        while ((line = reader.readLine()) != null) {\n            if (line.trim().equals(\"\")) {\n                count--;\n                if(count==0){\n                    break;\n                }\n            }\n            sb.append(line);\n            sb.append(Common.NEXT_LINE);\n\n        }\n        return sb.toString();\n\n    }\n}\n"
  }
]