项目作者: talal830

项目描述 :
A java library for deserializing stack trace and stacking up of stack trace elements for analysis.
高级语言: Java
项目地址: git://github.com/talal830/stackifier.git
创建时间: 2018-08-26T16:39:12Z
项目社区:https://github.com/talal830/stackifier

开源协议:MIT License

下载


Stackifier

Deserializes a given stack trace to java.lang.Throwable and then groups together stack trace elements by library API calls.

Useful for programmatically analyzing stack traces.

Install

Repository

  1. git clone https://github.com/talal830/stackifier.git
  2. cd stackifier
  3. mvn clean install

Dependency

  1. <dependency>
  2. <groupId>com.stackifier</groupId>
  3. <artifactId>stackifier</artifactId>
  4. <version>1.1</version>
  5. </dependency>

Usage

  1. // Create Stackifier using builder
  2. Stackifier stackifier = new Stackifier.Builder()
  3. .add("org.apache.commons") // Add libraries you wish to stackup in stack trace
  4. .add("java", "sun", "junit")
  5. .use(new StackTraceDeserializer()) // Skip this to use default deserializer
  6. .get();
  7. // Some stacktrace as string
  8. String stacktrace = "java.lang.IndexOutOfBoundsException...."
  9. // Use stackifier to stackify stacktrace
  10. Stackified stackified = stackifier.stackify(stacktrace);
  11. // Use stackified object to get stacked groups and so on
  12. List<Group> groups = stackified.getGroups();

Example

Sample Stacktrace

  1. java.lang.IndexOutOfBoundsException: Index: 2, Size: 2
  2. at java.util.ArrayList.rangeCheck(ArrayList.java:653)
  3. at java.util.ArrayList.get(ArrayList.java:429)
  4. at org.apache.commons.collections4.iterators.CollatingIterator.set(CollatingIterator.java:307)
  5. at org.apache.commons.collections4.iterators.CollatingIterator.least(CollatingIterator.java:350)
  6. at org.apache.commons.collections4.iterators.CollatingIterator.next(CollatingIterator.java:245)
  7. at org.apache.commons.collections4.iterators.CollatingIteratorTest.testIterateEvenEven(CollatingIteratorTest.java:135)
  8. at sun.reflect.GeneratedMethodAccessor2.invoke(Unknown Source)
  9. at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
  10. at java.lang.reflect.Method.invoke(Method.java:498)
  11. at junit.framework.TestCase.runTest(TestCase.java:176)
  12. at junit.framework.TestCase.runBare(TestCase.java:141)
  13. at junit.framework.TestResult$1.protect(TestResult.java:122)
  14. at junit.framework.TestResult.runProtected(TestResult.java:142)
  15. at junit.framework.TestResult.run(TestResult.java:125)
  16. at junit.framework.TestCase.run(TestCase.java:129)
  17. at junit.framework.TestSuite.runTest(TestSuite.java:255)
  18. at junit.framework.TestSuite.run(TestSuite.java:250)
  19. at org.junit.internal.runners.JUnit38ClassRunner.run(JUnit38ClassRunner.java:84)
  20. at org.pitest.junit.adapter.CustomRunnerExecutor.run(CustomRunnerExecutor.java:42)
  21. at org.pitest.junit.adapter.AdaptedJUnitTestUnit.execute(AdaptedJUnitTestUnit.java:85)
  22. at org.pitest.mutationtest.execute.MutationTimeoutDecorator$1.run(MutationTimeoutDecorator.java:89)
  23. at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
  24. at java.util.concurrent.FutureTask.run(FutureTask.java:266)
  25. at java.lang.Thread.run(Thread.java:748)

Pretty Printing

  1. Stackified stackified = stackifier.stackify(sample);
  2. stackified.prettyPrint();

Output

  1. (1) java
  2. java.util.ArrayList.rangeCheck(ArrayList.java:653)
  3. java.util.ArrayList.get(ArrayList.java:429)
  4. (2) org.apache.commons
  5. org.apache.commons.collections4.iterators.CollatingIterator.set(CollatingIterator.java:307)
  6. org.apache.commons.collections4.iterators.CollatingIterator.least(CollatingIterator.java:350)
  7. org.apache.commons.collections4.iterators.CollatingIterator.next(CollatingIterator.java:245)
  8. org.apache.commons.collections4.iterators.CollatingIteratorTest.testIterateEvenEven(CollatingIteratorTest.java:135)
  9. (3) sun
  10. sun.reflect.GeneratedMethodAccessor2.invoke(Native Method)
  11. sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
  12. (4) java
  13. java.lang.reflect.Method.invoke(Method.java:498)
  14. (5) junit
  15. junit.framework.TestCase.runTest(TestCase.java:176)
  16. junit.framework.TestCase.runBare(TestCase.java:141)
  17. junit.framework.TestResult$1.protect(TestResult.java:122)
  18. junit.framework.TestResult.runProtected(TestResult.java:142)
  19. junit.framework.TestResult.run(TestResult.java:125)
  20. junit.framework.TestCase.run(TestCase.java:129)
  21. junit.framework.TestSuite.runTest(TestSuite.java:255)
  22. junit.framework.TestSuite.run(TestSuite.java:250)
  23. (6) other
  24. org.junit.internal.runners.JUnit38ClassRunner.run(JUnit38ClassRunner.java:84)
  25. (7) org.pitest
  26. org.pitest.junit.adapter.CustomRunnerExecutor.run(CustomRunnerExecutor.java:42)
  27. org.pitest.junit.adapter.AdaptedJUnitTestUnit.execute(AdaptedJUnitTestUnit.java:85)
  28. org.pitest.mutationtest.execute.MutationTimeoutDecorator$1.run(MutationTimeoutDecorator.java:89)
  29. (8) java
  30. java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
  31. java.util.concurrent.FutureTask.run(FutureTask.java:266)
  32. java.lang.Thread.run(Thread.java:748)

Getting Groups

By group name

  1. List<Group> javaGroups = stackified.getGroups("java"); // here group name is 'java'
  2. for (Group group : groups) {
  3. // access group's stacktrace elements
  4. List<StackTraceElement> elements = group.getElements();
  5. // pretty print
  6. System.out.println(group.prettyString());
  7. ....
  8. }

Output

  1. (1) java
  2. java.util.ArrayList.rangeCheck(ArrayList.java:653)
  3. java.util.ArrayList.get(ArrayList.java:429)
  4. (4) java
  5. java.lang.reflect.Method.invoke(Method.java:498)
  6. (8) java
  7. java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
  8. java.util.concurrent.FutureTask.run(FutureTask.java:266)
  9. java.lang.Thread.run(Thread.java:748)

By group Id

  1. Optional<Group> javaGroups = stackified.getGroup(8); // Getting 'java' group at 8th index
  2. System.out.println(group.get().prettyString());

Output

  1. (8) java
  2. java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
  3. java.util.concurrent.FutureTask.run(FutureTask.java:266)
  4. java.lang.Thread.run(Thread.java:748)

Getting elements directly by group id

  1. List<StackTraceElement> javaGroupElements = stackified.getElements(8); // All stack trace elements in 'java' group at 8th index
  2. ....

Output

  1. java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
  2. java.util.concurrent.FutureTask.run(FutureTask.java:266)
  3. java.lang.Thread.run(Thread.java:748)

License

This project is licensed under the MIT License