incubator-kato-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From spo...@apache.org
Subject svn commit: r782513 - in /incubator/kato/branches/experimental/PyJVMTI: kato/BinDump.py pyjvmti.c pyjvmti.h pyjvmti_convert.h run.sh tomcat.sh
Date Mon, 08 Jun 2009 03:13:52 GMT
Author: spoole
Date: Mon Jun  8 03:13:51 2009
New Revision: 782513

URL: http://svn.apache.org/viewvc?rev=782513&view=rev
Log:
updated pyjvmti project in xperimental branch with macros to do type conversion between jni
types and native types

Added:
    incubator/kato/branches/experimental/PyJVMTI/pyjvmti_convert.h
Modified:
    incubator/kato/branches/experimental/PyJVMTI/kato/BinDump.py
    incubator/kato/branches/experimental/PyJVMTI/pyjvmti.c
    incubator/kato/branches/experimental/PyJVMTI/pyjvmti.h
    incubator/kato/branches/experimental/PyJVMTI/run.sh
    incubator/kato/branches/experimental/PyJVMTI/tomcat.sh

Modified: incubator/kato/branches/experimental/PyJVMTI/kato/BinDump.py
URL: http://svn.apache.org/viewvc/incubator/kato/branches/experimental/PyJVMTI/kato/BinDump.py?rev=782513&r1=782512&r2=782513&view=diff
==============================================================================
--- incubator/kato/branches/experimental/PyJVMTI/kato/BinDump.py (original)
+++ incubator/kato/branches/experimental/PyJVMTI/kato/BinDump.py Mon Jun  8 03:13:51 2009
@@ -108,7 +108,7 @@
      
     def endThreadSave(self):
         self.trace("Saving %d objects" % len(self.objectlist))
-       # self.saveObjects()
+        self.saveObjects()
        
             
              
@@ -127,7 +127,7 @@
             
     def saveStackTrace(self,count,thread,list):
         
-        self.traceEntry("saving %d stack traces" % count)
+       # self.traceEntry("saving %d stack traces" % count)
         
         header=struct.pack("!hi",103,count)
         self.output.write(header)
@@ -148,13 +148,14 @@
             
             
             javathis=self.getThis(thread.threadid,depth)
+            self.trace("javathis = %d " % javathis)
             self.objectlist.add(javathis)
             
             header=struct.pack("!iiii",methodid,locationid,javathis,count)
             self.output.write(header)
             
             if count > 0 :
-                self.trace("saving %d variables" % count)
+           #     self.trace("saving %d variables" % count)
                 self.saveVariables(thread.threadid,localvars,depth)
             
             depth=depth+1
@@ -166,7 +167,11 @@
         
         self.trace("getting this from thread=%d at %d" % ( threadid , depth ))
         try : 
-            return jvmti.getLocalObject(threadid,depth,0)
+            javathis= jvmti.getLocalObject(threadid,depth,0)
+            thisclass=jvmti.getObjectClass(javathis)
+            clazz=JClass.JClass(thisclass)
+            self.trace("got this %d (%s)" % (javathis ,clazz.signature ))
+            return javathis
         except jvmti.error :
             return 0
         
@@ -265,7 +270,7 @@
     
     def saveVariables(self,threadid,localvars,depth): 
         '''
-        Saves all the local variables of slot...
+        Saves all the local variables in scope
           
         '''
        # self.traceEntry("saving variables")
@@ -276,7 +281,7 @@
           self.output.write(header)
           signature=entry.signature
           self.variables_saved+=1
-          self.trace("saving %s variable at %d " % (signature,entry.slot))
+          #self.trace("saving %s variable at %d " % (signature,entry.slot))
 
           
           try :
@@ -432,7 +437,8 @@
                 clazzid=0
                 if objvalue!=0 :
                     clazzid=jvmti.getObjectClass(objvalue)
-                    print "class object=%d" % clazzid
+		    c=JClass.JClass(clazzid)
+                    print "class object=%d %s" % (clazzid,c.signature)
                     self.objectlist.add(objvalue)
                     
                 header=struct.pack("!ii",objvalue,clazzid)
@@ -738,4 +744,4 @@
                 header=struct.pack("!ii",value,clazzid)
                 self.output.write(header)
                 
