「EXCEPTION_ACCESS_VIOLATION (0xc0000005)」が発生して「Eclipse」が起動できなくなったんだが...

f:id:ts0818:20211113213755j:plain

www.excite.co.jp

ロシアのスマートフォン改造メーカーCAVIARが、今度は8000万年前のティラノサウルスの歯を使ったiPhoneTYRANNOPHONE」を作っちゃいました。デザインは金メッキの爪痕と、Tレックスの大きな顔がチタンで彫刻され、その上に強度の高いPVDコーティングが施されています。

8000万年前のティラノサウルスの歯を使ったiPhone。約98万円で限定7個! (2021年11月13日) - エキサイトニュース

Tレックスの歯は、彫刻のどれか1本だけとのこと。目玉はにも本物の琥珀が使われ、限定7個で価格はiPhone13 Proなら8,610ドル(約98万円)、Maxなら9,150ドル(約104万円)というセレブ価格になっています。

インパクトが凄い

8000万年前のティラノサウルスの歯を使ったiPhone。約98万円で限定7個! (2021年11月13日) - エキサイトニュース

⇧ハラショー!、ウラ~!

「化石」の価値観ってのが揺らいでる~。

まぁ、そんなこんなで、「Eclipse」が起動できなくなった話です。

レッツトライ~。

 

「EXCEPTION_ACCESS_VIOLATION (0xc0000005)」が発生してEclipseが起動できなくなったんだが...

昨日まで、何の問題もなく動いていた「統合開発環境」の「Eclipse」が突然起動できなくなるというね...

Eclipse」の起動ファイル「eclipse.exe」のあるディレクトリを確認してみると、

f:id:ts0818:20211012103422p:plain

⇧ 何やら「hs_err_pidxxxxx.log」なるものが作成されてたので、中身を確認してみたところ、

f:id:ts0818:20211012103712p:plain

⇧ この記事のタイトルにも書かせてもらった「EXCEPTION_ACCESS_VIOLATION (0xc0000005)」なるものが、記載されてましたと。

Oracleさんの公開してる情報によると、

docs.oracle.com

5.1 クラッシュの発生場所の特定

このセクションでは、エラー・ログを使用してクラッシュの原因を見つける方法を説明するいくつかの例を示し、その原因に応じて問題をトラブルシューティングするためのいくつかのヒントを提示します。

https://docs.oracle.com/javase/jp/8/docs/technotes/guides/troubleshoot/crashes001.html

エラー・ログのヘッダーは、エラーのタイプと問題のあるフレームを示し、スレッド・スタックは現在のスレッドおよびスタック・トレースを示しています。「ヘッダー形式」を参照してください。

https://docs.oracle.com/javase/jp/8/docs/technotes/guides/troubleshoot/crashes001.html

⇧ と説明があって、「例5-2 クラッシュの例」を確認すると、

場合によっては、ネイティブ・ライブラリ内のバグがJava VMコード内のクラッシュとして表れます。_thread_in_vm状態で(つまり、Java VMコードで実行されているとき)、JavaThreadが失敗した例5-2のクラッシュを検討してください。

f:id:ts0818:20211012104621p:plain

https://docs.oracle.com/javase/jp/8/docs/technotes/guides/troubleshoot/crashes001.html

⇧「EXCEPTION_ACCESS_VIOLATION (0xc0000005)」が記載されてました。

どうやら、何かしらの影響で「Java」が起動できなくなっているということらしい。

問題のあるフレームがネイティブ・ライブラリであることが致命的エラー・ログで示されている場合は、ネイティブ・コードまたはJava Native Interface (JNI)ライブラリ・コード内にバグが存在する可能性があります。クラッシュが他の原因で発生した可能性ももちろんありますが、最初はライブラリとコア・ファイルまたはクラッシュ・ダンプを分析するのが適切です。致命的なエラー・ログのヘッダーからの例5-1の抜粋を検討してください。

f:id:ts0818:20211113164431p:plain

この場合は、ライブラリlibApplication.so内で実行されているスレッドでSIGSEGV発生しました。

https://docs.oracle.com/javase/jp/8/docs/technotes/guides/troubleshoot/crashes001.html

⇧ とあって、『Problematic frame:』ってところに記載されてる「ライブラリ」が問題を起こしてるということらしい。

で、改めて、「hs_err_pidxxxxx.log」の中身を確認してみると、

