Python包与标准CLI Java调试器“JDB”接口,以提取有关Java程序执行的信息。

pyjdb的Python项目详细描述


Pyjdb

python通过jdb与java调试器接口。

概述

JdbProcess使用pexpect附加到jdb进程并记录获得的所有信息。

对于每一条指令,我们都会记录以下格式的字典:

{"return":10000,"thread":"main","class.method":"IterPower.iterPower()","method":"iterPower","line":15,"bci":17,"instruction":"return result;"}

对于每条指令,我们还可以获得当前方法参数的字典,以及它的所有局部变量:

({'base':10,'exp':0},{'result':10000})

示例

假设我们有这个java文件,IterPower.java

publicclassIterPower{publicstaticvoidmain(String[]args){// ... parse arguments ...System.out.println(iterPower(base,exp));}publicstaticintiterPower(intbase,intexp){intresult=1;while(exp>0){result*=base;exp-=1;}returnresult;}}

它是用调试信息javac -g IterPower.java编译的。以下是python代码片段:

importpyjdbimportitertoolsp=pyjdb.JdbProcess("IterPower")p.spawn("10 4")variables={}whileTrue:# Try to make an additional step and retrieve local variablesresult=Nonetry:p.step()result=p.locals()exceptpyjdb.EOF:breakifresultisNone:continue# Store the values of each variable(args,locs)=resultfor(var,val)initertools.chain(args.items(),locs.items()):variables[var]=variables.get(var,list())variables[var].append(val)variables_unique_values={var:list(set(vals))for(var,vals)invariables.items()}print(variables_unique_values)

代码段将在执行过程中输出此程序的变量值的跟踪:

{"args":["instance of java.lang.String[0] (id=495)"],"base":[10],"exp":[0,1,2,3,4],"result":[1,10,100,1000,10000]}

{'base':[10],'exp':[0,1,2,3,4],'result':[1,100,1000,10,10000],'args':['java.lang.string[2]的实例(id=495)]}

灵感

这个项目的灵感来自一个talk by Elena Glassman,在这个项目中,她展示了如何根据内部变量的跟踪对different implementations of the same solution进行聚类。她的工作包括OverCodefoobaz,重点是python程序。在我的家乡,我们在入门课程中使用java。这个项目的最初目标是将Glassman博士的技术应用到Java任务中。

相关项目

有几个雄心勃勃的项目涉及到将java调试器引入python。这些项目强调了实现实际的jdwp协议是多么复杂。这就是为什么在这个项目中,我们的方法是依靠jdb来实现协议级功能。

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java为什么单元测试中的“验证”在不同实例的情况下不返回“不同参数”错误?   java如何从具有相同类名的div中选择元素(Selenium)   Java制作纸牌游戏,有关于类的问题吗   bluej在Java中使用变异器和访问器设置颜色和圆半径   java准确定位异常错误的最佳方法是什么?   使用多个监视器时的java设置对话框位置   java如何在不使用JavascriptExecutor的情况下在网页中向下/向上滚动   java在for循环中将大小设置为n   java为什么akka需要不可变的消息   java LdapInvalidDnException:意外标记:   java如果字符串的第一个字母不是一个,如何大写?   使用htmlunit的java html内容提取   java从CDI托管bean获取方法的注释   java有办法在运行时检查post请求参数的大小吗   java我可以将实体注入托管Bean并直接持久化吗?