A sample text widget

Etiam pulvinar consectetur dolor sed malesuada. Ut convallis euismod dolor nec pretium. Nunc ut tristique massa.

Nam sodales mi vitae dolor ullamcorper et vulputate enim accumsan. Morbi orci magna, tincidunt vitae molestie nec, molestie at mi. Nulla nulla lorem, suscipit in posuere in, interdum non magna.

ぬるぽ(エラーとの付き合い方)

 ∧_∧    
 ( ´∀`)< ぬるぽ 

  ( ・∀・)   | | ガッ 
 と    )    | | 
   Y /ノ    人 
    / )    <  >__Λ∩ 
  _/し’ //. V`Д´)/ 
 (_フ彡        / 

マイクラサーバを運用する上で欠かせないのがプラグインやModだと思いますが、旨く動かないことも多いので、これらとどう付き合って行くかがマイクラサーバ運用の肝の一つだと思います。
本当はプラグインのソースまで読めればベストなのですが、さすがにそこまでは厳しいという人も多いと思いますので、エラーメッセージの読み方についてつぶやいてみます。

とても難しい内容だと思ってますが、サーバの管理をするなら避けては通れない道だと思うので、がんばって理解してみて下さい。

Javaとマイクラ

まず、マイクラサーバの仕組みを紐解いてみます。マイクラサーバはJavaで動いてます。なので、Javaとマイクラサーバがどのように関連しているかを知ることが大切です。
※このイメージが出来てないと、エラーログの意味がわからないので。

JavaはSun マイクロシステムズが・・・そんなことはどうでもいいや。一言でJavaと言いますが、プログラム言語、実行環境、開発キットを示す場合があります。なので、言葉の意味について整理してみましょう。

  • Java言語・・・プログラムを開発する為のプログラム言語。
  • Java実行環境(Java Runtime Environment/JRE)
  • Java開発キット(Java Development Kit/JDK)

なにそれ?って感じですが、プログラム言語については多くを語る必要は無いと思うので割愛します。
JDKに当たる物は別にJava特有では無く、Java以外の言語にもあるので珍しい物ではありません。要するにプログラム開発者向けのパッケージです。ただ、Javaの場合、開発者だけでなく使用者へ求められる場合も希にあります。JDKには(たしか)JREも含まれてるので、JDKがあればJREは不要だったはずです。(おぼろげ)

重要なのはJREです。
マイクラを代表とするJavaプログラムは、Windowsだけでなく、Unix/LinuxやMacでも動きます。本来これはOSの仕事でありつつも非常に難しいことで、Windowsが登場する以前は、ハードウェア毎にソフトウェアが売ってたくらい難しいことです(例えばNECパソコン用のゲームとか)
OSが進化することで、このようなハードウェアの違いをOSが緩和してくれてますが、やはりWindows専用ソフト、Mac専用ソフトが登場しています。
Javaは、そういったOSの違いを緩和してくれることを主軸に作られたプログラム言語なんですが、そのOSの違いを緩和する仕組みとしてJVM(Java仮想マシン)というのが存在してます。そういうJavaプログラムを実行する環境がJREです。

だからそれが何か?と思われるので、マイクラなどを含めたJavaプログラムの実行環境を絵面にするとこんな感じになる訳です。
minecraft_env
JDKはJREなどを含めた開発者向け便利ツールで、本来的には実行そのものに影響する物では無いので、ここでは省略します。

前述で、OSはハードウェアの違いを無くし、JavaはOSの違いを無くすと書きましたが、要するに、プログラムとハードウェアの間に立ってお互いの翻訳してるだけです。これと同様に、マイクラサーバにはプラグインを導入できませんが、これはBukkitやSpigotが間に立ってやり取りをしてくれているからなんです。

JREが重要というより、この構造が後述でもとても重要な意味を持ってくるので、ざっくり理解しておいて下さい。

そもそもエラーって何?

まぁ、プログラムが旨く動いていないことなんですが、エラーについても少し深掘りが必要です。
サーバの動作がおかしいときはだいたい以下の様な「ERROR」表示がでます。出ないで落ちる時もあります。

[10:53:10] [Server thread/ERROR]: Could not pass event BlockBreakEvent to HawkEye v1.6.2 org.bukkit.event.EventException
        at uk.co.oliwali.HawkEye.listeners.HawkEyeListener$1.execute(HawkEyeListener.java:60) ~[?:?]
        at org.bukkit.plugin.RegisteredListener.callEvent(RegisteredListener.java:62) ~[spigot-1.7.10-R0.1-SNAPSHOT_1649-20141001a.jar:git-Spigot-1.7.9-R0.2-207-g03373bb]
        at org.bukkit.plugin.SimplePluginManager.fireEvent(SimplePluginManager.java:509) [spigot-1.7.10-R0.1-SNAPSHOT_1649-20141001a.jar:git-Spigot-1.7.9-R0.2-207-g03373bb]
        at org.bukkit.plugin.SimplePluginManager.callEvent(SimplePluginManager.java:494) [spigot-1.7.10-R0.1-SNAPSHOT_1649-20141001a.jar:git-Spigot-1.7.9-R0.2-207-g03373bb]
        at net.minecraft.server.v1_7_R4.PlayerInteractManager.breakBlock(PlayerInteractManager.java:264) [spigot-1.7.10-R0.1-SNAPSHOT_1649-20141001a.jar:git-Spigot-1.7.9-R0.2-207-g03373bb]
        at net.minecraft.server.v1_7_R4.PlayerInteractManager.a(PlayerInteractManager.java:192) [spigot-1.7.10-R0.1-SNAPSHOT_1649-20141001a.jar:git-Spigot-1.7.9-R0.2-207-g03373bb]
        at net.minecraft.server.v1_7_R4.PlayerConnection.a(PlayerConnection.java:565) [spigot-1.7.10-R0.1-SNAPSHOT_1649-20141001a.jar:git-Spigot-1.7.9-R0.2-207-g03373bb]
        at net.minecraft.server.v1_7_R4.PacketPlayInBlockDig.a(PacketPlayInBlockDig.java:41) [spigot-1.7.10-R0.1-SNAPSHOT_1649-20141001a.jar:git-Spigot-1.7.9-R0.2-207-g03373bb]
        at net.minecraft.server.v1_7_R4.PacketPlayInBlockDig.handle(PacketPlayInBlockDig.java:65) [spigot-1.7.10-R0.1-SNAPSHOT_1649-20141001a.jar:git-Spigot-1.7.9-R0.2-207-g03373bb]
        at net.minecraft.server.v1_7_R4.NetworkManager.a(NetworkManager.java:186) [spigot-1.7.10-R0.1-SNAPSHOT_1649-20141001a.jar:git-Spigot-1.7.9-R0.2-207-g03373bb]
        at net.minecraft.server.v1_7_R4.ServerConnection.c(ServerConnection.java:81) [spigot-1.7.10-R0.1-SNAPSHOT_1649-20141001a.jar:git-Spigot-1.7.9-R0.2-207-g03373bb]
        at net.minecraft.server.v1_7_R4.MinecraftServer.v(MinecraftServer.java:734) [spigot-1.7.10-R0.1-SNAPSHOT_1649-20141001a.jar:git-Spigot-1.7.9-R0.2-207-g03373bb]
        at net.minecraft.server.v1_7_R4.DedicatedServer.v(DedicatedServer.java:289) [spigot-1.7.10-R0.1-SNAPSHOT_1649-20141001a.jar:git-Spigot-1.7.9-R0.2-207-g03373bb]
        at net.minecraft.server.v1_7_R4.MinecraftServer.u(MinecraftServer.java:584) [spigot-1.7.10-R0.1-SNAPSHOT_1649-20141001a.jar:git-Spigot-1.7.9-R0.2-207-g03373bb]
        at net.minecraft.server.v1_7_R4.MinecraftServer.run(MinecraftServer.java:490) [spigot-1.7.10-R0.1-SNAPSHOT_1649-20141001a.jar:git-Spigot-1.7.9-R0.2-207-g03373bb]
        at net.minecraft.server.v1_7_R4.ThreadServerApplication.run(SourceFile:628) [spigot-1.7.10-R0.1-SNAPSHOT_1649-20141001a.jar:git-Spigot-1.7.9-R0.2-207-g03373bb]Caused by: java.lang.NullPointerException
        at org.bukkit.craftbukkit.v1_7_R4.block.CraftBlock.getRelative(CraftBlock.java:179) ~[spigot-1.7.10-R0.1-SNAPSHOT_1649-20141001a.jar:git-Spigot-1.7.9-R0.2-207-g03373bb]
        at org.bukkit.craftbukkit.v1_7_R4.block.CraftBlock.getRelative(CraftBlock.java:175) ~[spigot-1.7.10-R0.1-SNAPSHOT_1649-20141001a.jar:git-Spigot-1.7.9-R0.2-207-g03373bb]
        at uk.co.oliwali.HawkEye.blocks.BedBlock.getCorrectBlock(BedBlock.java:48) ~[?:?]
        at uk.co.oliwali.HawkEye.listeners.MonitorBlockListener.onBlockBreak(MonitorBlockListener.java:49) ~[?:?]
        at sun.reflect.GeneratedMethodAccessor206.invoke(Unknown Source) ~[?:?]
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:1.7.0_65]
        at java.lang.reflect.Method.invoke(Method.java:606) ~[?:1.7.0_65]
        at uk.co.oliwali.HawkEye.listeners.HawkEyeListener$1.execute(HawkEyeListener.java:57) ~[?:?]
        ... 15 more

