java-callgraph

Trace method execution

6/17/2011 1:19:12 AM

Details

README.md 2(+2 -0)

diff --git a/README.md b/README.md
index 0b48d3d..d51372b 100644
--- a/README.md
+++ b/README.md
@@ -122,6 +122,8 @@ org.apache.lucene.analysis.Token:termLength org.apache.lucene.analysis.Token:ini
 
 * The static call graph generator does not account for methods invoked via
   reflection.
+* The dynamic call graph generator will not work reliably (or at all) for 
+  multithreaded programs
 
 #### Author
 
diff --git a/src/main/java/gr/gousiosg/javacg/dyn/Graph.java b/src/main/java/gr/gousiosg/javacg/dyn/Graph.java
index ddee6e3..aa7d3b1 100644
--- a/src/main/java/gr/gousiosg/javacg/dyn/Graph.java
+++ b/src/main/java/gr/gousiosg/javacg/dyn/Graph.java
@@ -28,6 +28,9 @@
 
 package gr.gousiosg.javacg.dyn;
 
+import java.io.File;
+import java.io.FileWriter;
+import java.io.IOException;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.Comparator;
@@ -40,10 +43,18 @@ public class Graph {
 
     private static Stack<String> stack = new Stack<String>();
     private static Map<Pair<String, String>, Integer> callgraph = new HashMap<Pair<String,String>, Integer>();
+    static FileWriter fw; 
+    static StringBuffer sb;
     
     static {
         Runtime.getRuntime().addShutdownHook(new Thread() {
             public void run() {
+                try {
+                    fw.close();
+                } catch (IOException e) {
+                    // TODO Auto-generated catch block
+                    e.printStackTrace();
+                }
                 //Sort by number of calls
                 List<Pair<String, String>> keys = new ArrayList<Pair<String, String>>();
                 keys.addAll(callgraph.keySet());
@@ -60,9 +71,16 @@ public class Graph {
                 }
             }
         });
+        File log = new File("method-timing.txt");
+        try {
+            fw = new FileWriter(log);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        sb = new StringBuffer();
     }
 
-    public static void push(String callname) {
+    public static void push(String callname) throws IOException {
         if (!stack.isEmpty()) {
             Pair<String, String> p = new Pair<String, String>(stack.peek(), callname); 
             if (callgraph.containsKey(p))
@@ -70,10 +88,20 @@ public class Graph {
             else
                 callgraph.put(p, 1);
         }
+        sb.setLength(0);
+        sb.append(">[").append(stack.size()).append("]");
+        sb.append("[").append(Thread.currentThread().getId()).append("]");
+        sb.append(callname).append("=").append(System.nanoTime()).append("\n");
+        fw.write(sb.toString());
         stack.push(callname);
     }
 
-    public static void pop() {
-        stack.pop();
+    public static void pop() throws IOException {
+        String returnFrom = stack.pop();
+        sb.setLength(0);
+        sb.append("<[").append(stack.size()).append("]");
+        sb.append("[").append(Thread.currentThread().getId()).append("]");
+        sb.append(returnFrom).append("=").append(System.nanoTime()).append("\n");
+        fw.write(sb.toString());
     }
 }
\ No newline at end of file