#
# A fatal error has been detected by the Java Runtime Environment:
#
#  EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc=0x00007ffce7defa16, pid=6152, tid=22172
#
# JRE version: OpenJDK Runtime Environment (11.0.7+10) (build 11.0.7+10)
# Java VM: OpenJDK 64-Bit Server VM (11.0.7+10, mixed mode, tiered, compressed oops, g1 gc, windows-amd64)
# Problematic frame:
# C  [awt.dll+0x8fa16]
#
# No core dump will be written. Minidumps are not enabled by default on client versions of Windows
#
# If you would like to submit a bug report, please visit:
#   https://github.com/AdoptOpenJDK/openjdk-support/issues
# The crash happened outside the Java Virtual Machine in native code.
# See problematic frame for where to report the bug.
#

---------------  S U M M A R Y ------------

Command Line: -Dosgi.requiredJavaVersion=1.8 -XX:+UseG1GC -XX:+UseStringDeduplication --add-modules=ALL-SYSTEM -Dosgi.dataAreaRequiresExplicitInit=true -Xverify:none -javaagent:dropins/MergeDoc/eclipse/plugins/jp.sourceforge.mergedoc.pleiades/pleiades.jar -javaagent:lombok.jar -Dfile.encoding=utf-8 

Host: Intel(R) Core(TM) i7-4700MQ CPU @ 2.40GHz, 8 cores, 7G,  Windows 10 , 64 bit Build 19041 (10.0.19041.1202)
Time: Tue Oct 12 10:21:41 2021 東京 (標準時) elapsed time: 1 seconds (0d 0h 0m 1s)

---------------  T H R E A D  ---------------

Current thread (0x0000000025723000):  JavaThread "AWT-EventQueue-0" [_thread_in_native, id=22172, stack(0x0000000028b40000,0x0000000028c40000)]

Stack: [0x0000000028b40000,0x0000000028c40000],  sp=0x0000000028c3c830,  free space=1010k
Native frames: (J=compiled Java code, j=interpreted, Vv=VM code, C=native code)
C  [awt.dll+0x8fa16]

...省略

⇧ となっていて、「C  [awt.dll+0x8fa16]」ってのが『Problematic frame:』な「ライブラリ」らしいので、「awt.dll」って「ライブラリ」が元凶らしい。

 

「awt.dll」とは?

そもそもとして、「AWT(Abstract Window Toolkit)」ってものがあるらしく、

Abstract Window Toolkit (AWT) とは、Javaの独自のプラットフォーム非依存なウィンドウシステムグラフィックスユーザインタフェース (UI)、ウィジェット・ツールキットのことである。AWTは現在はJava Foundation Classes (JFC) に含まれ、Javaプログラム用グラフィカルユーザインタフェース (GUI) を提供する標準APIの一部となっている。

Abstract Window Toolkit - Wikipedia

言い換えれば、AWTを使って書かれたGUIプログラムは、Windows上で動作するときはネイティブなWindowsアプリケーションのような外観になるが、Mac上で動作するときはネイティブなApple Macintoshアプリケーションのような外観になる、などということである。

Abstract Window Toolkit - Wikipedia

f:id:ts0818:20211012113111p:plain

AWTの部品を使ったウィンドウの例

Abstract Window Toolkit - Wikipedia

⇧ 説明を読んだ感じ、Javaで「画面」まわりのことを実現したい場合のAPIの集まりらしい。

で、「awt.dll」は、「OS(Operation System)」が「Windows」の場合の「AWT(Abstract Window Toolkit)」ってことらしい。

「what is awt.dll」でGoogle検索したところ、「AWSのクラッシュ」に関するページが先頭から2番目に上位表示されるという...

docs.oracle.com

  • AWTクラッシュのトラブルシューティング:
    • AWTクラッシュの大部分はWindowsプラットフォーム上で発生しますが、それらの原因はスレッドのトレースです。これらの問題の多くがJava SE 6で修正されたので、以前のリリースでクラッシュが発生した場合はまず、その問題がすでに最新リリースで修正されているか確認してみてください。
    • 考えられるクラッシュの原因の1つは、AWTの多くの操作が非同期であることです。たとえば、frame.setVisible(true)を呼び出してフレームを表示させる場合、この呼出しから戻った後でそのフレームがアクティブ・ウィンドウになっている保証はありません。
    • もう1つの例は、ネイティブのファイル・ダイアログに関するものです。オペレーティング・システムがこれらのダイアログを初期化して表示するまで多少の時間がかかるため、setVisible(true)を呼び出してすぐにそれらを破棄してしまうと、クラッシュが発生する可能性があります。したがって、アプリケーション内にいくつかのAWT呼出しがあり、それらが同時に実行されたり短時間に連続して実行されたりする場合には、呼出しの間にある程度の遅延を挿入したり、何らかの同期を追加したりすることをお薦めします。

Abstract Window Toolkit - Wikipedia

⇧ ってなってたので、暫く経ってから、「Eclipse」を起動してみるも、

f:id:ts0818:20211012114641p:plain

⇧ エラーログが吐き出されて、一向に「Eclipse」が起動しない...

PCを再起動してみるも状況は変わらず...

まさかの、

teratail.com

AdoptOpenJDK11.0.6~14以降にて現在も発生している問題です。

https://adoptopenjdk.net/archive.html より、jdk-11.0.5+10 をダウンロードし、Eclipseの実行JDKに jdk-11.0.5+10 を登録して使うことで問題は回避されます。

https://bugs.openjdk.java.net/browse/JDK-8241129
JVM crash on Japanese language Windows when showing a JFrame
JDK version 11.0.6, 15

Java - eclipseでの実行時のエラーについて|teratail

⇧ バグだった模様...

というか今までエラーが起こらなかったのがよく分かりませんな...

で、バグがどうなったかと言うと、

bugs.openjdk.java.net

⇧ 対応がクローズされていて、 バージョン11だと、直せんかったわ、バージョン15で修正してるから、というような感じの報告が...

ただ、

SwingのJFrameを使ったコードで起きてるようですが、最新(JDK15 on Win64)のAdoptOpenJDKでも発生するようです。
発生した方からプロジェクトを出してもらいましたが、手元(mac)では動いており、まだ解決していない気がします。
Github上でissueもあがってますが、あまりよくわかりません(読解力不足)

Java - eclipseでの実行時のエラーについて|teratail

⇧ まさかの直ってなかったというオチ...

Oh, my gosh...

Eclipse」以外の「統合開発環境」でも「AWT(Abstract Window Toolkit)」が突然、機能しなくなる現象が起こるらしい。

qiita.com

 最終的には起動に成功したわけだが、どうしたかというと、

JDKをバージョンダウンした

【NetBeans】起動しなくなってしまった時の話 - Qiita

 起動に成功したから、この記事を書くために再現しようとnetbeans.confを戻したらなぜかそれでも起動できた。一体何だったんだ…。

【NetBeans】起動しなくなってしまった時の話 - Qiita

⇧ ってあるところを見ると、どうも、原因がハッキリしない模様。

ただ、

docs.oracle.com

  • クラッシュが発生したネイティブ・ライブラリがJava Runtime Environment (JRE)の一部(awt.dllやnet.dllなど)である場合は、ライブラリまたはAPIのバグが発生した可能性があります。その場合は、できるだけ多くのデータを収集し、ライブラリ名を示してバグまたはレポートを提出してください。JREライブラリは、JREディストリビューションjre/libまたはjre/binディレクトリにあります。「バグ・レポートの提出」を参照してください。

クラッシュの発生場所の特定

⇧ バグが発生した可能性がありますって...ある日、突然バグが発生するとか、もはや時限爆弾ですやん...心の平穏は得られないのか...

よくこれまで平穏に利用できていたなと、なかなか寒気のする話ですね。

ちなみに、自分は、「Eclipse」を複数インストールしており、今回いきなり起動できなくなったのは、「Eclipse-2020-06」ですかね。

f:id:ts0818:20211012132744p:plain

で、問題の「Eclipse」が起動時に利用してる「awt.dll」はどこにあるのよ?

f:id:ts0818:20211113174113j:plain

どうやら、自分の環境ですと「C:\Eclipse-2020-06\pleiades-2020-06-java-win-64bit-jre_20200702\pleiades\eclipse\jre\bin\awt.dll」が問題を起こしてるってことらしい。

JREJava Runtime Enviroment)」は、以下のものということですね。

f:id:ts0818:20211113172653p:plain

で、

www.publickey1.jp

AdoptOpenJDKプロジェクトはEclipseへの合流後にプロジェクト名を変更することも明らかにしました。新プロジェクト名は「AdoptOpenJDK」とラテン語の接尾辞「-ium」を組み合わせた「Eclipse Adoptium」になる予定です。

