当前位置: 首页 > 知识库问答 >
问题:

java printAssembly标志正在打印无汇编指令

徐凌
2023-03-14

在这个链接中,rustyx提到他使用了一个调试虚拟机和以下标志来获取java字节码的汇编指令

我用sudo apt get install openjdk-17-dbg安装了调试虚拟机

我使用命令java-XX:UnlockDiagnosticVMOptions-XX:PrintAssembly Main

我习惯用C和gdb来完成这项工作,但无法用java来完成。printAssembly只打印指令的十六进制值,如下面的示例所示,它重复了多次,没有显示实际的代码函数或任何有意义的符号

abstract class Base {
    Base(){
        System.out.println("Base Constructor Called");
    }
    abstract void fun();
}
class Dervied extends Base {
    Dervied(){
        System.out.println("Dervied Constructor called");
    }
    void fun(){
        int x = 0;
        x = x + 1;
        System.out.println("Dervied fun() called " + x);
    }
}

class Main {
    public static void main(String args[]){
        Dervied d = new Dervied();
        d.fun();
    }
}

     32    1       3       java.lang.Object::<init> (1 bytes)

============================= C1-compiled nmethod ==============================
----------------------------------- Assembly -----------------------------------

Compiled method (c1)      32    1       3       java.lang.Object::<init> (1 bytes)
 total in heap  [0x00007fca25878010,0x00007fca25878320] = 784
 relocation     [0x00007fca25878170,0x00007fca258781a0] = 48
 main code      [0x00007fca258781a0,0x00007fca25878280] = 224
 stub code      [0x00007fca25878280,0x00007fca258782b0] = 48
 metadata       [0x00007fca258782b0,0x00007fca258782c0] = 16
 scopes data    [0x00007fca258782c0,0x00007fca258782d8] = 24
 scopes pcs     [0x00007fca258782d8,0x00007fca25878318] = 64
 dependencies   [0x00007fca25878318,0x00007fca25878320] = 8

[Constant Pool (empty)]

[MachCode]
[Entry Point]
  # {method} {0x0000000800448920} '<init>' '()V' in 'java/lang/Object'
  #           [sp+0x40]  (sp of caller)
  0x00007fca258781a0: 448b 5608 | 49bb 0000 | 0000 0800 | 0000 4d03 | d34c 3bd0 

  0x00007fca258781b4: ;   {runtime_call ic_miss_stub}
  0x00007fca258781b4: 0f85 c6a5 | abff 660f | 1f44 0000 
[Verified Entry Point]
  0x00007fca258781c0: 8984 2400 | c0fe ff55 | 4883 ec30 

  0x00007fca258781cc: ;   {metadata(method data for {method} {0x0000000800448920} '<init>' '()V' in 'java/lang/Object')}
  0x00007fca258781cc: 48bf 1888 | 801c ca7f | 0000 8b9f | f400 0000 | 83c3 0289 | 9ff4 0000 | 0081 e3fe | 0700 0083 
  0x00007fca258781ec: fb00 0f84 

  0x00007fca258781f0: ;*return {reexecute=0 rethrow=0 return_oop=0}
                      ; - java.lang.Object::<init>@0 (line 44)
  0x00007fca258781f0: 1300 0000 | 4883 c430 

  0x00007fca258781f8: ;   {poll_return}
  0x00007fca258781f8: 5d49 3ba7 | 4003 0000 | 0f87 1f00 

  0x00007fca25878204: ;   {metadata({method} {0x0000000800448920} '<init>' '()V' in 'java/lang/Object')}
  0x00007fca25878204: 0000 c349 | ba20 8944 | 0008 0000 | 004c 8954 | 2408 48c7 | 0424 ffff 

  0x00007fca2587821c: ;   {runtime_call counter_overflow Runtime1 stub}
  0x00007fca2587821c: ffff e8dd 

  0x00007fca25878220: ; ImmutableOopMap {rsi=Oop }
                      ;*synchronization entry
                      ; - java.lang.Object::<init>@-1 (line 44)
  0x00007fca25878220: 6ab6 ffeb 

  0x00007fca25878224: ;   {internal_word}
  0x00007fca25878224: cf49 baf9 | 8187 25ca | 7f00 004d | 8997 5803 

  0x00007fca25878234: ;   {runtime_call SafepointBlob}
  0x00007fca25878234: 0000 e9c5 | 0eac ff90 | 9049 8b87 | d003 0000 | 49c7 87d0 | 0300 0000 | 0000 0049 | c787 d803 
  0x00007fca25878254: 0000 0000 | 0000 4883 

  0x00007fca2587825c: ;   {runtime_call unwind_exception Runtime1 stub}
  0x00007fca2587825c: c430 5de9 | 9c01 b6ff | f4f4 f4f4 | f4f4 f4f4 | f4f4 f4f4 | f4f4 f4f4 | f4f4 f4f4 | f4f4 f4f4 
  0x00007fca2587827c: f4f4 f4f4 