エラーの出方も様々で、多量に出る物や、1回出た後に何事も無く 動き続けるもの、プラグインが切り離される場合など様々です。
ログにはいろんなタイプのエラーが出ますが、実はこれはエラーでは無く、例外処理と言います。一行目の末尾に「Exception」と書かれていますが、これを直訳すると「例外」です。
BukkitやSpigotのプラグインで出るエラーはほぼこの「例外処理が発生した」と言ってます。あるいはクラッシュしてダウンすることもありますが、それは後で書きます。

例外処理って何?ってことなんですが、本来エラーとはプログラムがそれ以上動作できない様な事象のことを指します。例えばコンピュータは「10÷0」という計算をすることが出来ないんですが、それをやらせるとエラーで止まります。(パソコン付属の電卓などでも出来ないので試してみるとわかりやすいかも)
「エラーで止まる」と一言で言いますが、これは大変なことで、最近のパソコンではいくつも同時にプログラムが動いてますが、これら一つでもエラーが起きるとパソコン自体が止まることを意味します。Windowsなんでしょっちゅうエラーが出るので、その度に止まってたら話になりません。
例外処理というのは、プログラムの途中で想定外の事が発生したことを見越して、その想定外が発生したらその種類毎に問題を解消する処理をさせる処理のことを言います。
絵に描くとこんな感じです。

minecraft_exe

なので、プラグインのエラーはほとんどが「想定外のことが起きたよ」と言ってるだけで、その想定外の内容を知らせてくれてるだけです。
問題なのは、Java以外にもこの例外処理というのが使えるのですが、最近は「例外処理が発生することを見越してプログラムする」ということも少なくないので、短絡的に「エラー→ダメ」とは言い切れない実情があります。

何が起きたかを掴む(マイクラクラッシュ編)

さて、話をマイクラに戻しますが、要はエラーなどのログから、何が発生したかを掴めれば、対処がしやすいかも?ってことです。
本当は、何故例外が発生したか、それに対してどうしたかまで掴めればいいのですが、そこまで理解するのはちょっと難しいです。少なくとも後者はプログラムを読まないとわからない事が多いですしね。

先ずは上記の例外処理の例に行く前にマイクラ自体の「クラッシュ」について語ってみます。
例外処理というのは「例外処理というプログラムが動いている」ので、そもそもプログラムが止まっている訳ではありません。マイクラサーバ自体が止まる(クラッシュ)というのはつまり例外処理すらできなくなった、あるいは例外処理の中でプログラムの続行が不可能と判断された場合です。
つまり、どこで問題が起きているかというとここです。

minecraft_env2

プラグイン自体がマイクラプログラムを止める時もありますが、それはそれでログに出ますが、よほどの事が無いとそんなことはしないでしょう。
私が経験したのでは、

  • ハードウェアがぶっ壊れてた。
  • OSの動きの問題(すごく重い・メモリが足りない)。

と言うのが大勢です。ハードウェアについてはマイクラの挙動に関わるのはCPU、メモリ、マザーボードくらいなので、その辺を怪しむべきですね。ちなみに1日3,4度サーバがダウンすることがありましたが、そのときはマザーボード(メモリスロット)の故障でした。この辺はmemtest86などの検査ツールが便利ですよ。
ちなみに「Javaのバグ」や「Javaがちゃんとインストールされていない」の可能性もありますが、私はまだ当たったことがありません。

あと、ForgeやModはインストール時にマイクラのプログラムを置き換えるようなことをするので、プラグインにおけるBukkitやSpigotのような緩衝材となるプログラムが存在しません。だからこれらの致命的なエラーの場合は誰も緩衝材になってくれないのでマイクラ自体が止まることも多いです。

何が起きたかを掴む(プラグインの例外処理編)

マイクラサーバの動作は以下の様にループしてて、イベントが起こり都度処理をする仕組みになってます。

minecraft_event

イベントというのは例えばマイクラの中で場所を移動したりとか敵に攻撃したりとかそういうことです。処理は、場所の移動、ダメージの計算などです。
同じ例外処理のメッセージが多量に発生するのは、つまりこのループの中でエラーが発生し続けていて、それを解消できていないということになります。

問題はその「イベント(切っ掛け)」が何なのか?なんですが、単にプレイヤーが移動したとか、Mobが移動したなど、いろいろ考えられます。
逆に1回しか出ない例外は、コマンドの実行に起因してたり、1回の例外で復旧できた(例えばプラグインの切り離しもそう)場合です。

早速、例外処理の読み方を見ていきましょう。上の方に書いたメッセージの読み方です。

先ず、一行目にどういう例外処理が発生したかがメッセージとして出ます。

[10:53:10] [Server thread/ERROR]: Could not pass event BlockBreakEvent to HawkEye v1.6.2 org.bukkit.event.EventException

これはHawkEyeというプラグインで、BlockBreakEventが失敗したという例外処理「org.bukkit.event.EventException」が発生したという意味だと思います。
本当にプログラムに精通した人じゃ無いと正確な意味はわからないので、文言から何が起きたかを予測してみましょう。
HarkEyeというプラグインはプレイヤーの挙動をデータベースに記録していくプラグインで、当然ブロックを壊した際にもその記録がされます。だから、それが失敗したんでしょうね。

これだけでもある程度原因を調べられそうですが、二行目以降も見ておきましょう。

at uk.co.oliwali.HawkEye.listeners.HawkEyeListener$1.execute(HawkEyeListener.java:60)
at org.bukkit.plugin.RegisteredListener.callEvent(RegisteredListener.java:62)
~略~
at net.minecraft.server.v1_7_R4.PlayerInteractManager.breakBlock(PlayerInteractManager.java:264)
~略~

大分省略しましたが、一番目の行がエラーの発生箇所を示してます。HawkEyeListener.javaというプログラムの60行目でエラーが出ましたよという事です。
ちなみに「uk.co.oliwali.HawkEye.listeners.HawkEyeListener」とか「org.bukkit.plugin.RegisteredListener.callEvent」とかというのは、Javaというプログラムはプログラムを部品として開発して結合して動かす仕組みを取ってますが、そのプログラム部品の名前です。プログラム部品の名前が被ると困るので、頭にURLを逆にしたような文字をひっつけることが推奨されてます。私がJavaプログラムをつくるとしたら「jp.d77.云々」って名前になるんでしょうね。

プログラム部品がプログラム部品を呼び出して処理しているので、一行目の「HawkEyeListener.java」を呼んだのは二行目の「RegisteredListener.java」の62行目だよってことを示してます。つまりこの長いメッセージはそれぞれ誰に呼び出されたかを遡って表示してます。いい加減長いので最後は「… 15 more」って省略されちゃってますが

エラーから原因を調べる際には、ログからヒントを読み出さなければなりません。だから、一行目や二行目でわからない場合はその下の方を追っていくと、何かヒントが見つかるかもしれませんね。また、以下の図の様に、

minecraft_env

プラグインのエラーを呼び出したのはBukkitやSpigot、それを呼び出したのはマイクラ自身・・・とより深い層まで追うことも出来る訳です。
さて、あとはマイクラの仕組みなどを考えながら原因を探らなければなりません。上記のHawkEyeの場合はブロックの破壊を記録出来なかった訳ですが、1回出ただけなら偶然バグに当たったなども考えられますので、様子を見て考えるのも手でしょう。繰り返し出るなら特定のブロックに起因してるかもしれません。全てで出るならそもそもプラグインとしてまともに動いていないと判断する必要もあります。
プラグインがまともに動いてないなら、切り離すなり、バージョンアップ(あるいはバージョンダウン)を検討する必要もあるかもしれませんね。

