Linux下JDB斷點調試&HSDB查看內存佈局

JDK中提供了命令行下的斷點調試工具:JDB。它可以調試正在運行或未運行的Java程序。
現在我們編寫一個Java程序

public class Hello {
  private String s0 = "private";
  public String s1 = "public";
  public static String s2 = "static";
  public static final String s3 = "static final";
  public static void main(String[] args) {
        String s4 = "local";
        String s5 = new String("local");
        s5.intern();
        System.out.println(s4 == s5);
  }
}

編譯生成Hello.class文件。
然後命令行運行jdb:

jdb Hello

可能會出現類似下面的錯誤。
error
錯誤信息中,address=lslxy1021:38885引起了我們的注意。
查看hosts文件:
hosts
將lslxy1021所在行註釋,問題解決。

JDB 調試

(不清楚命令的可鍵入 help 查看幫助信息)
首先在main方法上設置一個斷點:

  • stop in Hello.main
    stop
  • 運行程序至斷點處:run
    run
  • 運行下一行:next
    next
    這裏我們先next到這裏停止。
    until

HSDB查看內存佈局

新開一個窗口,首先獲取剛纔程序的pid。
運行jcmd -l,得到pid爲269837。
接下來通過HSDB查看內存佈局(針對JDK 9+版本,JDK 8中啓動方式略有不同)
命令行輸入命令:jhsdb clhsdb(clhsdb即hsdb的命令行版)
輸入universe命令查看GC堆的地址範圍和使用情況

輸入scanoops start end type 查詢指定類型(包括派生類),我這裏輸的命令是scanoops 0x00000000e3400000 0x00000000ee150000 java.lang.String,結果掃描出來的有點多。。。
在這裏插入圖片描述
我們可以用findpc address命令查看某個地址分配在哪個區域中,用inspect命令查看具體某個地址中的內容。
在這裏插入圖片描述

未完待續

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章