[讨论] 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
Global site tag (gtag.js) - Google Analytics