-                
\ No newline at end of file
+                

Modified: incubator/kato/branches/experimental/PyJVMTI/pyjvmti.c
URL: http://svn.apache.org/viewvc/incubator/kato/branches/experimental/PyJVMTI/pyjvmti.c?rev=782513&r1=782512&r2=782513&view=diff
==============================================================================
--- incubator/kato/branches/experimental/PyJVMTI/pyjvmti.c (original)
+++ incubator/kato/branches/experimental/PyJVMTI/pyjvmti.c Mon Jun  8 03:13:51 2009
@@ -49,7 +49,7 @@
 
      		  	if (rc != JNI_OK) {
      		  		report("unable to load jni environment");
-     		  		return rc;
+     		  		
      		 	}
 
 
@@ -86,11 +86,12 @@
 
 
 }
-JNICALL myjvmtiHeapObjectCallback(jlong class_tag,
+void JNICALL myjvmtiHeapObjectCallback(jlong class_tag,
      jlong size,
      jlong* tag_ptr,
      void* user_data) {
 	printf("called...");
+     	
 }
 
 static void JNICALL myVMInit(jvmtiEnv *jvmtiptr, JNIEnv *jni, jthread thread)
@@ -124,14 +125,14 @@
 	PyObject *arglist=NULL;
 	PyObject *result=NULL;
 
-	long thread=threadj;
-	long method=methodj;
-	long location=locationj;
-	long exception=exceptionj;
-	long catch_method=catch_methodj;
-	long catch_location=locationj;
+	int thread=JTHREAD2INT(threadj);
+	int method=JMETHOD2INT(methodj);
+	long location=JLOCATION2LONG(locationj);
+	int exception=JOBJECT2INT(exceptionj);
+	int catch_method=JMETHOD2INT(catch_methodj);
+	long catch_location=JLOCATION2LONG(locationj);
 
-	arglist = Py_BuildValue("(llllllll)",vmptr,jvmti_env,thread,method,location,exception,catch_method,catch_location);
+	arglist = Py_BuildValue("(iiiiliil)",vmptr,jvmti_env,thread,method,location,exception,catch_method,catch_location);
 	result = PyObject_CallObject(exception_callback, arglist);
 	if(PyErr_Occurred()) {
 		PyErr_Print();
@@ -204,14 +205,14 @@
    		 return Py_BuildValue(PTYPE, result);
 
 
-#define getValue(FUNC,TYPE,PTYPE,DESC)  \
+#define getValue(FUNC,SRCTYPE,TYPE,PTYPE,DESC)  \
 	CHECK_VALID();\
 \
 			int objectID=0; \
 \
 			PyArg_ParseTuple(args, "i", &objectID);\
 \
-			jobject object=(jobject)objectID;\
+			SRCTYPE object=(SRCTYPE)objectID;\
 			TYPE result=0;\
 \
 			jvmtiError err=(*jvmtiptr)->FUNC(jvmtiptr,object,&result);\
@@ -367,7 +368,7 @@
 
 static PyObject *  jvmti_getIntField(PyObject *self, PyObject *args) {
 
-	printf("\in get int field \n");
+
 	getFieldValue(GetIntField,jint,"i","get int field")
 }
 
@@ -482,7 +483,7 @@
 
 			PyArg_ParseTuple(args, "iii", &threadID,&start_depth,&max_frame_count);
 
-			jthread thread=(jthread)threadID;
+			jthread thread=INT2JTHREAD(threadID);
 			jint count=0;
 			jint jstart=start_depth;
 			jint jmax=max_frame_count;
@@ -520,7 +521,7 @@
 
 		PyArg_ParseTuple(args, "i", &threadID);
 
-		jthread thread=(jthread)threadID;
+		jthread thread=INT2JTHREAD(threadID);
 		jint count=0;
 
 		jvmtiError err=(*jvmtiptr)->GetFrameCount(jvmtiptr,thread,&count);
@@ -545,8 +546,8 @@
 
 			PyArg_ParseTuple(args, "i", &threadID);
 
-			jthread thread=(jthread)threadID;
-			jobject monitor;
+			jthread thread=INT2JTHREAD(threadID);
+			jobject monitor=0;
 
 			jvmtiError err=(*jvmtiptr)->GetCurrentContendedMonitor(jvmtiptr,thread,&monitor);
 
@@ -568,7 +569,7 @@
 
 		PyArg_ParseTuple(args, "i", &threadID);
 
-		jthread thread=(jthread)threadID;
+		jthread thread=INT2JTHREAD(threadID);
 		jint count=0;
 		jobject *monitors=NULL;
 
@@ -670,8 +671,7 @@
 	PyArg_ParseTuple(args, "i", &threadID);
 
 	jvmtiThreadInfo info;
-	jthread thread=(jthread)threadID;
-
+	jthread thread=INT2JTHREAD(threadID);
 
 	jvmtiError err=(*jvmtiptr)->GetThreadInfo(jvmtiptr,thread,&info);
 
@@ -695,7 +695,7 @@
 
 	CHECK_OK("get currentthread");
 
-	int thread=threadj;
+	int thread=JTHREAD2INT(threadj);
 	PyObject *result=Py_BuildValue("i",thread);
 
 	return result;
@@ -724,7 +724,8 @@
 
 
  		for( i=0;i<count;i++) {
- 			PyList_SetItem(list,i,Py_BuildValue("i",classes[i]));
+			int class=JCLASS2INT(classes[i]);
+ 			PyList_SetItem(list,i,Py_BuildValue("i",class));
  		}
 
 
@@ -824,7 +825,7 @@
 	int classid=0;
 	PyArg_ParseTuple(args, "i", &classid);
 
-	jclass clazz=classid;
+	jclass clazz=INT2JCLASS(classid);
 
 	jclass result=(*jniptr)->GetSuperclass(jniptr,clazz);
 
@@ -840,7 +841,7 @@
 	int objid=0;
 	PyArg_ParseTuple(args, "i", &objid);
 
-	jobject objectj=objid;
+	jobject objectj=INT2JOBJECT(objid);
 
 	jclass result=(*jniptr)->GetObjectClass(jniptr,objectj);
 
@@ -874,7 +875,7 @@
 
 	PyArg_ParseTuple(args, "iii", &threadID,&depth,&slot);
 
-	jthread threadj=(jthread)threadID;
+	jthread threadj=INT2JTHREAD(threadID);
 	jint    depthj=depth;
 	jint    slotj=slot;
 	jobject oresult;
@@ -882,16 +883,16 @@
 	jlong 	lresult;
 
 	jvmtiError err=(*jvmtiptr)->GetLocalObject(jvmtiptr,threadj,depthj,slotj,&oresult);
-	if(err==JNI_OK) 	return Py_BuildValue("l", oresult);
+	if(err==JNI_OK) 	return Py_BuildValue("i", oresult);
 
 	err=(*jvmtiptr)->GetLocalInt(jvmtiptr,threadj,depthj,slotj,&iresult);
-	if(err==JNI_OK) 	return Py_BuildValue("l", iresult);
+	if(err==JNI_OK) 	return Py_BuildValue("i", iresult);
 
-	err=(*jvmtiptr)->GetLocalInt(jvmtiptr,threadj,depthj,slotj,&lresult);
+	err=(*jvmtiptr)->GetLocalLong(jvmtiptr,threadj,depthj,slotj,&lresult);
 	if(err==JNI_OK) 	return Py_BuildValue("l", lresult);
 
 	CHECK_OK("Get Local Value");
-
+	return Py_BuildValue("i", 0);
 }
 /**
  * Get Local Variable that is an Object
@@ -910,7 +911,8 @@
 
 	PyArg_ParseTuple(args, "iii", &threadID,&depth,&slot);
 
-	jthread threadj=(jthread)threadID;
+	
+	jthread threadj=INT2JTHREAD(threadID);
 	jint    depthj=depth;
 	jint    slotj=slot;
 	jobject result;
@@ -919,7 +921,7 @@
 
 	CHECK_OK("GetLocalObject");
 
-	return Py_BuildValue("l", result);
+	return Py_BuildValue("i", result);
 }
 
 /**
@@ -939,7 +941,8 @@
 
 	PyArg_ParseTuple(args, "iii", &threadID,&depth,&slot);
 
-	jthread threadj=(jthread)threadID;
+	
+	jthread threadj=INT2JTHREAD(threadID);
 	jint    depthj=depth;
 	jint    slotj=slot;
 	jint result;
@@ -967,7 +970,8 @@
 
 	PyArg_ParseTuple(args, "iii", &threadID,&depth,&slot);
 
-	jthread threadj=(jthread)threadID;
+
+	jthread threadj=INT2JTHREAD(threadID);
 	jint    depthj=depth;
 	jint    slotj=slot;
 	jlong result;
@@ -993,7 +997,7 @@
 
 			PyArg_ParseTuple(args, "i", &methodID);
 
-			jmethodID method=(jmethodID)methodID;
+			jmethodID method=INT2JMETHOD(methodID);
 
 			jvmtiError err=(*jvmtiptr)->GetBytecodes(jvmtiptr,method,&size,&bytes);
 
@@ -1025,8 +1029,7 @@
 
 		PyArg_ParseTuple(args, "i", &methodID);
 
-		jmethodID method=(jmethodID)methodID;
-
+		jmethodID method=INT2JMETHOD(methodID);
 		char  *name=NULL;
 		char  *sig=NULL;
 		char  *generic=NULL;
@@ -1060,7 +1063,7 @@
 
 		PyArg_ParseTuple(args, "i", &classID);
 
-		jclass class=(jclass)classID;
+		jclass class=INT2JCLASS(classID);
 
 
 		char  *sig=NULL;
@@ -1089,11 +1092,9 @@
 
 	PyArg_ParseTuple(args, "ii", &class,&field);
 
-	jclass   classid=(jclass)class;
+	jclass   classid=INT2JCLASS(class);
 	jfieldID fieldid=(jfieldID)field;
 
-	printf("\nget mods=%d %d",classid,fieldid);
-
 	jint result=0;
 
 	jvmtiError err=(*jvmtiptr)->GetFieldModifiers(jvmtiptr,classid,fieldid,&result);
@@ -1121,7 +1122,7 @@
 
 		PyArg_ParseTuple(args, "ii", &classID,&fieldID);
 
-		jclass class=(jclass)classID;
+		jclass   class=INT2JCLASS(classID);
 		jfieldID field=(jfieldID)fieldID;
 
 		char  *name=NULL;
@@ -1157,8 +1158,7 @@
 
 		PyArg_ParseTuple(args, "i", &methodID);
 
-		jmethodID method=(jmethodID)methodID;
-
+		jmethodID method=INT2JMETHOD(methodID);
 		jint countj=0;
 
 		jvmtiLocalVariableEntry *entries=NULL;
@@ -1182,7 +1182,7 @@
 		int i=0;
 		for(i=0;i<count;i++) {
 			jlocation startj=entries[i].start_location;
-			int start=startj;
+			long start=startj;
 			jint lengthj=entries[i].length;
 			int length=lengthj;
 			char *name=entries[i].name;
@@ -1191,7 +1191,7 @@
 			jint slotj=entries[i].slot;
 			int slot=slotj;
 
-			PyObject *value= Py_BuildValue("iisssi",start,length, name,sig,generic,slot);
+			PyObject *value= Py_BuildValue("lisssi",start,length, name,sig,generic,slot);
 			DEALLOC(name);
 			DEALLOC(sig);
 			DEALLOC(generic);
@@ -1207,7 +1207,7 @@
  * Returns the size of the object
  */
 static PyObject *  jvmti_getObjectSize(PyObject *self, PyObject *args) {
-		getValue(GetObjectSize,jlong,"i","Get Object Size")
+		getValue(GetObjectSize,jobject,jlong,"i","Get Object Size")
 }
 static PyObject *  jvmti_getClassLoaderClasses(PyObject *self, PyObject *args) {
 	getList(GetClassLoaderClasses,jclass,"Get ClassLoader classes")
@@ -1216,10 +1216,10 @@
 	getStringValue(GetSourceFileName,"Get Source File Name")
 }
 static PyObject *  jvmti_getClassStatus(PyObject *self, PyObject *args) {
-	getValue(GetClassStatus,jint,"i","Get Class Status")
+	getValue(GetClassStatus,jobject,jint,"i","Get Class Status")
 }
 static PyObject *  jvmti_getClassModifiers(PyObject *self, PyObject *args) {
-	getValue(GetClassModifiers,jint,"i","Get Class Modifiers")
+	getValue(GetClassModifiers,jobject,jint,"i","Get Class Modifiers")
 }
 static PyObject *  jvmti_getClassMethods(PyObject *self, PyObject *args) {
 	getList(GetClassMethods,jmethodID,"Get Class Methods")
@@ -1229,23 +1229,23 @@
 }
 
 static PyObject *  jvmti_getClassLoader(PyObject *self, PyObject *args) {
-	getValue(GetClassLoader,jclass,"i","Get Class Loader")
+	getValue(GetClassLoader,jobject,jclass,"i","Get Class Loader")
 }
 
 static PyObject *  jvmti_getMethodModifiers(PyObject *self, PyObject *args) {
-		getValue(GetMethodModifiers,jint,"i","Get Method Modifiers")
+		getValue(GetMethodModifiers,jmethodID,jint,"i","Get Method Modifiers")
 }
 
 static PyObject *  jvmti_getMaxLocals(PyObject *self, PyObject *args) {
-		getValue(GetMaxLocals,jint,"i","Get Max Locals")
+		getValue(GetMaxLocals,jmethodID,jint,"i","Get Max Locals")
 }
 
 static PyObject *  jvmti_getArgumentsSize(PyObject *self, PyObject *args) {
-		getValue(GetArgumentsSize,jint,"i","Get Arguments Size")
+		getValue(GetArgumentsSize,jmethodID,jint,"i","Get Arguments Size")
 }
 
 static PyObject *  jvmti_isMethodNative(PyObject *self, PyObject *args) {
-		getValue(IsMethodNative,jboolean,"i","Is method native")
+		getValue(IsMethodNative,jmethodID,jboolean,"i","Is method native")
 }
 static PyObject *  jvmti_getImplementedInterfaces(PyObject *self, PyObject *args) {
 	getList(GetImplementedInterfaces,jclass,"Get Implemented Interfaces")
@@ -1260,7 +1260,7 @@
 
 			PyArg_ParseTuple(args, "i", &classID);
 
-			jclass classj=(jclass)classID;
+			jclass classj=INT2JCLASS(classID);
 
 			PyObject* list= PyList_New(100);
 
@@ -1443,7 +1443,7 @@
 
 		  	if (rc != JNI_OK) {
 		  		report("unable to load jni environment");
-		  		return rc;
+		  		return;
 		 	}
 
 		startPython();

Modified: incubator/kato/branches/experimental/PyJVMTI/pyjvmti.h
URL: http://svn.apache.org/viewvc/incubator/kato/branches/experimental/PyJVMTI/pyjvmti.h?rev=782513&r1=782512&r2=782513&view=diff
==============================================================================
--- incubator/kato/branches/experimental/PyJVMTI/pyjvmti.h (original)
+++ incubator/kato/branches/experimental/PyJVMTI/pyjvmti.h Mon Jun  8 03:13:51 2009
@@ -15,6 +15,9 @@
 #ifndef __PY_JVMTI_H
 #define __PY_JVMTI_H
 
+
+#include "pyjvmti_convert.h"
+
 #define CHECK_VALID()   \
 	if(jvmtiptr==NULL) {  \
 			 PyErr_SetString(PYJVMTIError, "jvmti environment  pointer not present");  \

Added: incubator/kato/branches/experimental/PyJVMTI/pyjvmti_convert.h
URL: http://svn.apache.org/viewvc/incubator/kato/branches/experimental/PyJVMTI/pyjvmti_convert.h?rev=782513&view=auto
==============================================================================
--- incubator/kato/branches/experimental/PyJVMTI/pyjvmti_convert.h (added)
+++ incubator/kato/branches/experimental/PyJVMTI/pyjvmti_convert.h Mon Jun  8 03:13:51 2009
@@ -0,0 +1,37 @@
+/*******************************************************************************
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ ******************************************************************************/
+
+#ifndef __PY_JVMTI_CONVERT_H
+#define __PY_JVMTI_CONVERT_H
+
+#define JTHREAD2INT(t)   (int)t
+#define INT2JTHREAD(i)   (jthread)i
+
+#define JMETHOD2INT(t)   (int)t
+#define INT2JMETHOD(i)   (jmethodID)i
+
+
+#define JLOCATION2LONG(t)   (long)t
+#define LONG2JLOCATION(i)   (jlocation)i
+
+
+#define JOBJECT2INT(t)   (int)t
+#define INT2JOBJECT(i)   (jobject)i
+
+
+#define JCLASS2INT(t)   (int)t
+#define INT2JCLASS(i)   (jclass)i
+
+
+#endif

Modified: incubator/kato/branches/experimental/PyJVMTI/run.sh
URL: http://svn.apache.org/viewvc/incubator/kato/branches/experimental/PyJVMTI/run.sh?rev=782513&r1=782512&r2=782513&view=diff
==============================================================================
--- incubator/kato/branches/experimental/PyJVMTI/run.sh (original)
+++ incubator/kato/branches/experimental/PyJVMTI/run.sh Mon Jun  8 03:13:51 2009
@@ -2,4 +2,4 @@
 export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:./build/lib.linux-i686-2.6:/usr/lib/python2.6:/usr/lib/python2.6/config
 export PYTHONSTARTUP=./build/lib.linux-i686-2.6/kato/console.py
 export PYTHONPATH=$PYTHONPATH:.
-/home/spoole/javasdks/sun/jdk1.6.0_12/bin/java   -agentlib:pyjvmti=init.py  -cp .  kato.PauseJVM
+/home/spoole/javasdks/sun/jdk1.6.0_12/bin/java  -Xcheck:jni -agentlib:pyjvmti=init.py  -cp
.  kato.PauseJVM

Modified: incubator/kato/branches/experimental/PyJVMTI/tomcat.sh
URL: http://svn.apache.org/viewvc/incubator/kato/branches/experimental/PyJVMTI/tomcat.sh?rev=782513&r1=782512&r2=782513&view=diff
==============================================================================
--- incubator/kato/branches/experimental/PyJVMTI/tomcat.sh (original)
+++ incubator/kato/branches/experimental/PyJVMTI/tomcat.sh Mon Jun  8 03:13:51 2009
@@ -2,4 +2,4 @@
 export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:./build/lib.linux-i686-2.6:/usr/lib/python2.6:/usr/lib/python2.6/config
 export PYTHONSTARTUP=./build/lib.linux-i686-2.6/kato/console.py
 export PYTHONPATH=$PYTHONPATH:.
-/home/spoole/javasdks/sun/jdk1.6.0_12/bin/java -Dcatalina.base=/home/spoole/workspace-maven/.metadata/.plugins/org.eclipse.wst.server.core/tmp0
-Dcatalina.home=/usr/share/tomcat5.5 -Dwtp.deploy=/home/spoole/workspace-maven/.metadata/.plugins/org.eclipse.wst.server.core/tmp0/wtpwebapps
-Djava.endorsed.dirs=/usr/share/tomcat5.5/common/endorsed  -Dfile.encoding=UTF-8 -agentlib:pyjvmti=init.py
-classpath /usr/share/tomcat5.5/bin/bootstrap.jar:/home/spoole/javasdks/sun/jdk1.6.0_12/lib/tools.jar
org.apache.catalina.startup.Bootstrap start
+/home/spoole/javasdks/sun/jdk1.6.0_12/bin/java -Dcatalina.base=/home/spoole/workspace-maven/.metadata/.plugins/org.eclipse.wst.server.core/tmp0
-Dcatalina.home=/usr/share/tomcat5.5 -Dwtp.deploy=/home/spoole/workspace-maven/.metadata/.plugins/org.eclipse.wst.server.core/tmp0/wtpwebapps
-Djava.endorsed.dirs=/usr/share/tomcat5.5/common/endorsed  -Dfile.encoding=UTF-8 -Xcheck:jni
-agentlib:pyjvmti=init.py -classpath /usr/share/tomcat5.5/bin/bootstrap.jar:/home/spoole/javasdks/sun/jdk1.6.0_12/lib/tools.jar
org.apache.catalina.startup.Bootstrap start



Mime
View raw message