印刷ビューの終了

Java SE 7 デスクトップテクノロジのトラブルシューティングガイド

印刷ビュー

ドキュメント情報

はじめに

1. はじめに

1.1 Java SE デスクトップテクノロジの概要

1.1.1 Java SE デスクトップの紹介

1.1.2 AWT

1.1.3 Java 2D

1.1.4 Swing

1.1.5 国際化

1.1.6 サウンド

1.1.7 プラグイン

1.2 トラブルシューティングの一般的なヒント

1.3 問題の分野の特定

1.3.1 クラッシュ

1.3.2 パフォーマンスの問題

1.3.3 動作の問題

1.4 基本的なツール

1.5 JDWP を使用したデバッグ

2. AWT

3. Java 2D

4. Swing

5. 国際化

6. Java Sound

7. アプレットと Java Web Start アプリケーション

8. バグレポートの送信

A. Java 2D のプロパティー

B. 致命的エラーログ

第 1 章

はじめに

この章では、さまざまな Java SE クライアントテクノロジ間の相互作用について説明します。この章ではさらに、問題のトラブルシューティングの開始場所となるテクノロジをユーザーが特定するための手助けをします。

1.1 Java SE デスクトップテクノロジの概要

Java SE デスクトップは、Java SE デスクトップの概要に関するサイトで説明しているいくつかのテクノロジから構成されます。このガイドでは現在のところ、次のデスクトップテクノロジのトラブルシューティング手順について説明しています。

このセクションでは、さまざまなデスクトップテクノロジ間の相互作用について説明します。また、ネイティブコードと連携して動作したり、ハードウェア構成やソフトウェア構成などの環境に依存したりする可能性の高いテクノロジについても説明します。

これらのテクノロジ間の関係の理解が深まるほど、問題が属する分野をすばやく特定できるようになります。

1.1.1 Java SE デスクトップの紹介

Java SE デスクトップの Java テクノロジは、リッチクライアントアプリケーションおよびアプレットを作成するために使用されます。デスクトップツールおよびライブラリは、プラットフォームのコアツールおよびライブラリとのインタフェースを備えています。

Java SE デスクトップの概要
コアツールおよびライブラリの上にデスクトップテクノロジがあり、その上にユーザーアプリケーションがあることを示す概要

1.1.2 AWT

Abstract Window Toolkit (AWT) は、グラフィカルユーザーインタフェース (GUI) プログラミングをサポートします。この API は、開発者に次の機能を提供します。

これらのクラスはソフトウェアスタックの最下部 (ベースとなるオペレーティングシステムやデスクトップシステムにもっとも近い位置) にあります。

AWT は一連の重量コンポーネントも提供します。

純粋な AWT アプリケーションは通常、Swing に関係しません。AWT アプリケーションでカスタムレンダリングを行う場合は、Java 2D が使用されます。

1.1.3 Java 2D

Java 2D API は、2 次元の高度なグラフィックスとイメージングを処理するクラスの集まりです。この API は、AWT のグラフィックス、テキスト、およびイメージング機能を拡張します。

Java 2D もソフトウェアスタックの最下部 (ベースとなるオペレーティングシステムやデスクトップシステムにもっとも近い位置) にあります。

1.1.4 Swing

Swing クラスは AWT と Java 2D のアーキテクチャーの上に構築されています。Swing には、GUI を構築し、Java アプリケーションに豊富なグラフィックス機能や対話処理を追加するための一連のコンポーネントが実装されており、プラグイン可能な Look & Feel 機能も備えています。

Swing は軽量ツールキットなので、ネイティブプラットフォームとの対話処理はほとんどありません。Swing はレンダリングに Java 2D を使用し、AWT が Window、Frame、Dialog などのトップレベルコンポーネントの作成および操作機能を提供します。

1.1.5 国際化

国際化とは、技術的な変更をせずにソフトウェアをさまざまな言語および地域に適合させるための、アプリケーションの設計プロセスのことです。

1.1.6 サウンド

Java Sound は、オーディオおよび MIDI (Musical Instrument Digital Interface) データのキャプチャーや処理、再生といった、サウンド処理の入力と出力を制御するための低レベルの API を提供します。

1.1.7 プラグイン

Java Plug-in は、Web ブラウザの機能を拡張し、アプレットや Java Beans を、Web ブラウザ付属の Java 実行環境でなく、Java SE 実行環境 (JRE) で実行可能にします。