もう少し、ケース別に例を見ていきます。

例外メッセージの一行目に設定ファイル名や設定項目が出てる場合

設定ファイルの書きそんじを怪しみましょう。ミスってる場所を示してくれる場合もあります。単純な文字コードが間違ってるとかカッコを忘れたりとか様々です。

java.lang.NoClassDefFoundError: org/bukkit/craftbukkit/v1_7_R2/…

プラグインが動かそうとしたbukkitのバージョンに対応してない時に出ます。
マイクラで例えばサーバが1.7.4の環境で1.7.2のクライアントが繋がったりとか、逆に1.7.9は繋がらないとか経験したことがあると思います。
これは、1.7.2は1.7.R1、1.7.9は1.7.R4というような内部的なバージョンが存在している訳なんですが、プラグインがそういうバージョンに依存する作りになってる場合、アンマッチだとこれが出ます。だから、サーバが1.7.10でプラグインが1.7.9のが出てれば、表向きのバージョンは違いますが内部バージョンが同じなので動く場合があります。

あるプラグインの例外で別のプラグインの名前が出てきた

別のプラグインが前提になってるにもかかわらず前提プラグインが無い場合に出ます。

何かエラーにメッセージ的な内容が含まれてる

ちゃんと翻訳して読むとわかる場合があります。例えば、「データファイルが無いです」というのは結構ありがちです(無いので作ってくれている場合は次回以降表示されない)

Outofmemoryとか

その名の通り、メモリ不足で止まったなど。

プラグインのプログラム部品名が別のプラグインと被ってる

過去に一度あったのですが、プログラム部品の名前が被ってたというのがありました。これはエラーから直接わからなかったですね。例外メッセージとプラグイン名でググったらそういう投稿を見つけてわかった感じです。
対処もプラグインプログラムの修正でないと直らないです。

何が起きたかを掴む(Mod編)

Mod系はちょっと難しいです。何故ならやはり例外処理を出す事が多いのですが、かなり深い場所でのメッセージの場合が多く、読んだだけでは理解できなかったり、理解できても対処しようが無いことが多いです。メッセージをそのままググって他の人も同じような目に遭ってないか調べてみるのがいいかもしれませんね、、、。

ですので、Mod系を大量に導入する場合は1つ導入しては起動というのを繰り返し、どのModが原因となってるのを掴むのが手っ取り早い場合も多いです。
マイクラのプログラムを書き換えるという特性上、書き換えたのを別のModがさらに上書きしてしまうこともありがちです。(その場合は導入順序の見直しで直る場合もあります)

 

と、、、ちょっと難しい内容でしたが、マイクラのサーバ管理をする上で、プラグインのエラーと付き合わなければならないので、この辺の知識が必要になってくると思います。逆にエラーの原因が掴めなくてあえなくサーバ閉鎖、、、、なんてのも少なくありません。
エラーログは何だかわからないメッセージの羅列で読むのもおっくうかと思いますが、読めるようになるのも慣れなので、わからなくてもなるべくがんばって読み解くようにしてみましょう。

ちなみに、タイトルに書いたぬるぽとは、NullPointerExceptionという例外の一種で、データの所在を示す情報(ポインター)がNull(=0/空)のまま処理すると出る例外です。原因はプログラマのミス(バグ)が大多数で、Javaに関わらず近年の様々なプログラム言語でとても出やすい例外です。マイクラでもこれはソコソコでる事がありますが、内容の通りそのメッセージから対処するのは困難かもしれませんねぇ。

コメントを残す

これらのHTMLタグが利用可能です

<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

  

  

  

Time limit is exhausted. Please reload CAPTCHA.

A sample text widget

Etiam pulvinar consectetur dolor sed malesuada. Ut convallis euismod dolor nec pretium. Nunc ut tristique massa.

Nam sodales mi vitae dolor ullamcorper et vulputate enim accumsan. Morbi orci magna, tincidunt vitae molestie nec, molestie at mi. Nulla nulla lorem, suscipit in posuere in, interdum non magna.