[Exception Handler]
  0x00007fca25878280: ;   {no_reloc}
  0x00007fca25878280: e87b 31b6 

  0x00007fca25878284: ;   {external_word}
  0x00007fca25878284: ff48 bf6a | 7482 41ca | 7f00 0048 

  0x00007fca25878290: ;   {runtime_call}
  0x00007fca25878290: 83e4 f0e8 | 080a ae1b 

  0x00007fca25878298: ;   {section_word}
  0x00007fca25878298: f449 ba99 | 8287 25ca | 7f00 0041 

  0x00007fca258782a4: ;   {runtime_call DeoptimizationBlob}
  0x00007fca258782a4: 52e9 f600 | acff f4f4 | f4f4 f4f4 
[/MachCode]
     34    2       3       java.lang.String::hashCode (60 bytes)


共有1个答案

饶骁
2023-03-14

您需要HotSpot反编译器插件hsdis-amd64.so并将其放在共享库搜索路径上。

您可以从源代码构建它,也可以从此处或此处获取预构建的二进制文件。

 类似资料:
  • 问题内容: 我有以下代码可以打印传递给的参数数量。请注意该部分中的。我已经包括了新行,就像 C中一样 ,但是它不是打印新行而是打印: 参数数量:1 \ n 我的代码是: 我知道在0和“ Number …”之后包含10 将打印它,但我想这样做。我用 NASM 汇编代码,然后通过 GCC 将其链接以创建我的可执行文件。 问题答案: 当您在 NASM中 对字符串使用双引号或双引号时,它不接受 C 样式转

  • 我正在尝试在macOS上的汇编x86_64中打印整数。我已经知道大约有3/4的答案,但我无法解决我的问题。 现在,我会满意地把它倒着印出来。这是代码: mov rax,123;将数字移动到rax寄存器中 调用get_backwards过程 除法和mult需要两个寄存器,一个用于商,一个为余数。对剩余部分进行异或运算,以便清除所有垃圾。 mov转换为rcx,10,这样我就可以得到与数字的最后一位相对

  • Xcode 8.0 beta版(8S128d)上的没有打印任何内容不变 这是我的代码: 以下是iOS 9模拟器上的输出: 以下是iOS 10模拟器上的输出:

  • #include <stdio.h> int global_var; void change_var(){ global_var=100; } int main(void){ change_var(); return 0; } 技巧 通常给函数打断点的命令:“b func”(b是break命令的缩写),不会把断点设置在汇编指令层次函数的开头,例如: (gdb) b m

  • 当我运行这段代码时,没有任何东西被打印到控制台。我应该如何使用logp?

  • 我在标签打印机上打印时遇到了问题。下面的代码在一个上打印4个“标签”(附标签图片)。 下面的代码打印到兄弟QL-500标签打印机上。它打印到3.5"乘1.1"标签上。 如果有人能帮我更好地理解代码,那也太好了。 下面是它打印的内容: