I added a toy program that shows how we need to instrument a so on.
One question I have is that how can I figure out the signature of
current method? For example:
int abs(Integer i) {
// I want to know "Integer i" is the argument here
}
- Sung
---------- Forwarded message ----------
From: SUNG HUN KIM <hun...@csail.mit.edu>
Date: Jul 5, 2007 4:29 PM
Subject: [reCrash Project] r6 - in trunk/reCrash/src: . edu edu/mit
edu/mit/csail edu/mit/csail/pag edu/mit/csail/pag/recrash
edu/mit/csail/pag/recrash/toy
To: ar...@csail.mit.edu, hun...@gmail.com
Author: hunkim
Date: 2007-07-05 16:29:57 -0400 (Thu, 05 Jul 2007)
New Revision: 6
Added:
trunk/reCrash/src/edu/
trunk/reCrash/src/edu/mit/
trunk/reCrash/src/edu/mit/csail/
trunk/reCrash/src/edu/mit/csail/pag/
trunk/reCrash/src/edu/mit/csail/pag/recrash/
trunk/reCrash/src/edu/mit/csail/pag/recrash/TraceItem.java
trunk/reCrash/src/edu/mit/csail/pag/recrash/Tracer.java
trunk/reCrash/src/edu/mit/csail/pag/recrash/toy/
trunk/reCrash/src/edu/mit/csail/pag/recrash/toy/CrashExample.java
trunk/reCrash/src/edu/mit/csail/pag/recrash/toy/CrashExampleInstrumented.java
trunk/reCrash/src/edu/mit/csail/pag/recrash/toy/RePlayCrashExample.java
Log:
- Added toy program which uses Tracer as a proof-of-concept.
Added: trunk/reCrash/src/edu/mit/csail/pag/recrash/TraceItem.java
===================================================================
--- trunk/reCrash/src/edu/mit/csail/pag/recrash/TraceItem.java
(rev 0)
+++ trunk/reCrash/src/edu/mit/csail/pag/recrash/TraceItem.java
2007-07-05 20:29:57 UTC (rev 6)
@@ -0,0 +1,34 @@
+package edu.mit.csail.pag.recrash;
+
+import java.util.Hashtable;
+
+/**
+ * This Item will bs stored and passed to server
+ *
+ * @author hunkim
+ *
+ */
+public class TraceItem {
+ private Hashtable<String, String> currentTrace = new
Hashtable<String, String>();
+
+ private Exception crashedException;
+
+ // TODO: We need to add signature info of current function
+ String signatureInfo;
+
+ void addObject(String name, String serializedXMLString) {
+ currentTrace.put(name, serializedXMLString);
+ }
+
+ String readObject(String name) {
+ return currentTrace.get(name);
+ }
+
+ public Exception getCrashedException() {
+ return crashedException;
+ }
+
+ public void setCrashedException(Exception crashedException) {
+ this.crashedException = crashedException;
+ }
+}
Added: trunk/reCrash/src/edu/mit/csail/pag/recrash/Tracer.java
===================================================================
--- trunk/reCrash/src/edu/mit/csail/pag/recrash/Tracer.java
(rev 0)
+++ trunk/reCrash/src/edu/mit/csail/pag/recrash/Tracer.java
2007-07-05 20:29:57 UTC (rev 6)
@@ -0,0 +1,106 @@
+package edu.mit.csail.pag.recrash;
+
+import java.io.FileReader;
+import java.io.FileWriter;
+import java.io.IOException;
+
+import com.thoughtworks.xstream.XStream;
+
+/**
+ * Untility class for TraceItem
+ *
+ * @author hunkim
+ *
+ */
+public class Tracer {
+ // TODO: need to make this path in configure file or something
+ static final String TRACE_FILE = "/tmp/reCrash.trace";
+
+ static XStream xstream = new XStream();
+
+ static TraceItem traceItem = null;
+
+ /**
+ *
+ * @param object
+ * @param tag
+ */
+ public static void writeTrace(Exception crashedException) {
+ FileWriter fw;
+ traceItem.setCrashedException(crashedException);
+ try {
+ fw = new FileWriter(TRACE_FILE);
+ xstream.toXML(traceItem, fw);
+ fw.close();
+ System.err.println("Write Exception " +
crashedException);
+ } catch (IOException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ }
+ }
+
+ /**
+ *
+ * @param object
+ * @param tag
+ */
+ public static void readTrace() {
+ try {
+ FileReader fr = new FileReader(TRACE_FILE);
+ traceItem = (TraceItem) xstream.fromXML(fr);
+ fr.close();
+ } catch (IOException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ }
+ }
+
+ /**
+ *
+ * @param object
+ * @param tag
+ */
+ public static void addObject(String name, Object object) {
+ assert (name != null);
+
+ // If the object is null, don't save it
+ if (object == null) {
+ return;
+ }
+
+ // New method starts and remove all previous objects
+ // in the Hashtable
+ if (name.equals("this")) {
+ traceItem = new TraceItem();
+ }
+
+ // trace item should not be null
+ // or addObject must start the "this"
+ assert (traceItem != null);
+
+ String serializedXMLString = xstream.toXML(object);
+ traceItem.addObject(name, serializedXMLString);
+
+ return;
+ }
+
+ public static Object readObject(String name) {
+ if (traceItem == null) {
+ // let's read it from file
+ readTrace();
+ }
+
+ // The item should be found
+ assert (traceItem != null);
+
+ String serealizedString = traceItem.readObject(name);
+
+ // No object found or the object was null
+ if (serealizedString == null) {
+ return null;
+ }
+
+ Object object = xstream.fromXML(serealizedString);
+ return object;
+ }
+}
Added: trunk/reCrash/src/edu/mit/csail/pag/recrash/toy/CrashExample.java
===================================================================
--- trunk/reCrash/src/edu/mit/csail/pag/recrash/toy/CrashExample.java
(rev 0)
+++ trunk/reCrash/src/edu/mit/csail/pag/recrash/toy/CrashExample.java
2007-07-05 20:29:57 UTC (rev 6)
@@ -0,0 +1,29 @@
+package edu.mit.csail.pag.recrash.toy;
+
+public class CrashExample {
+ String name = null;
+
+ public CrashExample(String name) {
+ this.name = name;
+ }
+
+ int abs(Integer i) {
+
+ Integer ret = null;
+ if (i < 0) {
+ ret = -i;
+ } else if (i > 0) {
+ ret = i;
+ }
+
+ return ret.intValue();
+ }
+
+ public static void main(String args[]) {
+ CrashExample crash = new CrashExample("test");
+
+ crash.abs(1);
+ crash.abs(-1);
+ crash.abs(0);
+ }
+}
Added: trunk/reCrash/src/edu/mit/csail/pag/recrash/toy/CrashExampleInstrumented.java
===================================================================
--- trunk/reCrash/src/edu/mit/csail/pag/recrash/toy/CrashExampleInstrumented.java
(rev 0)
+++ trunk/reCrash/src/edu/mit/csail/pag/recrash/toy/CrashExampleInstrumented.java
2007-07-05 20:29:57 UTC (rev 6)
@@ -0,0 +1,45 @@
+package edu.mit.csail.pag.recrash.toy;
+
+import edu.mit.csail.pag.recrash.Tracer;
+
+public class CrashExampleInstrumented {
+ String name = null;
+
+ public CrashExampleInstrumented(String name) {
+ this.name = name;
+ }
+
+ int abs(Integer i) {
+ // TODO: how can I get signature of this function and
save it to?
+ // instrumentation
+ Tracer.addObject("this", this);
+ Tracer.addObject("i", i);
+
+ Integer ret = null;
+ if (i < 0) {
+ ret = -i;
+ } else if (i > 0) {
+ ret = i;
+ }
+
+ return ret.intValue();
+ }
+
+ public static void __original_main__(String args[]) {
+
+ CrashExampleInstrumented crash = new
CrashExampleInstrumented("test");
+
+ crash.abs(1);
+ crash.abs(-1);
+ crash.abs(0);
+ }
+
+ // added new main
+ public static void main(String args[]) {
+ try {
+ __original_main__(args);
+ } catch (Exception e) {
+ Tracer.writeTrace(e);
+ }
+ }
+}
Added: trunk/reCrash/src/edu/mit/csail/pag/recrash/toy/RePlayCrashExample.java
===================================================================
--- trunk/reCrash/src/edu/mit/csail/pag/recrash/toy/RePlayCrashExample.java
(rev 0)
+++ trunk/reCrash/src/edu/mit/csail/pag/recrash/toy/RePlayCrashExample.java
2007-07-05 20:29:57 UTC (rev 6)
@@ -0,0 +1,12 @@
+package edu.mit.csail.pag.recrash.toy;
+
+import edu.mit.csail.pag.recrash.Tracer;
+import junit.framework.TestCase;
+
+public class RePlayCrashExample extends TestCase {
+ public void testCrash() {
+ CrashExampleInstrumented crash =
(CrashExampleInstrumented) Tracer.readObject("this");
+ Integer arg1 = (Integer) Tracer.readObject("i");
+ crash.abs(arg1);
+ }
+}