Building OpenJDK9 on Mac

Javaをデバッグ実行したくOpenJDKをmac上でビルドした時のメモ。僕の環境は以下の通り。

ビルド環境

  • OS X EL Captain 10.11.5
  • XCode7.3.1
  • JDK1.8.0_77
$ java -version
java version "1.8.0_77"
Java(TM) SE Runtime Environment (build 1.8.0_77-b03)
Java HotSpot(TM) 64-Bit Server VM (build 25.77-b03, mixed mode)
  • OpenJDK9

ビルド

OpenJDKのリポジトリはmercurialでホスティングされているのでインストールする。

brew install hg

続いてOpenJDK9のビルド。OpenJDK9からは、clangコンパイラに対応しているらしい。README-builds.htmlを読むと、以下のようなビルド環境が前提となっている。

Base OS and Architecture OS C/C++ Compiler Bootstrap JDK
Mac OS X X64 (64-bit) Mac OS X 10.9 “Mavericks” Xcode 6.3 or newer JDK 8
$ hg clone http://hg.openjdk.java.net/jdk9/jdk9 jdk9
$ cd jdk9 && bash get_source.sh
$ bash configure --with-jobs=4 --disable-warnings-as-errors --enable-debug
$ make all

無事にビルドが終わるとbuildディレクトリ下に各種バイナリファイルが生成される。

デバッグ実行

今回は、lldbを使って行なう。ちなみに、gdbの場合はコード署名が必要となる(参考リンク参照)。

Javaのサンプルプログラムは以下の通り。

package sample;

public class Hello {
  public static void main(String args[]) {
    System.out.println("Hello World");
  }
}

続いてサンプルプログラムをコンパイルしjavaを実行してみる。

$ build/macosx-x86_64-normal-server-fastdebug/jdk/bin/javac sample/Hello.java
$ build/macosx-x86_64-normal-server-fastdebug/jdk/bin/java sample.Hello
Hello World
$ easy_install six
$ lldb build/macosx-x86_64-normal-server-fastdebug/jdk/bin/java
(lldb) br s -n main
Breakpoint 1: 21 locations.
(lldb) r sample.Hello
There is a running process, kill it and restart?: [Y/n] Y
Process 28049 exited with status = 9 (0x00000009) 
Process 28053 launched: '/Users/guest/workspace/openjdk/jdk9/build/macosx-x86_64-normal-server-fastdebug/jdk/bin/java' (x86_64)
java was compiled with optimization - stepping may behave oddly; variables may not be available.
Process 28053 stopped
* thread #1: tid = 0xa3e94, 0x00000001000019f6 java`main(argc=2, argv=0x00007fff5fbff908) + 26 at main.c:101, queue = 'com.apple.main-thread', stop reason = breakpoint 1.1
    frame #0: 0x00000001000019f6 java`main(argc=2, argv=0x00007fff5fbff908) + 26 at main.c:101 [opt]
   98  	    const jboolean const_javaw = JNI_FALSE;
   99  	#endif /* JAVAW */
   100 	
-> 101 	    JLI_InitArgProcessing(!HAS_JAVA_ARGS, const_disable_argfile);
   102 	
   103 	#ifdef _WIN32
   104 	    {

ステップ実行していくと、get_cpu_info_stub(&_cpuid_info);の所でSIGSEGVで落ちる。。この先は深くてまだ追えていない。

* thread #5: tid = 0xb68ce, 0x0000000103bca320 libjvm.dylib`VM_Version::get_processor_features() + 100 at vm_version_x86.cpp:477, stop reason = step over
    frame #0: 0x0000000103bca320 libjvm.dylib`VM_Version::get_processor_features() + 100 at vm_version_x86.cpp:477 [opt]
   474 
   475    // Get raw processor info
   476 
-> 477    get_cpu_info_stub(&_cpuid_info);
   478 
   479    assert_is_initialized();
   480    _cpu = extended_cpu_family();
(lldb) n
Process 28991 stopped
* thread #5: tid = 0xb68ce, 0x0000000105800513, stop reason = signal SIGSEGV
    frame #0: 0x0000000105800513
->  0x105800513: movl   (%rsi), %eax
    0x105800515: leaq   0x30(%rbp), %rsi
    0x105800519: movl   $0x10000, %eax            ; imm = 0x10000 
    0x10580051e: andl   0x4(%rsi), %eax

debug-xcode

参考リンク

  • http://openjdk.java.net
  • http://jcdav.is/2015/08/26/building-a-debug-jvm/
  • https://bugs.openjdk.java.net/browse/JDK-8152856
  • http://d.hatena.ne.jp/torazuka/20150102/buildjdk9
  • http://qiita.com/takahashim/items/204ffa698afe09bd4e28
  • http://lldb.llvm.org/lldb-gdb.html

byebyehaikikyou

日記やIT系関連のネタ、WordPressに関することなど様々な事柄を書き付けた雑記です。ITエンジニア経験があるのでプログラミングに関することなどが多いです。

シェアする

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

コメントする

Translate »