Java core dump


生成Java core dump

可以按照下面這個文章的指引來通過jni調用觸發Java core dump

Generating a Java Core Dump

基本思路是通過Java調用本地C代碼,然后在C代碼中觸發一個錯誤,從而引發jvm

crash。

需要注意兩個問題

  1. gcc編譯的時候需要注意庫的名稱,例子里面是libnativelib.so,需要改為libnativelib.jnilib
$ gcc -fPIC -o libnativelib.jnilib -shared \
            -I$JAVA_HOME/include/linux/ \
            -I$JAVA_HOME/include/ \
             CoreDumper.c
  1. 例子中的命令是基於linux的,如果在mac下jni_md.h頭文件的位置和linux稍有不同,在用gcc編譯的時候要注意下,需要把jni_md.h文件復制到對應的目錄
sudo cp $JAVA_HOME/Contents/Home/include/darwin/jni_md.h $JAVA_HOME/Contents/Home/include
  1. java.lang.UnsatisfiedLinkError: no XXX in java.library.path

在執行java mainClass的時候可能會報這個錯誤,因為java執行mainClass的時候mainClass需要帶有package名稱,要看下生成的libnativelib.jnilib在那一個目錄,使用-Djava.library.path指向libnativelib.jnilib的路徑

經過上面一頓操作之后,就可以看到執行java目錄下面有一個hs_err_pidxxx.log文件,在對應的目錄下還有core dump文件,mac下的core dump目錄是

/cores

不過有可能並沒有生成core dump,只有hs_err_pidxxx.log文件,我們看下hs_err_pidxxx.log文件,其中有一行

# Failed to write core dump. Core dumps have been disabled. To enable core dumping, try "ulimit -c unlimited" before starting Java again

根據提示core dump失敗了,可以通過設置ulimit -c unlimited再重新試下,就可以在/cores目錄下找到類似core.xxx的文件。

因為mac下會限制進程對資源的限制,-c表示core文件的最大值,單位為區塊,ulimit -c unlimited設置為無限制。注意在當前shell中執行只會對當前shell生效。

core dump分析

hs_err_pidxxx.log是一個文本日志文件,可以直接查看。core dump文件可以通過gdb、jmap、jstack來分析,具體可以參考Analysing a Java Core Dump

參考

JVM Crashes的常見原因:Staying on Top of JVM Crashes

gcc編譯找不到jni_md.h:Mac下Java JNI 調C

java.lang.UnsatisfiedLinkError: no XXX in java.library.path

Analysing a Java Core Dump

ulimit命令

linux中ulimit作用


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM