[讨论] X86 asm代码 是怎么才能看到?
beneo
2010-09-29
恩,看了沙迦的new string那帖子,不知道X86 asm代码是怎么弄出来的?
感谢 |
|
RednaxelaFX
2010-09-29
是撒迦…
![]() 这个疑问在之前某帖的回复里有提到:HotSpot的JIT编译器遇到简单无限循环时 RednaxelaFX 写道 lvgang 写道 好文,很有深度,就是看不太懂,呵呵。有个问题向博主请教,从上面打印出来的汇编代码来看,貌似是 gnu as,windows 上也能用 gnu as?
是的,这个是由GNU binutils里的as提供反汇编功能。 Sun HotSpot需要一个反汇编插件才可以使用-XX:+PrintAssembly参数来打印JIT编译生成的代码。该插件有一组通用接口,本来是可以用任意反汇编器套个适配器就行。官方提供了一个现成的版本(hsdis)是基于gas的,我懒于是就直接用它了。在Windows上直接build我还没成功过,用MinGW和Cygwin都试过不行。我用的版本是在Ubuntu上cross-compile出来的,根据插件作者提供的cross-compile指引来做没有遇到问题。 编译出来的hsdis-i386.dll放到JDK安装目录中jre/bin/server和jre/bin/client中即可。 不太记得是不是从Sun JDK 6 update 20开始,在product build的HotSpot里要用-XX:+PrintAssembly参数必须同时带上-XX:+UnlockDiagnosticVMOptions参数才可以。 java -XX:+UnlockDiagnosticVMOptions -XX:+PrintAssembly YourMainClass debug与fastdebug build就不用带。 而在比较老的Sun JDK 6里这个插件的名字要改为hdis-i486.dll才行。具体是从哪个版本开始变的我可以回头查查看。 如果有人需要我编译好的这个插件的话,待会儿可以上传一个到圈子共享里。 已经上传到圈子的共享里了 OpenJDK 7里可以看到还有另外一个附加的选项,-XX:PrintAssemblyOptions,可以用来向反编译插件传递参数。 借助HotSpot SA来反汇编 这帖提到的也是其中一个办法。看图: ![]() ======================================= 上面是针对Sun JDK的HotSpot而言。 JRockit的话要用别的办法,不过由于Oracle在输出的日志里说那信息是confidential的,所以抱歉我不能在这里说。 IBM J9的话我还没找到简单的办法。 Harmony、Jikes RVM、Maxine这些都有提供命令行参数可以让JVM把动态编译的汇编吐出来。 |
|
thebye85
2011-11-04
![]() |