Javaをデバッグ実行したくOpenJDKをmac上でビルドした時のメモ。僕の環境は以下の通り。
ビルド環境
- OS X EL Captain 10.11.5
- XCode7.3.1
- JDK1.8.0_77
1 2 3 4 |
$ 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でホスティングされているのでインストールする。
1 |
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 |
1 2 3 4 |
$ 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のサンプルプログラムは以下の通り。
1 2 3 4 5 6 7 |
package sample; public class Hello { public static void main(String args[]) { System.out.println("Hello World"); } } |
続いてサンプルプログラムをコンパイルしjavaを実行してみる。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
$ 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で落ちる。。この先は深くてまだ追えていない。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
* 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 |
参考リンク
- 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
コメント