AdoptOpenJDKプロジェクトがEclipse Foundationへの合流を発表。合流後の新プロジェクト名は「Eclipse Adoptium」に - Publickey

⇧「AdoptOpenJDK」プロジェクトは「Eclipse Adoptium」プロジェクトになったということらしい。

github.com

⇧ってな感じで、「GitHub」で「AdoptOpenJDK」の「JDKJava Development Kit)」とか「JREJava Runtime Enviroment)」とかを管理してるっぽい。

「AdoptOpenJDK」の「アーカイブファイル」の場所が分かり辛いんだけど、

github.com

GitHubのページで、「temurin11-binaries」ってのが「AdoptOpenJDK」の「JREJava Runtime Enviroment)」のバージョン11がある場所らしい...分かり辛い。

というか、

blog.adoptopenjdk.net

www.infoq.com

⇧「AdoptOpenJDK」じゃなくなって、「Temurin JDK」って名称になったらしい...相変わらず、Javaはカオスだな...

f:id:ts0818:20211113183720p:plain

f:id:ts0818:20211113181839p:plain

で、バージョンを確認するも、え~っと...「11.0.7」ってバージョンが見当たらないんだが...

f:id:ts0818:20211113184355p:plain

⇧ 一応、「view all tags」ってのクリックして確認してみたんだけど、見当たらりませんと...というか、「2021年物」しか存在しないんだが...

こっちは「openjdk 11.0.7 2020-04-14」ってなってるんで、「2020年物」が該当するものだとは思うんだが...

どうやら、「AdoptOpenJDK」プロジェクトと「Eclipse Adoptium」プロジェクトで別々に管理してるらしい...

古いバージョンの「AdoptOpenJDK」の「JDKJava Development Kit)」とか「JREJava Runtime Enviroment)」を探す場合は、「AdoptOpenJDK」プロジェクトのGitHubのほうを参照しないといけないらしい。

■「Eclipse Adoptium」プロジェクト(「Temurin JDK」のバージョン11の配置場所のパス)

https://github.com/adoptium/temurin11-binaries/releases

https://github.com/adoptium/temurin11-binaries/releases    

■「AdoptOpenJDK」プロジェクト(「AdoptOpenJDK」のバージョン11の配置場所のパス)

https://github.com/AdoptOpenJDK/openjdk11-binaries/releases

https://github.com/AdoptOpenJDK/openjdk11-binaries/releases    

⇧ う~ん、管理してる場所を分けるのは構わないんだけど、なんか、一言、公式のサイトとかで説明しておいて欲しいかな...

せめて古いバージョンを管理してるパスのリンクとか載せといてくれても良い気はするよね...

github.com

f:id:ts0818:20211113191311p:plain

f:id:ts0818:20211113191451p:plain

f:id:ts0818:20211113191554p:plain

ダウンロードできたら、「展開(解凍)」します。今回は、「Eclipse」起動時に利用してるであろう「jre」フォルダを上書きする感じにしました。(圧縮ファイルの「展開(解凍)」にはインストールしてる「7-zip」を使ってます)

f:id:ts0818:20211113194142p:plain

そしたら、中身を、問題を起こしてるほうに上書きします。

f:id:ts0818:20211113194233p:plain

で、再度、Eclipseを起動してみるも、駄目でしたけど...

f:id:ts0818:20211113194529p:plain

バージョンの新しいのをダウンロードして差し替えてみる。

Eclipse Adoptium」プロジェクト(「https://github.com/adoptium/temurin11-binaries/releases」)のほうの「JREJava Runtime Enviroment)」をダウンロードしてます。

f:id:ts0818:20211113210919p:plain

f:id:ts0818:20211113210616p:plain

無事、起動しました。というか、「Eclipse」起動時に使用するJavaって「AdoptOpenJDK」だろうが「Temurin JDK」だろうが何でも動くんか...

f:id:ts0818:20211113211034p:plain

う~ん、結局、何でこれまで全く問題なく動いていたバージョンの「JREJava Runtime Enviroment)」が突然起動できなくなったのかの原因がよく分からんね...

同じバージョンの正常な「JREJava Runtime Enviroment)」で差し替えても動かんかったのがね、どうにも気にかかって仕方ないよね...

いまなら、あの言葉を発しても良いのでは?

togetter.com

今回もモヤモヤ感が半端ない...

今回はこのへんで。