サイトのトップへ戻る

libGDX ドキュメント 日本語訳

サイト内検索

Bullet ラッパーのデバッグ

最新のナイトリー版(安定版ではなく)を使用するか、最新の libGDX codeで直接作業をするようにしてください (また、後者の場合はネイティブ部分を手動でアップデートするようにしてください)。最新版では、あなたの遭遇したトラブルが既に修正されている可能性があります。

Bullet ラッパーを使用している時に問題が発生した場合は、その問題の原因を見つけるのが難しい場合があります。 例えば、以下のようなエラーが表示されることがあります:

# A fatal error has been detected by the Java Runtime Environment:
#
#  EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc=0x000000006a49a450, pid=4040, tid=3912
#
# JRE version: Java(TM) SE Runtime Environment (8.0_05-b13) (build 1.8.0_05-b13)
# Java VM: Java HotSpot(TM) 64-Bit Server VM (25.5-b02 mixed mode windows-amd64 compressed oops)
# Problematic frame:
# C  [gdx-bullet64.dll+0x19a450]
#
# Failed to write core dump. Minidumps are not enabled by default on client versions of Windows
#
# An error report file with more information is saved as:
# C:\Xoppa\code\libgdx	ests\gdx-tests-lwjgl\hs_err_pid4040.log
#
# If you would like to submit a bug report, please visit:
#   http://bugreport.sun.com/bugreport/crash.jsp
# The crash happened outside the Java Virtual Machine in native code.
# See problematic frame for where to report the bug.
#
AL lib: (EE) alc_cleanup: 1 device not closed

生成されたログファイルを見ると、さらに詳しい情報が含まれているでしょう。例えば、javaの呼び出しのスタックトレースなどが。 しかし、bullet ラッパー内で具体的に何悪かったのかについての有用な情報は記載されていないでしょう。 これはラッパーがjavaの呼び出しをネイティブ(C++)ライブラリへ委譲しているためです。 既定では、このライブラリ(例えばWindowsの場合は.dllファイル)にはデバッグ情報は一切含まれていません。

デバッグ情報を付けてBullet ラッパーをコンパイルするどころか、C++ ラッパーと bulletのコード内をトレースすることさえ不可能です。 しかしながら、ほとんどのトラブルではそこまでする必要はありません。最も一般的トラブルの原因は、javaのコードを調べることで判明します。

Bullet ラッパーでの最も一般的なトラブルは、実際にはまだ参照が必要な状況なのに参照を適切に管理していなかったことが原因で起こります。 これによりガベージコレクターがネイティブ(C++)オブジェクトを破棄して、アプリケーションがクラッシュします。 ガベージコレクターを制御することはできないため、このトラブルは端末によってはより頻繁に発生する可能性があります。 詳細についてはcreating and destroying objects の項目を参照してください。



Windows環境でのデバッグする

ネイティブC++ コードをデバッグするには、デバッグ情報を付けてbullet.dll をビルドする必要があります。



ソースコードを取得する