1.2 トラブルシューティングの一般的なヒント

次のリストは、問題のトラブルシューティングに役立つ可能性のあるアドバイスを示したものです。

  1. 症状を特定します。

    • 問題のタイプを特定します。

    • 問題の分野を見つけます。

    • 関連する構成情報を記録します。

  2. 問題以外を除去します。

    • 正しいパッチ、ドライバ、およびオペレーティングシステムがインストールされていることを確認します。

    • 以前のリリースを試します (バックトレース)。

    • テストを最小化します。一度にテストする問題の数をできるだけ制限します。

    • ハードウェアおよびソフトウェアの構成を最小化します。単一システムや複数システム上で問題を再現できるかを確認します。ブラウザのバージョンによって問題が変化するかを確認します。

    • VM が複数インストールされているかどうかに問題が依存するかを確認します。

  3. 原因を見つけます。

    • その分野での典型的な原因をチェックします。

    • フラグを使ってデフォルトを変更します。

    • トレースを使用します。

    • 例外的な場合には、システムプロパティーを使ってペイントシステムの動作を一時的に変更します。未サポートのいくつかのプロパティーについては、Java 2D テクノロジのシステムプロパティーに関するページを参照してください。

  4. 修正を見つけます。

    • 可能性のある回避方法を見つけます。

    • 設定を修正します。

    • バグを提出します。

    • ユーザーのアプリケーションを修正します。

HotSpot VM に関する Java SE 7 向けのトラブルシューティングガイドでは、Java SE アプリケーションと Java HotSpot 仮想マシン間の問題のトラブルシューティングに役立つ可能性のある情報を提供しています。この情報の多くは、Java SE デスクトップテクノロジを使用したアプリケーションの問題にも適用できます。

レポートの提出方法に関する指針や、レポートで収集すべきデータに関する提案については、第 8 章「バグレポートの提出」を参照してください。

1.3 問題の分野の特定

時間を取って、発生している問題を分類してください。そうすれば、問題の特定分野の識別、原因の発見、および最終的な解決方法や回避方法の決定が容易になります。これらの問題の中には明確でないものもありますが、すべての可能性を検討することや問題でない要素を除外することは、常に役立ちます。

1.3.1 クラッシュ

クラッシュが発生すると、致命的エラーの発生時に取得された情報や状態を含むエラーログが作成されます。エラーログファイルのデフォルト名は、hs_err_pidpid.log です。このファイルは、スタンドアロン Java アプリケーションの場合は現在のディレクトリに作成され、Java アプレットの場合はブラウザバイナリディレクトリまたはユーザークライアントフォルダに作成されます。

致命的エラーログの詳細説明については、付録 B「致命的エラーログ」を参照してください。

ヘッダーセクションの先頭付近の行には、エラーが発生したライブラリが示されます。下の例では、クラッシュが AWT ライブラリに関係していたことがわかります。

...
# Java VM: Java HotSpot(TM) Client VM (1.6.0-beta2-b76 mixed mode, sharing)
# Problematic frame:
# C  [awt.dll+0x123456]
...

クラッシュが JNI ネイティブコードで発生した場合、その原因はおそらくデスクトップライブラリです。ネイティブライブラリでのクラッシュは通常、Java 2D または AWT での問題を意味しますが、それは、Swing にはネイティブコードがあまり含まれていないからです。Swing に含まれる少量のネイティブコードのほとんどはネイティブ Look & Feel に関するものなので、アプリケーションでネイティブ Look & Feel が使用されている場合はこの分野に関するクラッシュである可能性があります。

エラーログでは通常、クラッシュが発生した具体的なライブラリが示されるため、この情報から原因を推測できます。JDK の一部でないライブラリでのクラッシュは通常、環境の問題 (不正なビデオドライバやデスクトップマネージャーなど) を示しています。

VM がクラッシュする場合は、HotSpot VM に関する Java SE 7 向けのトラブルシューティングガイドを参照してください。

1.3.2 パフォーマンスの問題

パフォーマンスの問題は、得られる情報が一般にあまり多くないため、診断が難しくなります。

まず、どのテクノロジで問題が発生しているかを判断する必要があります。たとえば、レンダリングパフォーマンスの問題はおそらく Java 2D の中にあり、応答性の問題は Swing に関連します。

