tokuhirom's Blog

openjdk をコンパイルして gdb で実行すると sigsegv しちゃうんだけど、って時の対処方法

Java で開発していると openjdk を自分でコンパイルして gdb でステップ実行して内部動作をトレースしたいなーという時があると思います。

そんな時には以下のように、openjdk の configure 時に debug option つけて symbol つけましょう、みたいな情報は調べればすぐ出てくるんです。実際以下のようにオプションつければ OK

bash ./configure --with-debug-level=slowdebug --with-target-bits=64 --disable-zip-debug-info
make all

そして、いざ実行してみると以下のように SIGSEGV だという宣告が!!

(gdb) r
Starting program: /home/tokuhirom/jdk9/./build/linux-x86_64-normal-server-slowdebug/jdk/bin/java NPE
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib64/libthread_db.so.1".
[New Thread 0x7ffff7fd3700 (LWP 19431)]

Program received signal SIGSEGV, Segmentation fault.
[Switching to Thread 0x7ffff7fd3700 (LWP 19431)]
0x00007fffe1000513 in ?? ()

どうしたらいいんだ、とおもって色々情報を探していたんですがまったく情報が見つからず、printf デバッグしていたんですが、ふとした拍子に情報を見つけました。

http://stackoverflow.com/questions/35611119/how-to-debug-openjdk-using-gdb

An information worth mentioning that finally when you start the debugging session with gdb and you run the program you may see a SEGFAULT ignore it and continue till gdb stops at your breakpoint.

ええええええ。SIGSEGV って出てもその後そのまま c してけばいつかブレークポイントにたどり着くので気にしなくていいんだってさ!

めっちゃ時間を無駄にしたわー。