これを行うには、bullet ラッパーのソースコードが必要です。 libgdx github のページへ行き、リポジトリ全体を .zip ファイルとしてダウンロードするか、 git 経由(git clone https://github.com/libgdx/libgdx.git)でクローンを行ってください。 デバッグをするJava プロジェクトは、コンパイルする gdx-bulletと同一のバージョンのibGDXを使用する必要なことを忘れないでください(できれば最新の SNAPSHOT のもの) - そうしないと、出力不一致などが原因であらゆる箇所でJava のローレベル例外が発生してしまいます。



コンパイラー/IDEを取得する

さらに、デバッグ用のIDEとdllをビルドするためのコンパイラが必要です。 Microsoft Visual Studio Express 2013でこの両方が手に入ります。 インストール用の .iso ファイルは ここでダウンロードできます。 ダウンロード後、インストールするには .iso イメージをCDに書き込むか、仮想CDドライブ (例えばDaemon Tools)経由でマウントする必要があります。 以下の手順はVS Express 2013のみで使用できる独自のものです。 例えばVS 2010 SP1上でビルドするには、全てのプロジェクトファイルでToolsVersion="12.0"ToolsVersion="4.0" へ、<PlatformToolset>v120</PlatformToolset><PlatformToolset>v100</PlatformToolset>へ変更する必要があります。 このコードは、適正な最新ビルドツールセット上(2014年11月時点の VS 2010 SP1 では検証済み)でエラーがない状態でコンパイルする必要があります。 あなたの開発環境によっては上手くいかない場合もあるのでご了承ください。



デバッグ用.dllをビルドする

This is really easy as you will find a Visual Studio Project (.sln "Solution") in the sources which should be able to work out of the box. これは libgdx リポジトリ内の libgdx\extensions\gdx-bullet\jni s\gdxBullet\gdxBullet.slnにあります。

Visual Studioでソリューションファイルを開いた後、6つのプロジェクトが表示されます。最も重要なプロジェクトは gdxBulletです。 上部にあるツールバーで正しいビルド設定を選ぶ必要があります。 Debug と、 Win32 もしくは x64を選ぶようにしてください。 このプラットフォームはWindows のバージョンに依存するのではなく、アプリケーションの実行に使用するJVM のバージョンに依存します。 64bit Windowsシステム上では、 32bit Java 版を実行することも可能です(これはごく当たり前のことです)。

そして、ソリューションエクスプローラー内のgdxBulletプロジェクトを右クリックし、"Build"をクリックします。 これで gdxBullet.dllがビルドされます。ビルドには数分かかることがあります。



正しいDLLを読み込む

通常、ネイティブ部分を読み込んでbullet を実行するには、Bullet.init()を呼び出す必要があります。Bullet.init()がまさにその読み込みと実行を行っています。 デバッグ情報を含まない既定のネイティブ部分は読み込みたくないので、自分で新規に作成した gdxBullet.dllを手動で読み込む必要があります。 以下のコードを使ってこの処理を行うことができます。 文字列customDesktopLib の部分は実際のパスに書き換えてください。 そして、通常は Bullet.init()を呼び出している箇所(例えば create メソッド内)でinitBullet()メソッドを呼び出します。

// Set this to the path of the lib to use it on desktop instead of the default lib.
private final static String customDesktopLib = "C:\......\libgdx\extensions\gdx-bullet\jni\vs\gdxBullet\x64\Debug\gdxBullet.dll";
private final static boolean debugBullet = true;

static void initBullet() {
	// Need to initialize bullet before using it.
	if (Gdx.app.getType() == ApplicationType.Desktop && debugBullet) {
		System.load(customDesktopLib);
	} else {
		Bullet.init();
	}
	Gdx.app.log("Bullet", "Version = " + LinearMath.btGetVersion());
}



デバッガを接続する

それでは、アプリを実行してC++デバッガを接続してみましょう。まず最初に、Java アプリを起動する必要があります。 アプリの起動時にブレークポイントを設定し、それからデバッグモードで実行すると良いでしょう。 そうすると、C++デバッガーが接続するための時間が多く確保できます。 これを行うには、Visual Studio に切り替えて Debug -> Attach to Process...を選びます。

それから使用可能なプロセス一覧からアプリの正しいjavaw.exeプロセスを選んで、"Attach"ボタンでデバッガを接続します。

メモ: MS VC++ 2010 Express では、最初にTools->Settings->Expert Settingsを有効にしてプロセスへの接続オプションを取得する必要があります。



デバッグ

この設定が動作するかどうかをテストするために、btDiscreteDynamicsWorld.stepSimulationにブレークポイントを追加することもできます。 このコードを含んでいるファイルは、 gdxBullet -> Source Files -> BulletDynamics -> Dynamics -> btDiscreteDynamicsWorld.cppにあります。

int btDiscreteDynamicsWorld::stepSimulation( btScalar timeStep,int maxSubSteps, btScalar fixedTimeStep) を検索し、このメソッド内の任意のコードの左側をダブルクリックしてブレークポイントを追加してください。

アプリケーションのJava側のブレークポイントで停止した場合、そのブレークポイントを削除してプロセスを再開してください。 Java コードが btDiscreteDynamicsWorld.stepSimulation を呼び出すとすぐにVisual Studioへの切り替えができるようになるので、 デバッガが起動してコードを一行ずつステップインできることを確認してください。