次に、パフォーマンス関連の問題の例をいくつか示します。

1.3.3 動作の問題

クラッシュのほかに、動作に関係するさまざまな問題が発生する可能性があります。このセクションでは、それらの問題をいくつか取り上げ、トラブルシューティングの対象となる Java SE デスクトップテクノロジを示すことを試みます。

1.4 基本的なツール

このセクションでは、トラブルシューティングに役立つ可能性のある、いくつかのツールの一覧を単に示します。HotSpot VM に関する Java SE 7 向けのトラブルシューティングガイドには、これらのツールの大部分やその他の多くの有用なツールに関する詳細情報が含まれています。

また、さまざまな問題で dev.java.net の JDK ビルドをデバッグすることもできます。

1.5 JDWP を使用したデバッグ

JDWP (Java Debugging Wire Protocol) は、アプリケーションやアプレットのデバッグに非常に役立ちます。

アプリケーションをデバッグするには、次の手順を実行します。

  1. コマンド行ウィンドウを開きます。PATH 環境変数を jdk/bin に設定します。

  2. デバッグ対象の Java プログラム (この例では Test という名前) を次のように実行します。

    • Windows の場合:

      java -Xdebug -Xrunjdwp:transport=dt_shmem,address=debug,server=y,suspend=y Test
      
    • Solaris OS および Linux の場合:

      java -Xdebug -Xrunjdwp:transport=dt_socket,address=8888,server=y,suspend=y Test
      
  3. Test クラスがデバッグモードで開始され、デバッガからの接続を待ちます。

  4. Java レベルのデバッグを行うには、別のコマンド行ウィンドウを開き、上の実行中のデバッグサーバーにアドレス debug (Windows) または 8888 (Solaris OS または Linux) で接続するように jdb を実行します。

    jdb -attach 'debug'  or  jdb -attach 8888
    
  5. jdb の初期化と Test への接続が完了したら、ブレークポイントを設定して実行します。

    stop in Test.main run
    
  6. jdb ユーティリティーがブレークポイントに達します。

Java のデバッグとともにネイティブレベルのデバッグを実行するには、JDWP で実行中の Java プロセスにネイティブデバッガを使って接続します。

Windows では次の手順を実行します。

  1. Visual Studio を開きます。

  2. 「ビルド」 -> 「デバッグ開始」 -> 「プロセスにアタッチ」を選択します。JDWP で実行中の Java プロセスを選択します。

  3. 「プロジェクト」 -> 「設定」 -> 「追加の DLL」を選択します。デバッグするネイティブ dll (Test.dll など) を追加します。

  4. Test.dll のソースファイル (1 つ以上) を開き、ブレークポイントを設定します。

  5. jdb ウィンドウで cont と入力します。プロセスが Visual Studio のブレークポイントに達します。

ネイティブレベルのデバッグに、Solaris OS では dbx ユーティリティーを使用でき、Linux では gdb ユーティリティーを使用できます。

JDWP を使ってアプレットをデバッグするには、次の手順を実行します。

  1. Java コントロールパネルを起動します。

  2. アプレットランタイムの設定を行います。

  3. フィールド「Java ランタイムパラメータ」で次を入力します。

    • Windows の場合:

      Djavaplugin.trace=true -Xdebug -Xrunjdwp:
      transport=dt_shmem,address=debug,server=y,suspend=y
      
    • Solaris OS および Linux の場合:

      Djavaplugin.trace=true -Xdebug -Xrunjdwp:
      transport=dt_shmem,address=debug,server=y,suspend=y
      
  4. ブラウザを起動してアプレットをロードすると、Java Plug-in がデバッグモードで起動され、アドレス debug (Windows) または 8888 (Solaris OS または Linux) でデバッガからの接続を待ちます。

  5. コマンドウィンドウから jdb を実行し、アドレス debug (または 8888) に接続します。

    jdb -attach debug
    Initializing jdb ...
    VM Started: No frames on the current call stack
    main[1]
    
  6. jdb の初期化が完了したら、ブレークポイントを設定してから実行します。

    sStop in MyApplet.func1 run
    
  7. アプレットは、設定したブレークポイントに達するまでブラウザ内で実行されます。その後、アプレットのデバッグ、制御フローの確認、変数の監視などを行えます。