You are viewing a plain text version of this content. The canonical link for it is here.
Posted to kato-commits@incubator.apache.org by sp...@apache.org on 2009/06/13 15:56:55 UTC
svn commit: r784411 [3/3] - in
/incubator/kato/branches/experimental/PyJVMTI: ./ ibmtomcat.sh init.py
kato.xml kato/BinDump.py kato/JStackFrame.py kato/XMLDump.py
kato/console.py pyjvmti.c pyjvmti.h pyjvmti_convert.h 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=784411&r1=784410&r2=784411&view=diff
==============================================================================
--- incubator/kato/branches/experimental/PyJVMTI/kato/BinDump.py (original)
+++ incubator/kato/branches/experimental/PyJVMTI/kato/BinDump.py Sat Jun 13 15:56:55 2009
@@ -148,8 +148,11 @@
javathis=self.getThis(thread.threadid,depth)
- self.trace("javathis = %d " % javathis)
- self.objectlist.add(javathis)
+ if javathis!=0 :
+ clazzid=jvmti.getObjectClass(javathis)
+ clazz=JClass.JClass(clazzid)
+ self.trace("javathis = %d %s" % (javathis,clazz.signature))
+ self.objectlist.add(javathis)
header=struct.pack("!iiii",methodid,locationid,javathis,count)
self.output.write(header)
@@ -576,7 +579,7 @@
'''
Save all remembered objects
'''
- self.objectlist.remove(0)
+
objectcount=len(self.objectlist)
if objectcount==0 : return # nothing to do
@@ -643,6 +646,7 @@
self.output.write(header)
elif signature=='[C' :
arraylen=0
+ chararray=[]
if value != 0 :
chararray=jvmti.getCharArrayElements(value)
arraylen=len(chararray)
Added: incubator/kato/branches/experimental/PyJVMTI/kato/JStackFrame.py
URL: http://svn.apache.org/viewvc/incubator/kato/branches/experimental/PyJVMTI/kato/JStackFrame.py?rev=784411&view=auto
==============================================================================
--- incubator/kato/branches/experimental/PyJVMTI/kato/JStackFrame.py (added)
+++ incubator/kato/branches/experimental/PyJVMTI/kato/JStackFrame.py Sat Jun 13 15:56:55 2009
@@ -0,0 +1,51 @@
+#*******************************************************************************
+ #* 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.
+ #******************************************************************************"
+
+import kato.JMethod as JMethod
+import jvmti
+
+class JStackFrame(object):
+
+ thread=None
+ methodID=None
+ locationID=None
+ depth=0
+
+ def __init__(self,t,frame,d):
+
+ self.thread=t;
+ self.methodID=frame[0]
+ self.locationID=frame[1]
+ self.depth=d
+
+ @property
+ def location(self):
+ if self.locationID is None :
+ return -1
+ return self.locationID
+
+ @property
+ def method(self):
+ return JMethod.JMethod(self.methodID)
+
+ @property
+ def this(self):
+
+ try :
+ javathis= jvmti.getLocalObject(self.thread.threadid,self.depth,0)
+ thisclass=jvmti.getObjectClass(javathis)
+ return javathis
+ except jvmti.error :
+ return 0
+
\ No newline at end of file
Added: incubator/kato/branches/experimental/PyJVMTI/kato/XMLDump.py
URL: http://svn.apache.org/viewvc/incubator/kato/branches/experimental/PyJVMTI/kato/XMLDump.py?rev=784411&view=auto
==============================================================================
--- incubator/kato/branches/experimental/PyJVMTI/kato/XMLDump.py (added)
+++ incubator/kato/branches/experimental/PyJVMTI/kato/XMLDump.py Sat Jun 13 15:56:55 2009
@@ -0,0 +1,954 @@
+ #*******************************************************************************
+ #* 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.
+ #******************************************************************************"
+
+from kato.JField import *
+from kato.JClass import *
+from kato.JThreadGroup import *
+from kato.JThread import *
+from kato.JStackFrame import *
+from kato.JMethod import *
+
+import jvmti
+import base64
+import array
+
+methods=set()
+classes=set()
+
+def katodump(filename="kato.xml"):
+ '''
+ dump to provided file in XML format
+ '''
+ methods=set()
+ classes=set()
+ kml=open(filename,"w")
+
+ # write xml header
+ writeHeader(kml)
+
+ saveThreads(kml)
+
+ saveThreadGroups(kml)
+
+ writeTrailer(kml)
+
+ kml.close()
+
+
+def saveThreadGroups(kml):
+
+ groups=jvmti.getTopThreadGroups()
+ for group in groups :
+ g=JThreadGroup(group)
+ saveThreadGroup(kml,g)
+
+def saveThreadGroup(kml,group):
+ '''
+ Saves a JThreadGroup to file
+ '''
+ parentgroup=group.parentThreadGroupID;
+ if parentgroup==None : parentgroup=0
+ kml.write('<threadgroup id="%d" parent="%d" maxpriority="%d" isdaemon="%d">\n' % (group.threadid ,parentgroup,group.maxpriority,group.isdaemon ) )
+ kml.write("</threadgroup>\n")
+
+def saveThreads(kml):
+ threads=jvmti.getAllThreads()
+
+ for thread in threads :
+ t=JThread(thread)
+ saveThread(kml,t)
+
+def saveClass(kml,classid):
+ '''
+ save class
+ '''
+
+
+ if classid in classes :
+ return
+
+
+ classes.add(classid)
+ clazz=JClass(classid)
+
+
+ print "saving class %s (%d)" % (clazz.signature , classid )
+
+ kml.write('<class id="%d" loader="%d" name="%s" > \n' % (clazz.classid,clazz.classloader, clazz.signature))
+
+ for f in clazz.fields :
+ field=JField(clazz,f)
+ if field.isStatic : saveStaticField(kml,clazz,field)
+
+ kml.write("</class>\n")
+ return clazz;
+
+
+def saveInstance(kml,classid,objid):
+ '''
+ save instance
+ '''
+ clazz= saveClass(kml,classid)
+
+
+ print "saving instance "
+
+ kml.write('<instance classid="%d" id="%d"> \n' % (classid,objid))
+
+ for f in clazz.fields :
+ field=JField(clazz,f)
+ if field.isStatic is False : saveInstanceField(kml,field,objid)
+
+ kml.write("</class>\n")
+
+
+
+def saveStaticField(kml,clazz,field):
+
+ print "saving static field %s in clazz %s " % (field.name ,clazz.signature)
+ kml.write('<field static="true" signature="%s" name="%s">\n' % (field.signature, field.name) )
+
+ signature=field.signature
+
+ try :
+
+ if signature=='Z' :
+ value=jvmti.getStaticBooleanField(clazz.classid,field.fieldid)
+ kml.write('<data value="%d"/>\n' % value)
+
+ elif signature=='C' :
+ value=jvmti.getStaticCharField(clazz.classid,field.fieldid)
+ kml.write('<data value="%c"/>\n' % value)
+
+ elif signature=='I' :
+ value=jvmti.getStaticIntField(clazz.classid,field.fieldid)
+ kml.write('<data value="%d"/>\n' % value)
+
+ elif signature=='B' :
+ value=jvmti.getStaticByteField(clazz.classid,field.fieldid)
+ kml.write('<data value="%d"/>\n' % value)
+
+ elif signature=='S' :
+ value=jvmti.getStaticShortField(clazz.classid,field.fieldid)
+ kml.write('<data value="%d"/>\n' % value)
+
+ elif signature=='J' :
+ value=jvmti.getStaticLongField(clazz.classid,field.fieldid)
+ kml.write('<data value="%d"/>\n' % value)
+
+ elif signature=='F' :
+ value=jvmti.getStaticFloatField(clazz.classid,field.fieldid)
+ kml.write('<data value="%f"/>\n' % value)
+
+ elif signature=='D' :
+ value=jvmti.getStaticDoubleField(clazz.classid,field.fieldid)
+ kml.write('<data value="%d"/>\n' % value)
+
+ elif signature=='Ljava/lang/String;' :
+ objvalue=jvmti.getStaticObjectField(clazz.classid,field.fieldid)
+ if objvalue == 0 :
+ kml.write('<data nullvalue="true"/>\n')
+ else :
+ string=jvmti.getStringUTFChars(objvalue)
+ kml.write('<data value="%s"/>\n' % string)
+
+
+ elif signature=='[C' :
+
+
+ objvalue=jvmti.getStaticObjectField(clazz.classid,field.fieldid)
+ chararray=jvmti.getCharArrayElements(objvalue)
+ arraylen=len(chararray)
+ kml.write('<data ref="%d" length="%d">\n' % (objvalue,arraylen))
+
+ data=array.array('c')
+
+ for element in chararray :
+ data.append(element)
+
+ kml.write("<![CDATA[%s]]>\n" % base64.b64encode(data.tostring()))
+
+ kml.write("</data>\n")
+
+
+ elif signature=='[I' :
+ objvalue=jvmti.getStaticObjectField(clazz.classid,field.fieldid)
+ intarray=jvmti.getIntArrayElements(objvalue)
+ arraylen=len(intarray)
+
+ kml.write('<data ref="%d" length="%d">\n' % (objvalue,arraylen))
+
+ data=array.array('i')
+
+ for element in intarray :
+ data.append(element)
+
+ kml.write("<![CDATA[%s]]>\n" % base64.b64encode(data.tostring()))
+
+ kml.write("</data>\n")
+
+
+ elif signature=='[B' :
+ objvalue=jvmti.getStaticObjectField(clazz.classid,field.fieldid)
+ barray=jvmti.getByteArrayElements(objvalue)
+ arraylen=len(barray)
+
+ kml.write('<data ref="%d" length="%d">\n' % (objvalue,arraylen))
+
+ data=array.array('b')
+
+ for element in barray :
+ data.append(element)
+
+ kml.write("<![CDATA[%s]]>\n" % base64.b64encode(data.tostring()))
+
+ kml.write("</data>\n")
+
+ elif signature=='[Z' :
+ objvalue=jvmti.getStaticObjectField(clazz.classid,field.fieldid)
+ barray=jvmti.getBooleanArrayElements(objvalue)
+ arraylen=len(barray)
+
+ kml.write('<data ref="%d" length="%d">\n' % (objvalue,arraylen))
+
+ data=array.array('b')
+
+ for element in barray :
+ data.append(element)
+
+ kml.write("<![CDATA[%s]]>\n" % base64.b64encode(data.tostring()))
+
+ kml.write("</data>\n")
+
+ elif signature=='[S' :
+ objvalue=jvmti.getStaticObjectField(clazz.classid,field.fieldid)
+ sarray=jvmti.getShortArrayElements(objvalue)
+ arraylen=len(sarray)
+ kml.write('<data ref="%d" length="%d">\n' % (objvalue,arraylen))
+
+ data=array.array('h')
+
+ for element in sarray :
+ data.append(element)
+
+ kml.write("<![CDATA[%s]]>\n" % base64.b64encode(data.tostring()))
+
+ kml.write("</data>\n")
+
+
+
+ elif signature=='[J' :
+ objvalue=jvmti.getStaticObjectField(clazz.classid,field.fieldid)
+ larray=jvmti.getLongArrayElements(objvalue)
+ arraylen=len(larray)
+ kml.write('<data ref="%d" length="%d">\n' % (objvalue,arraylen))
+
+ data=array.array('l')
+
+ for element in larray :
+ data.append(element)
+
+ kml.write("<![CDATA[%s]]>\n" % base64.b64encode(data.tostring()))
+
+ kml.write("</data>\n")
+
+
+
+ elif signature=='[F' :
+ objvalue=jvmti.getStaticObjectField(clazz.classid,field.fieldid)
+ farray=jvmti.getFloatArrayElements(objvalue)
+ arraylen=len(farray)
+ kml.write('<data ref="%d" length="%d">\n' % (objvalue,arraylen))
+
+ data=array.array('f')
+
+ for element in farray :
+ data.append(element)
+
+ kml.write("<![CDATA[%s]]>\n" % base64.b64encode(data.tostring()))
+
+ kml.write("</data>\n")
+
+
+
+ elif signature=='[D' :
+ objvalue=jvmti.getStaticObjectField(clazz.classid,field.fieldid)
+ darray=jvmti.getDoubleArrayElements(objvalue)
+ arraylen=len(darray)
+ kml.write('<data ref="%d" length="%d">\n' % (objvalue,arraylen))
+
+ data=array.array('d')
+
+ for element in darray :
+ data.append(element)
+
+ kml.write("<![CDATA[%s]]>\n" % base64.b64encode(data.tostring()))
+
+ kml.write("</data>\n")
+
+ elif signature=='[Ljava/lang/String;' :
+
+ kml.write('<skipping sig="%s"/></field>\n' % signature)
+ return
+ objvalue=jvmti.getStaticObjectField(clazz.classid,field.fieldid)
+ if objvalue==0 :
+ arraylen=0
+
+ else :
+ arraylen=jvmti.getArrayLength(objvalue)
+
+ kml.write('<data ref="%d" length="%d">\n' % (objvalue,arraylen))
+
+ if arraylen > 0 :
+ for i in range (0 ,arraylen) :
+ elementID=jvmti.getObjectArrayElement(objvalue,i)
+ string=jvmti.getStringUTFChars(elementID)
+ kml.write('<entry id="%d" value="%s"/>' % (elementID,string))
+
+ kml.write("</data>\n")
+
+
+ elif signature[0]=='[' :
+ kml.write('<skipping sig="%s"/></field>\n' % signature)
+ return
+ objvalue=jvmti.getStaticObjectField(clazz.classid,field.fieldid)
+ if objvalue==0 :
+ arraylen=0
+
+ else :
+ arraylen=jvmti.getArrayLength(objvalue)
+
+ kml.write('<data ref="%d" length="%d">\n' % (objvalue,arraylen))
+ if arraylen > 0 :
+ data=array.array('i')
+ for i in range (0 ,arraylen) :
+ elementID=jvmti.getObjectArrayElement(objvalue,i)
+ data.append(elementID)
+ kml.write("<![CDATA[%s]]>\n" % base64.b64encode(data.tostring()))
+
+ kml.write("</data>\n")
+
+ else :
+ kml.write('<skipping sig="%s"/></field>\n' % signature)
+ return
+ objvalue=jvmti.getStaticObjectField(clazz.classid,field.fieldid)
+
+ clazzid=0
+ if objvalue!=0 :
+ clazzid=jvmti.getObjectClass(objvalue)
+ saveClass(kml,clazzid)
+
+ kml.write('<data classid="%d" object="%d">\n' % (clazzid,objvalue))
+ kml.write("</data>\n")
+
+ except jvmti.error :
+
+ print "err..." , jvmti.error , signature
+
+
+
+ kml.write('</field>\n')
+
+def saveInstanceField(kml,field,objectid):
+
+ print "saving instance field %s " % (field.name)
+ kml.write('<field signature="%s" name="%s"/>\n' % (field.signature, field.name) )
+ signature=field.signature
+
+ try :
+
+ if signature=='Z' :
+ value=jvmti.getBooleanField(field.fieldid,objectid)
+ kml.write('<data value="%d"/>\n' % value)
+
+ elif signature=='C' :
+ value=jvmti.getCharField(field.fieldid,objectid)
+ kml.write('<data value="%c"/>\n' % value)
+
+ elif signature=='I' :
+ value=jvmti.getIntField(field.fieldid,objectid)
+ kml.write('<data value="%d"/>\n' % value)
+
+ elif signature=='B' :
+ value=jvmti.getByteField(field.fieldid,objectid)
+ kml.write('<data value="%d"/>\n' % value)
+
+ elif signature=='S' :
+ value=jvmti.getShortField(field.fieldid,objectid)
+ kml.write('<data value="%d"/>\n' % value)
+
+ elif signature=='J' :
+ value=jvmti.getLongField(field.fieldid,objectid)
+ kml.write('<data value="%d"/>\n' % value)
+
+ elif signature=='F' :
+ value=jvmti.getFloatField(field.fieldid,objectid)
+ kml.write('<data value="%f"/>\n' % value)
+
+ elif signature=='D' :
+ value=jvmti.getDoubleField(field.fieldid,objectid)
+ kml.write('<data value="%d"/>\n' % value)
+
+ elif signature=='Ljava/lang/String;' :
+ objvalue=jvmti.getObjectField(field.fieldid,objectid)
+ if objvalue == 0 :
+ kml.write('<null/>\n')
+ else :
+ string=jvmti.getStringUTFChars(objvalue)
+ kml.write('<data value="%s"/>\n' % string)
+
+
+ elif signature=='[C' :
+
+
+ objvalue=jvmti.getObjectField(field.fieldid,objectid)
+ if objvalue == 0 :
+ kml.write('<null/>\n')
+ else :
+
+ chararray=jvmti.getCharArrayElements(objvalue)
+ arraylen=len(chararray)
+ kml.write('<data ref="%d" length="%d">\n' % (objvalue,arraylen))
+
+ data=array.array('c')
+
+ for element in chararray :
+ data.append(element)
+
+ kml.write("<![CDATA[%s]]>\n" % base64.b64encode(data.tostring()))
+
+ kml.write("</data>\n")
+
+
+ elif signature=='[I' :
+ objvalue=jvmti.getObjectField(field.fieldid,objectid)
+ if objvalue == 0 :
+ kml.write('<null/>\n')
+ else :
+ intarray=jvmti.getIntArrayElements(objvalue)
+ arraylen=len(intarray)
+
+ kml.write('<data ref="%d" length="%d">\n' % (objvalue,arraylen))
+
+ data=array.array('i')
+
+ for element in intarray :
+ data.append(element)
+
+ kml.write("<![CDATA[%s]]>\n" % base64.b64encode(data.tostring()))
+
+ kml.write("</data>\n")
+
+
+ elif signature=='[B' :
+ objvalue=jvmti.getObjectField(field.fieldid,objectid)
+ if objvalue == 0 :
+ kml.write('<null/>\n')
+ else :
+ barray=jvmti.getByteArrayElements(objvalue)
+ arraylen=len(barray)
+
+ kml.write('<data ref="%d" length="%d">\n' % (objvalue,arraylen))
+
+ data=array.array('b')
+
+ for element in barray :
+ data.append(element)
+
+ kml.write("<![CDATA[%s]]>\n" % base64.b64encode(data.tostring()))
+
+ kml.write("</data>\n")
+
+ elif signature=='[Z' :
+ objvalue=jvmti.getObjectField(field.fieldid,objectid)
+ if objvalue == 0 :
+ kml.write('<null/>\n')
+ else :
+
+ barray=jvmti.getBooleanArrayElements(objvalue)
+ arraylen=len(barray)
+
+ kml.write('<data ref="%d" length="%d">\n' % (objvalue,arraylen))
+
+ data=array.array('b')
+
+ for element in barray :
+ data.append(element)
+
+ kml.write("<![CDATA[%s]]>\n" % base64.b64encode(data.tostring()))
+
+ kml.write("</data>\n")
+
+ elif signature=='[S' :
+ objvalue=jvmti.getObjectField(field.fieldid,objectid)
+ if objvalue == 0 :
+ kml.write('<null/>\n')
+ else :
+ sarray=jvmti.getShortArrayElements(objvalue)
+ arraylen=len(sarray)
+ kml.write('<data ref="%d" length="%d">\n' % (objvalue,arraylen))
+
+ data=array.array('h')
+
+ for element in sarray :
+ data.append(element)
+
+ kml.write("<![CDATA[%s]]>\n" % base64.b64encode(data.tostring()))
+
+ kml.write("</data>\n")
+
+
+
+ elif signature=='[J' :
+ objvalue=jvmti.getObjectField(field.fieldid,objectid)
+ if objvalue == 0 :
+ kml.write('<null/>\n')
+ else :
+ larray=jvmti.getLongArrayElements(objvalue)
+ arraylen=len(larray)
+ kml.write('<data ref="%d" length="%d">\n' % (objvalue,arraylen))
+
+ data=array.array('l')
+
+ for element in larray :
+ data.append(element)
+
+ kml.write("<![CDATA[%s]]>\n" % base64.b64encode(data.tostring()))
+
+ kml.write("</data>\n")
+
+
+
+ elif signature=='[F' :
+ objvalue=jvmti.getObjectField(field.fieldid,objectid)
+ if objvalue == 0 :
+ kml.write('<null/>\n')
+ else :
+
+ farray=jvmti.getFloatArrayElements(objvalue)
+ arraylen=len(farray)
+ kml.write('<data ref="%d" length="%d">\n' % (objvalue,arraylen))
+
+ data=array.array('f')
+
+ for element in farray :
+ data.append(element)
+
+ kml.write("<![CDATA[%s]]>\n" % base64.b64encode(data.tostring()))
+
+ kml.write("</data>\n")
+
+
+
+ elif signature=='[D' :
+ objvalue=jvmti.getObjectField(field.fieldid,objectid)
+ if objvalue == 0 :
+ kml.write('<null/>\n')
+ else :
+
+ darray=jvmti.getDoubleArrayElements(objvalue)
+ arraylen=len(darray)
+ kml.write('<data ref="%d" length="%d">\n' % (objvalue,arraylen))
+
+ data=array.array('d')
+
+ for element in darray :
+ data.append(element)
+
+ kml.write("<![CDATA[%s]]>\n" % base64.b64encode(data.tostring()))
+
+ kml.write("</data>\n")
+
+ elif signature=='[Ljava/lang/String;' :
+
+ kml.write('<skipping sig="%s"/></field>\n' % signature)
+ return
+ objvalue=jvmti.getObjectField(field.fieldid,objectid)
+ if objvalue==0 :
+ arraylen=0
+
+ else :
+ arraylen=jvmti.getArrayLength(objvalue)
+
+ kml.write('<data ref="%d" length="%d">\n' % (objvalue,arraylen))
+
+ if arraylen > 0 :
+ for i in range (0 ,arraylen) :
+ elementID=jvmti.getObjectArrayElement(objvalue,i)
+ if elementID==0 :
+ kml.write('<null/>\n')
+ else :
+ string=jvmti.getStringUTFChars(elementID)
+ kml.write('<entry id="%d" value="%s"/>' % (elementID,string))
+
+ kml.write("</data>\n")
+
+
+ elif signature[0]=='[' :
+ kml.write('<skipping sig="%s"/></field>\n' % signature)
+ return
+ objvalue=jvmti.getObjectField(field.fieldid,objectid)
+ if objvalue==0 :
+ arraylen=0
+
+ else :
+ arraylen=jvmti.getArrayLength(objvalue)
+
+ kml.write('<data ref="%d" length="%d">\n' % (objvalue,arraylen))
+ if arraylen > 0 :
+ data=array.array('i')
+ for i in range (0 ,arraylen) :
+ elementID=jvmti.getObjectArrayElement(objvalue,i)
+ data.append(elementID)
+ kml.write("<![CDATA[%s]]>\n" % base64.b64encode(data.tostring()))
+
+ kml.write("</data>\n")
+
+ else :
+ kml.write('<skipping sig="%s"/></field>\n' % signature)
+ return
+ objvalue=jvmti.getObjectField(field.fieldid,objectid)
+
+ clazzid=0
+ if objvalue!=0 :
+ clazzid=jvmti.getObjectClass(objvalue)
+ saveClass(kml,clazzid)
+
+ kml.write('<data classid="%d" object="%d">\n' % (clazzid,objvalue))
+ kml.write("</data>\n")
+
+ except jvmti.error :
+
+ print "err..." , jvmti.error , signature
+
+ kml.write('</field>\n')
+
+def saveThread(kml,thread):
+ '''
+ Saves JThread to output file
+ '''
+
+ kml.write('<thread id="%d" name="%s" priority="%d" isdaemon="%d" threadgroup="%d" contendedmonitor="%d">\n' % (thread.threadid,thread.name,thread.priority,thread.isDaemon,thread.threadGroupID,thread.contendedMonitor))
+
+ saveMonitors(kml,thread)
+
+ saveStackTrace(kml,thread)
+
+ kml.write("</thread>\n")
+
+def saveMonitors(kml,thread):
+
+
+ for monitor in thread.ownedMonitorIDs :
+ kml.write('<monitor id="%d"/>\n' % monitor )
+
+def saveStackTrace(kml,thread):
+
+ depth=0
+
+ for frame in thread.stacktrace :
+ f=JStackFrame(thread,frame,depth)
+ saveStackFrame(kml,thread.threadid,f,depth)
+ depth=depth+1
+
+def saveStackFrame(kml,threadid,frame,depth):
+
+ this=frame.this
+
+ writeMethod(kml,frame.method)
+
+
+ kml.write('<frame this="%d" methodid="%d" location="%d">\n' % (this,frame.methodID,frame.locationID))
+ method=frame.method
+
+
+
+ localvars=method.localVariableTable
+
+ for entry in localvars :
+
+ if inRange(entry,frame.location) :
+ saveVariable(kml,entry,threadid,depth)
+
+ kml.write("</frame>\n")
+
+
+
+def inRange(entry,loc):
+
+ if loc == -1 : return False
+
+ start=entry.start # where the variable starts
+ end=start+entry.length # where it ends
+
+ if loc >= start and loc <= end : return True
+
+ return False
+
+def writeMethod(kml,method):
+
+ if method.methodid in methods :
+ return
+
+ methods.add(method.methodid)
+
+
+ kml.write('<method id="%d" name="%s" sig="%s" maxlocals="%d">\n' % (method.methodid,method.name,method.signature,method.maxlocals))
+
+ localvars=method.localVariableTable
+
+ for var in localvars :
+ #LocalVariableTableEntry
+ kml.write('<var sig="%s" start="%d" length="%d" slot="%d"/>\n' % (var.signature,var.start,var.length,var.slot))
+
+
+
+ kml.write("</method>\n")
+
+def writeHeader(kml):
+ kml.write("<kato>\n")
+
+def writeTrailer(kml):
+ kml.write("</kato>")
+
+def saveVariable(kml,entry,threadid,depth):
+ signature=entry.signature
+ print "saving var " , signature
+
+
+ try :
+
+ if signature=='Z' :
+ boolvalue=jvmti.getLocalInt(threadid,depth,entry.slot)
+ kml.write('<localvar slot="%d" value="%d"/>\n' % (entry.slot,boolvalue))
+
+ elif signature=='C' :
+ charvalue=jvmti.getLocalInt(threadid,depth,entry.slot)
+ kml.write('<localvar slot="%d" value="%c"/>\n' % (entry.slot,charvalue))
+
+ elif signature=='I' :
+ intvalue=jvmti.getLocalInt(threadid,depth,entry.slot)
+ kml.write('<localvar slot="%d" value="%d"/>\n' % (entry.slot,intvalue))
+
+ elif signature=='B' :
+ bytevalue=jvmti.getLocalInt(threadid,depth,entry.slot)
+ kml.write('<localvar slot="%d" value="%d"/>\n' % (entry.slot,bytevalue))
+
+ elif signature=='S' :
+ shortvalue=jvmti.getLocalInt(threadid,depth,entry.slot)
+ kml.write('<localvar slot="%d" value="%d"/>\n' % (entry.slot,shortvalue))
+
+ elif signature=='J' :
+ longvalue=jvmti.getLocalLong(threadid,depth,entry.slot)
+ kml.write('<localvar slot="%d" value="%d"/>\n' % (entry.slot,longvalue))
+
+ elif signature=='Ljava/lang/String;' :
+ objvalue=jvmti.getLocalObject(threadid,depth,entry.slot)
+ if objvalue==0 :
+ kml.write('<localvar slot="%d" nullvalue="true"/>\n' % entry.slot)
+ else :
+ string=jvmti.getStringUTFChars(objvalue)
+ kml.write('<localvar slot="%d" value="%s"/>\n' % (entry.slot,string))
+
+ elif signature=='[C' :
+
+
+ objvalue=jvmti.getLocalObject(threadid,depth,entry.slot)
+ chararray=jvmti.getCharArrayElements(objvalue)
+ arraylen=len(chararray)
+ kml.write('<localvar slot="%d" ref="%d" length="%d">\n' % (entry.slot,objvalue,arraylen))
+
+
+ data=array.array('c')
+
+ for element in chararray :
+ data.append(element)
+
+ kml.write("<![CDATA[%s]]>\n" % base64.b64encode(data.tostring()))
+
+ kml.write("</localvar>\n")
+
+
+ elif signature=='[I' :
+ objvalue=jvmti.getLocalObject(threadid,depth,entry.slot)
+ intarray=jvmti.getIntArrayElements(objvalue)
+ arraylen=len(intarray)
+
+ kml.write('<localvar slot="%d" ref="%d" length="%d">\n' % (entry.slot,objvalue,arraylen))
+
+ data=array.array('i')
+
+ for element in intarray :
+ data.append(element)
+
+ kml.write("<![CDATA[%s]]>\n" % base64.b64encode(data.tostring()))
+
+ kml.write("</localvar>\n")
+
+
+ elif signature=='[B' :
+ objvalue=jvmti.getLocalObject(threadid,depth,entry.slot)
+ barray=jvmti.getByteArrayElements(objvalue)
+ arraylen=len(barray)
+
+ kml.write('<localvar slot="%d" ref="%d" length="%d">\n' % (entry.slot,objvalue,arraylen))
+
+ data=array.array('b')
+
+ for element in barray :
+ data.append(element)
+
+ kml.write("<![CDATA[%s]]>\n" % base64.b64encode(data.tostring()))
+
+ kml.write("</localvar>\n")
+
+ elif signature=='[Z' :
+ objvalue=jvmti.getLocalObject(threadid,depth,entry.slot)
+ barray=jvmti.getBooleanArrayElements(objvalue)
+ arraylen=len(barray)
+
+ kml.write('<localvar slot="%d" ref="%d" length="%d">\n' % (entry.slot,objvalue,arraylen))
+
+ data=array.array('b')
+
+ for element in barray :
+ data.append(element)
+
+ kml.write("<![CDATA[%s]]>\n" % base64.b64encode(data.tostring()))
+
+ kml.write("</localvar>\n")
+
+ elif signature=='[S' :
+ objvalue=jvmti.getLocalObject(threadid,depth,entry.slot)
+ sarray=jvmti.getShortArrayElements(objvalue)
+ arraylen=len(sarray)
+ kml.write('<localvar slot="%d" ref="%d" length="%d">\n' % (entry.slot,objvalue,arraylen))
+
+ data=array.array('h')
+
+ for element in sarray :
+ data.append(element)
+
+ kml.write("<![CDATA[%s]]>\n" % base64.b64encode(data.tostring()))
+
+ kml.write("</localvar>\n")
+
+
+
+ elif signature=='[J' :
+ objvalue=jvmti.getLocalObject(threadid,depth,entry.slot)
+ larray=jvmti.getLongArrayElements(objvalue)
+ arraylen=len(larray)
+ kml.write('<localvar slot="%d" ref="%d" length="%d">\n' % (entry.slot,objvalue,arraylen))
+
+ data=array.array('l')
+
+ for element in larray :
+ data.append(element)
+
+ kml.write("<![CDATA[%s]]>\n" % base64.b64encode(data.tostring()))
+
+ kml.write("</localvar>\n")
+
+
+
+ elif signature=='[F' :
+ objvalue=jvmti.getLocalObject(threadid,depth,entry.slot)
+ farray=jvmti.getFloatArrayElements(objvalue)
+ arraylen=len(farray)
+ kml.write('<localvar slot="%d" ref="%d" length="%d">\n' % (entry.slot,objvalue,arraylen))
+
+ data=array.array('f')
+
+ for element in farray :
+ data.append(element)
+
+ kml.write("<![CDATA[%s]]>\n" % base64.b64encode(data.tostring()))
+
+ kml.write("</localvar>\n")
+
+
+
+ elif signature=='[D' :
+ objvalue=jvmti.getLocalObject(threadid,depth,entry.slot)
+ darray=jvmti.getDoubleArrayElements(objvalue)
+ arraylen=len(darray)
+ kml.write('<localvar slot="%d" ref="%d" length="%d">\n' % (entry.slot,objvalue,arraylen))
+
+ data=array.array('d')
+
+ for element in darray :
+ data.append(element)
+
+ kml.write("<![CDATA[%s]]>\n" % base64.b64encode(data.tostring()))
+
+ kml.write("</localvar>\n")
+
+ elif signature=='[Ljava/lang/String;' :
+
+
+ objvalue=jvmti.getLocalObject(threadid,depth,entry.slot)
+ if objvalue==0 :
+ arraylen=0
+
+ else :
+ arraylen=jvmti.getArrayLength(objvalue)
+
+ kml.write('<localvar slot="%d" ref="%d" length="%d">\n' % (entry.slot,objvalue,arraylen))
+
+ if arraylen > 0 :
+ for i in range (0 ,arraylen) :
+ elementID=jvmti.getObjectArrayElement(objvalue,i)
+ string=jvmti.getStringUTFChars(elementID)
+ kml.write('<entry id="%d" value="%s"/>' % (elementID,string))
+
+ kml.write("</localvar>\n")
+
+
+ elif signature[0]=='[' :
+ objvalue=jvmti.getLocalObject(threadid,depth,entry.slot)
+ if objvalue==0 :
+ arraylen=0
+
+ else :
+ arraylen=jvmti.getArrayLength(objvalue)
+
+ kml.write('<localvar slot="%d" ref="%d" length="%d">\n' % (entry.slot,objvalue,arraylen))
+ if arraylen > 0 :
+ data=array.array('i')
+ for i in range (0 ,arraylen) :
+ elementID=jvmti.getObjectArrayElement(objvalue,i)
+ data.append(elementID)
+ kml.write("<![CDATA[%s]]>\n" % base64.b64encode(data.tostring()))
+
+ kml.write("</localvar>\n")
+
+ else :
+ objvalue=jvmti.getLocalObject(threadid,depth,entry.slot)
+
+ clazzid=0
+ if objvalue!=0 :
+ clazzid=jvmti.getObjectClass(objvalue)
+ saveInstance(kml,clazzid,objvalue)
+
+ kml.write('<localvar slot="%d" classid="%d" object="%d">\n' % (entry.slot,clazzid,objvalue))
+ kml.write("</localvar>\n")
+
+ except jvmti.error :
+
+
+ print "err..." , jvmti.error , signature
+
+
+
Modified: incubator/kato/branches/experimental/PyJVMTI/kato/console.py
URL: http://svn.apache.org/viewvc/incubator/kato/branches/experimental/PyJVMTI/kato/console.py?rev=784411&r1=784410&r2=784411&view=diff
==============================================================================
--- incubator/kato/branches/experimental/PyJVMTI/kato/console.py (original)
+++ incubator/kato/branches/experimental/PyJVMTI/kato/console.py Sat Jun 13 15:56:55 2009
@@ -15,8 +15,9 @@
print "JVMTI Python Interactive Session started"
import jvmti
-#import kato.Dump as Dump
-from kato.BinDump import BinDump
+
+from kato.XMLDump import *
+from kato.BinDump import BinDump
from kato.JClass import JClass
from kato.JField import JField
@@ -65,8 +66,8 @@
print "saving..."
print "save classes = ", saveclasses
print "save Threads = ", saveThreads
- d=BinDump()
- d.save()
+
+ katodump()
print "saved"
Modified: incubator/kato/branches/experimental/PyJVMTI/pyjvmti.c
URL: http://svn.apache.org/viewvc/incubator/kato/branches/experimental/PyJVMTI/pyjvmti.c?rev=784411&r1=784410&r2=784411&view=diff
==============================================================================
--- incubator/kato/branches/experimental/PyJVMTI/pyjvmti.c (original)
+++ incubator/kato/branches/experimental/PyJVMTI/pyjvmti.c Sat Jun 13 15:56:55 2009
@@ -48,8 +48,8 @@
jint rc = (*vmptr)->GetEnv(vmptr, (void **)&jniptr, JNI_VERSION_1_6);
if (rc != JNI_OK) {
- report("unable to load jni environment");
-
+ printf("unable to load jni environment");
+
}
@@ -91,7 +91,7 @@
jlong* tag_ptr,
void* user_data) {
printf("called...");
-
+
}
static void JNICALL myVMInit(jvmtiEnv *jvmtiptr, JNIEnv *jni, jthread thread)
@@ -221,6 +221,24 @@
\
return Py_BuildValue(PTYPE, result);
+#define getStaticValue(FUNC,TYPE,PTYPE) \
+ CHECK_VALID(); \
+ \
+ int clazzID=0; \
+ int fieldID=0; \
+ PyArg_ParseTuple(args, "ii", &clazzID,&fieldID);\
+ \
+ TRACE("clazzid=%d ",clazzID); \
+ TRACE("fieldID=%d\n",fieldID); \
+ jclass clazz=clazzID;\
+ jfieldID field=fieldID;\
+ \
+ TYPE result=(*jniptr)->FUNC(jniptr,clazz,field);\
+ \
+ PyObject *pyresult=Py_BuildValue(PTYPE, result); \
+ TRACE_EXIT(); \
+ return pyresult;
+
#define getList(FUNC,TYPE,DESC) \
CHECK_VALID(); \
@@ -325,15 +343,56 @@
return result;
}
-static PyObject * jvmti_getArrayLength(PyObject *self, PyObject *args) {
+static PyObject * jvmti_getStaticBooleanField(PyObject *self, PyObject *args) {
+ TRACE_ENTER();
+ getStaticValue(GetStaticBooleanField,jboolean,"i")
+ TRACE_EXIT();
+}
+static PyObject * jvmti_getStaticByteField(PyObject *self, PyObject *args) {
+ TRACE_ENTER();
+ getStaticValue(GetStaticByteField,jbyte,"h")
+ TRACE_EXIT();
+}
+static PyObject * jvmti_getStaticCharField(PyObject *self, PyObject *args) {
+ TRACE_ENTER();
+ getStaticValue(GetStaticCharField,jchar,"c")
+}
+static PyObject * jvmti_getStaticShortField(PyObject *self, PyObject *args) {
+ TRACE_ENTER();
+ getStaticValue(GetStaticShortField,jshort,"h")
+}
+static PyObject * jvmti_getStaticIntField(PyObject *self, PyObject *args) {
+ TRACE_ENTER();
+ getStaticValue(GetStaticIntField,jshort,"i")
+}
+static PyObject * jvmti_getStaticLongField(PyObject *self, PyObject *args) {
+ TRACE_ENTER();
+ getStaticValue(GetStaticLongField,jlong,"l")
+}
+static PyObject * jvmti_getStaticFloatField(PyObject *self, PyObject *args) {
+ TRACE_ENTER();
+ getStaticValue(GetStaticFloatField,jfloat,"f")
+}
+static PyObject * jvmti_getStaticDoubleField(PyObject *self, PyObject *args) {
+ TRACE_ENTER();
+ getStaticValue(GetStaticDoubleField,jdouble,"f")
+}
+static PyObject * jvmti_getStaticObjectField(PyObject *self, PyObject *args) {
+ TRACE_ENTER();
+ getStaticValue(GetStaticObjectField,jobject,"i")
+ TRACE_EXIT();
+}
+static PyObject * jvmti_getArrayLength(PyObject *self, PyObject *args) {
+ TRACE_ENTER();
CHECK_VALID();
int arrayid=0;
PyArg_ParseTuple(args, "i", &arrayid);
+ TRACE("arrayid=%d\n",arrayid);
- jarray array=(jarray)arrayid;
+ jarray array=INT2JARRAY(arrayid);
jsize result=(*jniptr)->GetArrayLength(jniptr,array);
@@ -341,84 +400,132 @@
}
+static PyObject * jvmti_getStringUTFChars(PyObject *self, PyObject *args) {
+ TRACE_ENTER();
+ CHECK_VALID();
+ int objid=0;
+ const char *utf;
+ jboolean iscopy;
-static PyObject * jvmti_getObjectField(PyObject *self, PyObject *args) {
+ PyArg_ParseTuple(args, "i", &objid);
+
+ jstring string=(jstring)objid;
+
+ utf=(*jniptr)->GetStringUTFChars(jniptr,string,&iscopy);
+
+ PyObject *result=Py_BuildValue("s",utf);
+
+ if(iscopy==JNI_TRUE) {
+
+ (*jniptr)->ReleaseStringUTFChars(jniptr,string,utf);
+ }
+
+ return result;
+
+}
+
+
+static PyObject * jvmti_getObjectArrayElement(PyObject *self, PyObject *args) {
+ TRACE_ENTER();
+ CHECK_VALID();
+
+ int arrayid=0;
+ int index=0;
+
+ PyArg_ParseTuple(args, "ii", &arrayid,&index);
+
+ jarray array=(jarray)arrayid;
+ jsize element=(jsize)index;
+
+ jobject result=(*jniptr)->GetObjectArrayElement(jniptr,array, element);
+
+ return Py_BuildValue("i", result);
+
+}
+
+
+static PyObject * jvmti_getObjectField(PyObject *self, PyObject *args) {
+ TRACE_ENTER();
getFieldValue(GetObjectField,jobject,"i","get obj field")
}
static PyObject * jvmti_getBooleanField(PyObject *self, PyObject *args) {
-
+ TRACE_ENTER();
getFieldValue(GetBooleanField,jboolean,"i","get boolean field")
}
static PyObject * jvmti_getByteField(PyObject *self, PyObject *args) {
-
+ TRACE_ENTER();
getFieldValue(GetByteField,jbyte,"i","get byte field")
}
static PyObject * jvmti_getCharField(PyObject *self, PyObject *args) {
-
+ TRACE_ENTER();
getFieldValue(GetCharField,jchar,"i","get char field")
}
static PyObject * jvmti_getShortField(PyObject *self, PyObject *args) {
-
+ TRACE_ENTER();
getFieldValue(GetShortField,jshort,"i","get short field")
}
static PyObject * jvmti_getIntField(PyObject *self, PyObject *args) {
-
+ TRACE_ENTER();
getFieldValue(GetIntField,jint,"i","get int field")
}
static PyObject * jvmti_getLongField(PyObject *self, PyObject *args) {
-
+ TRACE_ENTER();
getFieldValue(GetLongField,jlong,"l","get long field")
}
static PyObject * jvmti_getFloatField(PyObject *self, PyObject *args) {
-
+ TRACE_ENTER();
getFieldValue(GetFloatField,jfloat,"f","get float field")
}
static PyObject * jvmti_getDoubleField(PyObject *self, PyObject *args) {
-
+ TRACE_ENTER();
getFieldValue(GetDoubleField,jlong,"f","get double field")
}
static PyObject * jvmti_getIntArrayElements(PyObject *self, PyObject *args) {
-
+ TRACE_ENTER();
getArray(Int,jint,int,"i")
}
static PyObject * jvmti_getByteArrayElements(PyObject *self, PyObject *args) {
-
+ TRACE_ENTER();
getArray(Byte,jbyte,int,"i")
}
+static PyObject * jvmti_getBooleanArrayElements(PyObject *self, PyObject *args) {
+ TRACE_ENTER();
+ getArray(Boolean,jboolean,int,"i")
+}
static PyObject * jvmti_getCharArrayElements(PyObject *self, PyObject *args) {
-
+ TRACE_ENTER();
getArray(Char,jchar,char,"c")
}
static PyObject * jvmti_getShortArrayElements(PyObject *self, PyObject *args) {
-
+ TRACE_ENTER();
getArray(Short,jshort,short,"h")
}
static PyObject * jvmti_getLongArrayElements(PyObject *self, PyObject *args) {
-
+ TRACE_ENTER();
getArray(Long,jlong,long,"l")
}
static PyObject * jvmti_getFloatArrayElements(PyObject *self, PyObject *args) {
-
+ TRACE_ENTER();
getArray(Float,jfloat,float,"f")
}
static PyObject * jvmti_getDoubleArrayElements(PyObject *self, PyObject *args) {
-
+ TRACE_ENTER();
getArray(Double,jdouble,double,"d")
}
static PyObject * jvmti_registerExceptionFilter(PyObject *self, PyObject *args) {
-
+ TRACE_ENTER();
CHECK_VALID();
PyObject *temp=NULL;
PyObject *result = NULL;
@@ -445,7 +552,7 @@
}
static PyObject * jvmti_iterateOverReachableObjects(PyObject *self, PyObject *args) {
-
+ TRACE_ENTER();
CHECK_VALID();
objectcounter=0;
PyObject *temp=NULL;
@@ -475,7 +582,7 @@
}
static PyObject * jvmti_getStackTrace(PyObject *self, PyObject *args) {
-
+ TRACE_ENTER();
int threadID=0;
int start_depth=0;
@@ -512,8 +619,30 @@
}
-static PyObject * jvmti_getFrameCount(PyObject *self, PyObject *args) {
+
+static PyObject * jvmti_deleteLocalRef(PyObject *self, PyObject *args) {
+ TRACE_ENTER();
+ CHECK_VALID();
+
+ // get required ref
+ int ref=0;
+
+ PyArg_ParseTuple(args, "i", &ref);
+
+ jobject refj=INT2JOBJECT(ref);
+ (*jniptr)->DeleteLocalRef(jniptr,refj);
+
+ PyObject *result= Py_BuildValue("i", ref);
+ TRACE_EXIT();
+ return result;
+
+
+
+
+}
+static PyObject * jvmti_getFrameCount(PyObject *self, PyObject *args) {
+ TRACE_ENTER();
CHECK_VALID();
// get required thread...
@@ -537,7 +666,7 @@
* Takes threadid and returns a python list of object ids
*/
static PyObject * jvmti_getCurrentContendedMonitor(PyObject *self, PyObject *args) {
-
+ TRACE_ENTER();
CHECK_VALID();
@@ -561,7 +690,7 @@
* Takes threadid and returns a python list of object ids
*/
static PyObject * jvmti_getOwnedMonitorInfo(PyObject *self, PyObject *args) {
-
+ TRACE_ENTER();
CHECK_VALID();
// get required thread...
@@ -591,7 +720,7 @@
}
static PyObject * jvmti_getThreadGroupInfo(PyObject *self, PyObject *args) {
-
+ TRACE_ENTER();
CHECK_VALID();
// get required threadgroup
@@ -614,7 +743,7 @@
return result;
}
static PyObject * jvmti_getTopThreadGroups(PyObject *self, PyObject *args) {
-
+ TRACE_ENTER();
CHECK_VALID();
@@ -645,7 +774,7 @@
*/
static PyObject * jvmti_getcapabilities(PyObject *self, PyObject *args) {
-
+ TRACE_ENTER();
CHECK_VALID();
@@ -663,7 +792,7 @@
static PyObject *
jvmti_getThread(PyObject *self, PyObject *args)
-{
+{TRACE_ENTER();
CHECK_VALID();
// get required thread...
int threadID=0;
@@ -687,7 +816,7 @@
static PyObject *
jvmti_getCurrentThread(PyObject *self, PyObject *args)
-{
+{TRACE_ENTER();
CHECK_VALID();
jthread threadj=0;
@@ -707,7 +836,7 @@
static PyObject *
jvmti_getLoadedClasses(PyObject *self, PyObject *args)
{
-
+ TRACE_ENTER();
CHECK_VALID();
jint count=0;
@@ -738,7 +867,7 @@
static PyObject *
jvmti_getAllThreads(PyObject *self, PyObject *args)
{
-
+ TRACE_ENTER();
CHECK_VALID();
@@ -771,6 +900,7 @@
static PyObject *
jvmti_getsystemproperties(PyObject *self, PyObject *args)
{
+ TRACE_ENTER();
CHECK_VALID();
jint countj=0;
@@ -819,7 +949,7 @@
jvmti_getSuperClass(PyObject *self, PyObject *args)
{
-
+ TRACE_ENTER();
CHECK_VALID();
int classid=0;
@@ -835,7 +965,7 @@
jvmti_getObjectClass(PyObject *self, PyObject *args)
{
-
+ TRACE_ENTER();
CHECK_VALID();
int objid=0;
@@ -853,7 +983,7 @@
jvmti_gettime(PyObject *self, PyObject *args)
{
-
+ TRACE_ENTER();
CHECK_VALID();
jlong result=0;
@@ -869,6 +999,7 @@
static PyObject *
jvmti_getLocalValue(PyObject *self, PyObject *args)
{
+ TRACE_ENTER();
int threadID=0;
int depth=0;
int slot=0;
@@ -894,6 +1025,39 @@
CHECK_OK("Get Local Value");
return Py_BuildValue("i", 0);
}
+
+
+
+static PyObject *
+jvmti_getFrameLocation(PyObject *self, PyObject *args)
+{
+ TRACE_ENTER();
+
+CHECK_VALID();
+
+ int threadID=0;
+ int depth=0;
+ int methodID=0;
+
+ PyArg_ParseTuple(args, "iii", &threadID,&depth);
+
+ TRACE("thread id=%d ",threadID);
+ TRACE("depth=%d ",depth);
+
+
+ jthread threadj=INT2JTHREAD(threadID);
+ jint depthj=depth;
+ jmethodID methodj=0;
+ jlocation result=0;
+
+ jvmtiError err=(*jvmtiptr)->GetFrameLocation(jvmtiptr,threadj,depthj,&methodj,&result);
+
+ CHECK_OK("GetFrameLocation");
+
+ PyObject *pyresult=Py_BuildValue("ii", methodj,result);
+ TRACE_EXIT();
+ return pyresult;
+}
/**
* Get Local Variable that is an Object
*/
@@ -901,7 +1065,7 @@
static PyObject *
jvmti_getLocalObject(PyObject *self, PyObject *args)
{
-
+ TRACE_ENTER();
CHECK_VALID();
@@ -911,17 +1075,22 @@
PyArg_ParseTuple(args, "iii", &threadID,&depth,&slot);
-
+ TRACE("thread id=%d ",threadID);
+ TRACE("depth=%d ",depth);
+ TRACE("slot=%d\n",slot);
+
jthread threadj=INT2JTHREAD(threadID);
jint depthj=depth;
jint slotj=slot;
- jobject result;
+ jobject result=0;
jvmtiError err=(*jvmtiptr)->GetLocalObject(jvmtiptr,threadj,depthj,slotj,&result);
CHECK_OK("GetLocalObject");
- return Py_BuildValue("i", result);
+ PyObject *pyresult=Py_BuildValue("i", result);
+ TRACE_EXIT();
+ return pyresult;
}
/**
@@ -931,7 +1100,7 @@
static PyObject *
jvmti_getLocalInt(PyObject *self, PyObject *args)
{
-
+ TRACE_ENTER();
CHECK_VALID();
@@ -941,7 +1110,7 @@
PyArg_ParseTuple(args, "iii", &threadID,&depth,&slot);
-
+
jthread threadj=INT2JTHREAD(threadID);
jint depthj=depth;
jint slotj=slot;
@@ -961,7 +1130,7 @@
jvmti_getLocalLong(PyObject *self, PyObject *args)
{
-
+ TRACE_ENTER();
CHECK_VALID();
int threadID=0;
@@ -989,6 +1158,7 @@
static PyObject *
jvmti_getBytecodes(PyObject *self, PyObject *args)
{
+ TRACE_ENTER();
CHECK_VALID();
int methodID=0;
@@ -1020,7 +1190,7 @@
static PyObject *
jvmti_getMethodName(PyObject *self, PyObject *args)
{
-
+ TRACE_ENTER();
CHECK_VALID();
@@ -1054,7 +1224,7 @@
static PyObject *
jvmti_getClassSignature(PyObject *self, PyObject *args)
{
-
+ TRACE_ENTER();
CHECK_VALID();
@@ -1086,6 +1256,7 @@
static PyObject *
jvmti_getFieldModifiers(PyObject *self, PyObject *args)
{
+ TRACE_ENTER();
CHECK_VALID();
int class=0;
int field=0;
@@ -1114,7 +1285,7 @@
{
-
+ TRACE_ENTER();
CHECK_VALID();
int classID=0;
@@ -1151,7 +1322,7 @@
{
-
+ TRACE_ENTER();
CHECK_VALID();
int methodID=0;
@@ -1200,6 +1371,8 @@
DEALLOC(entries);
+ TRACE_EXIT();
+
return list;
}
@@ -1207,53 +1380,66 @@
* Returns the size of the object
*/
static PyObject * jvmti_getObjectSize(PyObject *self, PyObject *args) {
+ TRACE_ENTER();
getValue(GetObjectSize,jobject,jlong,"i","Get Object Size")
}
static PyObject * jvmti_getClassLoaderClasses(PyObject *self, PyObject *args) {
+ TRACE_ENTER();
getList(GetClassLoaderClasses,jclass,"Get ClassLoader classes")
}
static PyObject * jvmti_getSourceFileName(PyObject *self, PyObject *args) {
+ TRACE_ENTER();
getStringValue(GetSourceFileName,"Get Source File Name")
}
static PyObject * jvmti_getClassStatus(PyObject *self, PyObject *args) {
+ TRACE_ENTER();
getValue(GetClassStatus,jobject,jint,"i","Get Class Status")
}
static PyObject * jvmti_getClassModifiers(PyObject *self, PyObject *args) {
+ TRACE_ENTER();
getValue(GetClassModifiers,jobject,jint,"i","Get Class Modifiers")
}
static PyObject * jvmti_getClassMethods(PyObject *self, PyObject *args) {
+ TRACE_ENTER();
getList(GetClassMethods,jmethodID,"Get Class Methods")
}
static PyObject * jvmti_getClassFields(PyObject *self, PyObject *args) {
+ TRACE_ENTER();
getList(GetClassFields,jfieldID,"Get Class Fields")
}
static PyObject * jvmti_getClassLoader(PyObject *self, PyObject *args) {
+ TRACE_ENTER();
getValue(GetClassLoader,jobject,jclass,"i","Get Class Loader")
}
static PyObject * jvmti_getMethodModifiers(PyObject *self, PyObject *args) {
+ TRACE_ENTER();
getValue(GetMethodModifiers,jmethodID,jint,"i","Get Method Modifiers")
}
static PyObject * jvmti_getMaxLocals(PyObject *self, PyObject *args) {
+ TRACE_ENTER();
getValue(GetMaxLocals,jmethodID,jint,"i","Get Max Locals")
}
static PyObject * jvmti_getArgumentsSize(PyObject *self, PyObject *args) {
+ TRACE_ENTER();
getValue(GetArgumentsSize,jmethodID,jint,"i","Get Arguments Size")
}
static PyObject * jvmti_isMethodNative(PyObject *self, PyObject *args) {
+ TRACE_ENTER();
getValue(IsMethodNative,jmethodID,jboolean,"i","Is method native")
}
static PyObject * jvmti_getImplementedInterfaces(PyObject *self, PyObject *args) {
+ TRACE_ENTER();
getList(GetImplementedInterfaces,jclass,"Get Implemented Interfaces")
}
static PyObject * jvmti_iterateOverInstancesOfClass(PyObject *self, PyObject *args) {
-
+ TRACE_ENTER();
CHECK_VALID();
// get required class
int classID=0;
@@ -1310,8 +1496,11 @@
{"getSuperClass", jvmti_getSuperClass, METH_VARARGS, "Get Superclass."},
{"getObjectClass", jvmti_getObjectClass, METH_VARARGS, "Get Object Class."},
{"getClassLoader", jvmti_getClassLoader, METH_VARARGS, "Get Class Loader."},
+ {"deleteLocalRef", jvmti_deleteLocalRef, METH_VARARGS, "Get Class Loader."},
+
+ {"getFrameLocation", jvmti_getFrameLocation, METH_VARARGS, "Get Frame Location."},
{"getFieldName", jvmti_getFieldName, METH_VARARGS, "Get Field Name."},
{"getFieldModifiers", jvmti_getFieldModifiers, METH_VARARGS, "Get Field Name."},
{"getMethodModifiers", jvmti_getMethodModifiers, METH_VARARGS, "Get Method Modifiers."},
@@ -1322,6 +1511,7 @@
{"getIntArrayElements", jvmti_getIntArrayElements, METH_VARARGS, "Get Int Array Elements"},
{"getCharArrayElements", jvmti_getCharArrayElements, METH_VARARGS, "Get Char Array Elements"},
{"getByteArrayElements", jvmti_getByteArrayElements, METH_VARARGS, "Get Byte Array Elements"},
+ {"getBooleanArrayElements", jvmti_getBooleanArrayElements, METH_VARARGS, "Get Boolean Array Elements"},
{"getShortArrayElements",jvmti_getShortArrayElements, METH_VARARGS, "Get Short Array Elements"},
{"getLongArrayElements", jvmti_getLongArrayElements, METH_VARARGS, "Get Long Array Elements"},
{"getFloatArrayElements",jvmti_getFloatArrayElements, METH_VARARGS, "Get Float Array Elements"},
@@ -1331,8 +1521,15 @@
{"getCurrentThread", jvmti_getCurrentThread, METH_VARARGS, "Get Current Thread ID"},
{"iterateOverReachableObjects", jvmti_iterateOverReachableObjects, METH_VARARGS, "Iterate over reachable objects"},
-
-
+ {"getStaticBooleanField",jvmti_getStaticBooleanField, METH_VARARGS, "Iterate over reachable objects"},
+ {"getStaticByteField", jvmti_getStaticByteField, METH_VARARGS, "Iterate over reachable objects"},
+ {"getStaticCharField", jvmti_getStaticCharField, METH_VARARGS, "Iterate over reachable objects"},
+ {"getStaticShortField", jvmti_getStaticShortField, METH_VARARGS, "Iterate over reachable objects"},
+ {"getStaticIntField", jvmti_getStaticIntField, METH_VARARGS, "Iterate over reachable objects"},
+ {"getStaticLongField", jvmti_getStaticLongField, METH_VARARGS, "Iterate over reachable objects"},
+ {"getStaticFloatField", jvmti_getStaticFloatField, METH_VARARGS, "Iterate over reachable objects"},
+ {"getStaticDoubleField", jvmti_getStaticDoubleField, METH_VARARGS, "Iterate over reachable objects"},
+ {"getStaticObjectField", jvmti_getStaticObjectField, METH_VARARGS, "Iterate over reachable objects"},
{"getObjectField", jvmti_getObjectField, METH_VARARGS, "Iterate over reachable objects"},
{"getBooleanField", jvmti_getBooleanField, METH_VARARGS, "Iterate over reachable objects"},
@@ -1343,6 +1540,8 @@
{"getLongField", jvmti_getLongField, METH_VARARGS, "Iterate over reachable objects"},
{"getFloatField", jvmti_getFloatField, METH_VARARGS, "Iterate over reachable objects"},
{"getDoubleField", jvmti_getDoubleField, METH_VARARGS, "Iterate over reachable objects"},
+ {"getObjectArrayElement", jvmti_getObjectArrayElement, METH_VARARGS, "Get object array element"},
+ {"getStringUTFChars", jvmti_getStringUTFChars, METH_VARARGS, "Get String UTF8 Chars"},
{NULL, NULL, 0, NULL} /* Sentinel */
};
@@ -1351,7 +1550,7 @@
PyMODINIT_FUNC
initjvmti(void)
{
-
+ TRACE_ENTER();
PyObject *m;
@@ -1374,7 +1573,7 @@
jclass threadClass;
jmethodID constructor;
-
+TRACE_ENTER();
printf("\ncreating thread");
threadClass = (*env)->FindClass(env, "test/MyDump");
@@ -1390,7 +1589,7 @@
void exec_interactive_interpreter(int argc, char** argv)
{
-
+ TRACE_ENTER();
Py_Main(argc, argv);
@@ -1402,7 +1601,7 @@
void runScript(char *script) {
-
+ TRACE_ENTER();
printf("\nrunning script %s\n",script);
// Python code in separate environments
@@ -1418,16 +1617,17 @@
JNIEXPORT void JNICALL Agent_OnUnload(JavaVM *vm) {
+ TRACE_ENTER();
- report("unloaded");
}
JNIEXPORT void JNICALL Java_test_MyDump_doit
(JNIEnv *env, jobject obj) {
-
+ TRACE_ENTER();
startPython();
}
void startPython() {
+ TRACE_ENTER();
char *names[]={scriptname,scriptname};
exec_interactive_interpreter(1,names);
@@ -1437,6 +1637,7 @@
static void JNICALL
dataDumpRequest(jvmtiEnv *jvmti)
{
+ TRACE_ENTER();
jvmtiptr=jvmti;
jint rc = (*vmptr)->GetEnv(vmptr, (void **)&jniptr, JNI_VERSION_1_6);
@@ -1455,7 +1656,7 @@
JNIEXPORT jint JNICALL
Agent_OnLoad(JavaVM *vm, char *options, void *reserved)
{
-
+ TRACE_ENTER();
report(" jvmti is active");
vmptr=vm;
Modified: incubator/kato/branches/experimental/PyJVMTI/pyjvmti.h
URL: http://svn.apache.org/viewvc/incubator/kato/branches/experimental/PyJVMTI/pyjvmti.h?rev=784411&r1=784410&r2=784411&view=diff
==============================================================================
--- incubator/kato/branches/experimental/PyJVMTI/pyjvmti.h (original)
+++ incubator/kato/branches/experimental/PyJVMTI/pyjvmti.h Sat Jun 13 15:56:55 2009
@@ -50,13 +50,19 @@
return NULL; \
} \
}
-#define report(s) printf("\nkato: %s",s)
+#define TRACE_ENTER() printf(">%s\n",__FUNCTION__)
+#define TRACE(s,v) printf(s,v)
+#define TRACE_EXIT() printf("<%s\n",__FUNCTION__)
+#define report(s) printf("kato:%s\n",s);
PyMODINIT_FUNC initjvmti(void);
+static PyObject *jvmti_getFrameLocation(PyObject *self, PyObject *args);
+static PyObject *jvmti_deleteLocalRef(PyObject *self, PyObject *args);
static PyObject *jvmti_getIntArrayElements(PyObject *self, PyObject *args);
+static PyObject *jvmti_getBooleanArrayElements(PyObject *self, PyObject *args);
static PyObject *jvmti_getByteArrayElements(PyObject *self, PyObject *args);
static PyObject *jvmti_getCharArrayElements(PyObject *self, PyObject *args);
static PyObject *jvmti_getShortArrayElements(PyObject *self, PyObject *args);
@@ -106,6 +112,19 @@
static PyObject * jvmti_getLongField(PyObject *self, PyObject *args);
static PyObject * jvmti_getFloatField(PyObject *self, PyObject *args);
static PyObject * jvmti_getDoubleField(PyObject *self, PyObject *args);
+static PyObject * jvmti_getObjectArrayElement(PyObject *self, PyObject *args);
+static PyObject * jvmti_getStringUTFChars(PyObject *self, PyObject *args);
+static PyObject * jvmti_getStaticBooleanField(PyObject *self, PyObject *args);
+static PyObject * jvmti_getStaticByteField(PyObject *self, PyObject *args);
+static PyObject * jvmti_getStaticCharField(PyObject *self, PyObject *args);
+static PyObject * jvmti_getStaticShortField(PyObject *self, PyObject *args);
+static PyObject * jvmti_getStaticIntField(PyObject *self, PyObject *args);
+static PyObject * jvmti_getStaticLongField(PyObject *self, PyObject *args);
+static PyObject * jvmti_getStaticFloatField(PyObject *self, PyObject *args);
+static PyObject * jvmti_getStaticDoubleField(PyObject *self, PyObject *args);
+static PyObject * jvmti_getStaticObjectField(PyObject *self, PyObject *args);
+
+
void runScript(char *);
void startPython(void);
Modified: incubator/kato/branches/experimental/PyJVMTI/pyjvmti_convert.h
URL: http://svn.apache.org/viewvc/incubator/kato/branches/experimental/PyJVMTI/pyjvmti_convert.h?rev=784411&r1=784410&r2=784411&view=diff
==============================================================================
--- incubator/kato/branches/experimental/PyJVMTI/pyjvmti_convert.h (original)
+++ incubator/kato/branches/experimental/PyJVMTI/pyjvmti_convert.h Sat Jun 13 15:56:55 2009
@@ -33,5 +33,7 @@
#define JCLASS2INT(t) (int)t
#define INT2JCLASS(i) (jclass)i
+#define JARRAY2INT(t) (int)t
+#define INT2JARRAY(i) (jarray)i
#endif
Modified: incubator/kato/branches/experimental/PyJVMTI/tomcat.sh
URL: http://svn.apache.org/viewvc/incubator/kato/branches/experimental/PyJVMTI/tomcat.sh?rev=784411&r1=784410&r2=784411&view=diff
==============================================================================
--- incubator/kato/branches/experimental/PyJVMTI/tomcat.sh (original)
+++ incubator/kato/branches/experimental/PyJVMTI/tomcat.sh Sat Jun 13 15:56:55 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 -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
+/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 -verbose:gc -verbose:jni -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