[ 前のページ ] [ 次のページ ] [ 目次 ] [ 索引 ] [ DOC Home ]

12 ヒープ・アナライザの使用

ヒープ・アナライザはデバッガの1機能で,メモリの使用状況をリアルタイムにグラフィック表示します。 ヒープ・アナライザは,OpenVMS Alpha とOpenVMS VAXの両方のシステムで使用できます。この表示を調べることで, ユーザ・アプリケーション内のどの領域でメモリの使用状況と性能を改善できるかを確認することができます。 たとえば,頻繁に行われすぎる割り当て, 大きすぎるメモリ・ブロック,フラグメンテーションの形跡, メモリ・リークなどを見つけることができます。

問題の領域がどこか見つけた後,ビューを拡大してさらに詳しく表示したり, 変更したりすることができます。割り当てのサイズ,内容,アドレスなどの追加情報も表示することができます。

問題点を個々の割り当てにまで絞りこんだ後は,トレースバック情報を表示できます。 ヒープ・アナライザでは,割り当てのトレースバック・エントリをアプリケーション・ プログラムのソース・コードと相互に対応させることができます。 それからソース・コード・ディスプレイをスクロールして調べていけば, 問題のあるコードを特定でき,どう修正したらいいかを決定することができます。

本章では,次のことについて説明します。

12.1 ヒープ・アナライザ・セッションの開始

以下の各項では,ヒープ・アナライザを起動してユーザ・アプリケーションを実行する方法について説明します。

12.1.1 ヒープ・アナライザの起動

デバッグ・セッション中は,次のいずれかの方法でヒープ・アナライザを起動することができます。

  1. デバッガのメイン・ウィンドウの「File」メニューから「Run Image」または「Rerun Same」を選択する。ダイアログ・ボックスが表示されたら, 実行したいプログラムを選択して「Heap Analyzer」トグル・ ボタンをクリックする。

  2. デバッガのコマンド入力プロンプトから,RUN/HEAP_ANALYZER またはRERUN/HEAP_ANALYZER program-imageコマンドを入力する。

  3. デバッガの外のDECtermウィンドウでDCLプロンプト($)から次の各コマンドを実行してユーザ・ プログラムを実行する。
         $ DEFINE/USER/NAME=CONFINE LIBRTL SYS$LIBRARY:LIBRTL_INSTRUMENTED
    

保護されたイメージに対してヒープ・アナライザを使用するには,次のコマンドを入力して, プログラムを実行します。

     $ DEFINE/EXEC/NAME=CONFINE LIBRTL SYS$LIBRARY:LIBRTL_INSTRUMENTED

この処理が必要なのは,次のコマンドを使用してイメージをインストールした場合です。

     $ INSTALL ADD imagename/PROTECTED

ヒープ・アナライザは,デバッグ・セッションの外部からも起動できます。 その場合には,上記のDEFINE/USER (またはDEFINE/SYSTEM)コマンドを入力したあと,DCL のRUN/NODEBUGコマンドを入力します。


注意
OpenVMS Alphaシステムでは,/NODEBUG 修飾子を使用してリンクしたプログラムで,ヒープ・アナライザは正しく動作しません。

OpenVMS VAX システムでは,/NODEBUG修飾子を使用してリンクされたプログラムでヒープ・ アナライザは動作しますが, 表示されるトレースバック情報はわずかです。


ヒープ・アナライザが問題なく起動すると,ヒープ・アナライザ起動画面が表示されます。

12.1.2 ヒープ・アナライザのウィンドウ

ヒープ・アナライザには,メイン・ウィンドウ,6つの補助ウィンドウ, およびコントロール・パネルがあります(図 12-1 を参照)。

最も重要なウィンドウである「Memory Map」には,ユーザ・アプリケーションによるメモリの使用状況が動的に表示されます。 起動時の「Memory Map」には,アプリケーションを構成するイメージが表示されます。アプリケーションを実行すると, 個々のメモリ・ブロック,イメージ,プログラム領域, メモリ・ゾーン,および動的文字列の相対記憶位置とサイズが, メモリ空間での割り当てと割り当て解除に応じて表示されます。

「Message」ウィンドウには,ヒープ・アナライザ・セッションについての情報が表示されます。 起動時の「Message」ウィンドウには,'Heap Analyzer initializat ion complete. Press Start button to begin program'というメッセージが表示されます。ユーザ・アプリケーション実行中は, 通報メッセージやエラー・メッセージが表示されます。

「Push Button」コントロール・パネルには,「Memory Map」ディスプレイの速度を調節するボタンがあります。 デバッガを起動した後,ユーザ・ アプリケーションの実行を開始するには,「Start」ボタンをクリックします。 ユーザ・アプリケーション実行中にコントロール・パネルの他のボタンをクリックすると, 連続表示の一時停止や低速化などの操作ができます。

「Information」ウィンドウには,「Memory Map」のセグメントについての情報が表示されます。 アプリケーション実行中に,いつでも実行を一時停止して特定の情報を表示することができます。

「Source」ウィンドウには,「Memory Map」のセグメントに対応する,アプリケーションのソース・ コードが表示されます。

「Do-not-use Type」リストでは,セグメント・タイプつまりグループ名を再設定して, 「Memory Map」ディスプレイを調整することができます。

「Views-and-Types」ディスプレイでは,選択した特定のセグメント・タイプを表示して, 「Memory Map」ディスプレイを調整することができます。

「Type」ヒストグラムには,セグメント・タイプの要約と統計情報が表示されます。

ヒープ・アナライザを使用するとき,作業中のウィンドウのサイズを拡大または縮小しなければならない場合があります。 この拡大や縮小には,ウィンドウ間の枠を引っぱるか, または画面全体のサイズを変更します。

図 12-1 ヒープ・アナライザのウィンドウ

1.「Memory Map」 メモリつまり使用中のP0 空間部分をグラフィック表示する。それぞれの割り当ては色付きの帯のセグメントとして表示される。
2.「Message」ウィンドウ ヒープ・アナライザの通報メッセージとエラー・ メッセージやセグメントの説明を1行で表示する。
3.「Information」ウィンドウ 「Memory Map」に表示されるセグメントとセグメント・ タイプについての情報を表示する。
4.「Source」ウィンドウ アプリケーションのソース・ コードを表示する。
5.「Do-not-use Type」リスト セグメント・ タイプ(セグメントを特徴づける名前)として使用しないルーチンの一覧を表示する。
6.「Views- and-Types」ディスプレイ ヒープ・アナライザが認識しているセグメント・ タイプの一覧を表示する。セグメント・ディスプレイの変更も行う。
7.「Push Button」コントロール・パネル 「Start」(「Step」), 「Pause」,「Slow」,「Sync」の各ボタンがある。「Memory Map」ディスプレイの速度を調節するためにボタンを使用する。
8.「Type」ヒストグラム セグメントのサイズと使用状況についての統計情報を表示する。

12.1.3 ヒープ・アナライザのプルダウン・メニュー

ヒープ・アナライザの「Memory Map」の上には5つのプルダウン・メニューがあります( 図 12-2を参照)。メニュー項目をすべて示すために, この図は少し修正してあります。

図 12-2 ヒープ・アナライザのプルダウン・メニュー

1.「File」メニュー ヒープ・アナライザを終了する。
2.「Display」メニュー 「Memory Map」ディスプレイを調整したり, 「Information」ウィンドウを消去する。
3.「Zoom」メニュー 「Memory Map」のビューを拡大または縮小する。
4.「View」メニュー ディスプレイの粒度を選ぶ。
5.「Options」メニュー 検索ディレクトリ・リストを指定したり, 「Do-not-use Type」リストを修正する。
6.「Help」メニュー コンテキスト依存またはタスク指向のオンライン・ ヘルプを表示する。

12.1.4 ヒープ・アナライザのコンテキスト依存のメニュー

ヒープ・アナライザのほとんどの操作は,コンテキスト依存のポップアップ・ メニューから実行できます。ヒープ・アナライザのほとんどのウィンドウには, 使用可能なタスクを並べたポップアップ・メニューがあります( 図 12-3を参照)。各ウィンドウのポップアップ・ メニューにアクセスするには,そのウィンドウの中にマウス・ポインタを置いてMB3 をクリックします。

図 12-3 ヒープ・アナライザのコンテキスト依存のポップアップ・ メニュー

1.「Memory Map」ポップアップ 「Memory Map」に表示されているセグメントについての追加情報を表示する。 「Views-and-Types」ディスプレイにあるセグメント・タイプにジャンプする。 また,「Do-not-use Type」リストにセグメント・タイプを追加する。
2.「Information」ウィンドウ・ ポップアップ 「Information」ウィンドウに表示されているトレースバックの行から, 「Source」ウィンドウにある対応したソース・ コードへジャンプする。
3.「Do-not-use Type」リスト・ポップアップ 「Do-not-use Type」リストからセグメント・タイプを削除する。
4.「Views-and-Types」ディスプレイ・ ポップアップ 左側:表示されているセグメント・ タイプについての追加情報を表示する。「Views-and-Types」ディスプレイ内でセグメント・ タイプを強調表示する。また,「Do-not-use Type」リストにセグメント・タイプを追加する。

右側:「Views-and-Types」ディスプレイの左側で強調表示されたセグメント・ タイプのディスプレイ属性を調整する。

5.「Type」ヒストグラム・ポップアップ 表示されているセグメント・タイプについての追加情報を表示する。 「Type」ヒストグラム内でセグメント・タイプを強調表示する。 また,「Do-not-use Type」リストにセグメント・タイプを追加する。

12.1.5 ソース・ディレクトリの設定

アプリケーションのソース・コードを格納しているディレクトリ以外のディレクトリからヒープ・ アナライザを起動する場合は,起動画面が表示されてから, ヒープ・アナライザにソース・ディレクトリを設定することができます。

ソース・ディレクトリを設定するには,次の手順に従います。

  1. ヒープ・アナライザ画面の「Options」メニューで「Set Source...」を選択する。

    「Set Source」ダイアログ・ボックスが表示される。

  2. デバッガのSET SOURCEコマンドでの入力と同じように,ソース・ ディレクトリのディレクトリ指定を入力する。

    SET SOURCEコマンドについての詳しい説明は,『デバッガ・コマンド・ ディクショナリ』を参照。

  3. 「OK」をクリックする。

これでヒープ・アナライザがユーザ・アプリケーションにアクセスできます。

12.1.6 アプリケーションの起動

デバッグ・セッションの中からヒープ・アナライザを起動した場合は,次の手順に従ってユーザ・ アプリケーションを起動します。

  1. 「Push Button」コントロール・パネルの「Start」ボタンをクリックする。

    「Message」ウィンドウに"application starting"というメッセージが表示され, 「Start」ボタンのラベルが「Step」に変わる。OpenVMSデバッガのメイン・ ウィンドウが前面に出る。

  2. デバッガのコントロール・パネルの「Go」ボタンをクリックしてから,OpenVMS デバッガのウィンドウをアイコン化する。

    ユーザ・アプリケーションに対応したメモリ・イベントの表示が, 「Memory Map」内で開始される。

デバッグ・セッションの外でヒープ・アナライザを起動した場合は,上の手順の1 だけを実行してユーザ・アプリケーションを起動してください。

アプリケーションが実行されると,「Memory Map」(および,ヒープ・アナライザの他の部分) は連続的に更新されて,ユーザ・アプリケーションの状態を反映します。

中断しなければ(第12.1.7項を参照), この更新は, 何らかのオカレンスによってメモリ・イベントが停止されるまで続きます。 たとえば,ユーザ・アプリケーションが入力を求めるプロンプトを出す場合や, デバッガが入力を求めるプロンプトを出す場合,アプリケーションの実行が完了した場合などです。

12.1.7 表示速度の調節

アプリケーションを実行しながら「Memory Map」でイベントを調べる場合, ヒープ・アナライザのプッシュ・ボタンを使用して,表示の一時停止, 低速化などの速度調節が行えます。図 12-4 は,「Start」ボタンが押された直後のヒープ・アナライザ・ ウィンドウの様子で,これらのプッシュ・ボタンがどう表示されるかを表しています。

「Slow」と「Pause」のプッシュ・ボタンは,それぞれ表示を低速化または一時停止します。

「Step」プッシュ・ボタンは,メモリ・イベントを1ステップずつ進めます。

「Sync」ボタンの右側の「Sync」ヒストグラム(図には示されていない) は,アプリケーションからどれだけ離れてヒープ・アナライザが実行されているかを表します。 性能面での理由から,ヒープ・アナライザにメモリ・ イベントが表示されるのは,アプリケーション内でそのイベントが発生してから数秒後になります。

図 12-4 ヒープ・アナライザのコントロール・ パネル

1.「Start」ボタン クリックすると, アプリケーションの実行と「Memory Map」ディスプレイが開始する。開始すると「Start 」ボタンは「Step」ボタンに変わる。「Step」ボタンは初めは薄く表示されている( アクセスできない)。
2.「Step」ボタン クリックすると, 「Memory Map」ディスプレイ内のメモリ・イベントが1ステップずつ進むようになる。 「Pause」ボタンをクリックするまでは薄く表示されている。
3.「Pause」ボタン クリックすると,アプリケーションの実行と「Memory Map」の動的ディスプレイが一時停止する( または再開する)。
4.「Slow」ボタン クリックすると, 「Memory Map」の動的ディスプレイが低速になる。
5.「Sync」ボタン クリックすると,ユーザ・ アプリケーション・プログラムの実行と「Memory Map」内のメモリ・ イベント・ディスプレイが同期する。

同時性が重要な場合,「Sync」プッシュ・ボタンを使用して,ヒープ・アナライザの表示とアプリケーションの実行とを同期させることができます。 同期させるとアプリケーションの実行速度は低下します。

OpenVMS Alphaシステムでは,デバッガやヒープ・アナライザのようにシステム・ サービス・インタセプションを使用するものは,共有リンクによって起動されたシステム・ サービス呼び出しイメージを受け取ることができません。 そのためイメージを起動するプログラムは,イメージがリンクされているか/DEBUG を使って実行されている場合,共有リンクを避け,プライベート・ イメージのコピーを起動するようにします。ただしこの場合, ヒープ・アナライザが制御するアプリケーションの性能に影響が現れ, 共有リンクによって起動されたイメージほど高速に動作しなくなります。

12.2 省略時設定のディスプレイでの作業

以下の各項では,メモリに問題のあることが省略時設定の「Memory Map」ディスプレイを見て分かる場合に, ヒープ・アナライザをどう使用するかについて説明します。

見て分かる問題とは,割り当てが予想より大きすぎる,割り当てが頻繁に繰り返される, 割り当てが行われるごとに割り当て量が増分される,より効率的な割り当てを行えることなどです。

そのような場合,ヒープ・アナライザ・セッションを次の手順で実行します。

  1. 「Memory Map」ディスプレイを調べる。

  2. 「Memory Map」のディスプレイ特性を設定する(省略可能)。

  3. 個々のセグメントについての追加情報を求める(省略可能)。

  4. 個々のセグメントについてのトレースバック情報を求める。

  5. トレースバック・エントリをソース・コードのルーチンと相互に対応づける。

12.2.1 「Memory Map」ディスプレイ

「Memory Map」ディスプレイを調べるときは,ユーザ・アプリケーションのサイズに応じて, アプリケーション実行中に調査したい場合と実行完了後に調査したい場合とがあります。 実行中は,プッシュ・ボタンを使用して, イベントを低速化または一時停止したり,1ステップずつ進めたりできます。 実行後は,「Memory Map」ディスプレイの縦のスクロール・バーを使用してディスプレイをスクロールできます。

サイズや記憶位置が期待と異なるセグメントを特定するには,「Memory Map」内のセグメントの位置が動的メモリ内のセグメントの記憶位置に対応していることを覚えておく必要があります。 「Memory Map」ディスプレイの左上が動的メモリの最下位アドレスです。 右へいくほど上位になり, 表示は各行の右端から左端に折り返されます。

12.2.2 「Memory Map」ディスプレイのオプション

「Memory Map」を調べる場合,必要に応じてディスプレイ・オプションを選択すると, 最も関心がある部分を分かりやすく表示することができます。

「Display」メニューでは,「Memory Map」内にセグメント・タイプ名を表示するかどうか, ディスプレイを自動的にスクロールして最新の動作を表示するかどうか, ディスプレイを圧縮するかどうかを指定できます。

「Zoom」メニューでは,「Memory Map」に表示されるセグメントの拡大率を指定できます。 たとえば,「Far」メニュー項目を選択するとメモリを概観でき, 「Extremely Close」を選択するとメモリの内容が詳細に表示されます。

図 12-5に,「Display」プルダウン・ メニューのディスプレイ・ オプションを示します。この図には,「Memory Map」内で使用できるすべてのディスプレイ・ オプションを示してあります。

図 12-5 ヒープ・アナライザの「Display」メニュー

1.「Display」メニュー 「Text Visible」(省略時の設定):「Memory Map」の各セグメントにセグメント名のラベルを付ける( セグメントに名前のラベルを表示できるだけの大きさが必要である) 。

「Auto Scroll」(省略時の設定):ディスプレイを拡大するとき,最上位のメモリ・ アドレス(画面右下)に合わせて「Memory Map」を自動的にスクロールする。

「Reduce Scroll Region」:「Memory Map」ディスプレイを制限したり, 部分的に表示する場合(第12.3.3.2 項),元の表示位置をスクロールせずに,できるだけ多くのセグメントを表示できるようにディスプレイを圧縮する。

「Display All Segments」:全セグメントのセグメント定義を「Memory Map」に表示する。

「Clear Information Window」:「Information」ウィンドウのテキストとメッセージを消去する。

2.「Zoom」メニュー 「Memory Map」のビューを拡大または縮小するオプションを表示する。

12.2.3 詳細な情報についてのオプション

「Memory Map」ディスプレイを調べるとき,問題のありそうなセグメントについて, より多くの情報が必要になる場合があります。「Memory Map」ポップアップ・ メニューでは,個々のセグメントのセグメント定義,内容定義, アドレス定義,およびタイプ定義を表示することができます。

セグメント定義の書式を次に示します。

     cursor-address   n:init-address + length = end-address  name ( view )

cursor-address MB3をクリックしたときのカーソル位置のアドレス
n 一連の全セグメント中のセグメントの序数
init- address セグメントの初期アドレス
length セグメント長(バイト数)
end-address セグメントの最終アドレス
name セグメントのセグメント・ タイプ名
view セグメントのビュー(ブロック,イメージ,リージョン,またはゾーン。 各ビューについての詳しい説明は,第12.3.3.2 項を参照)

たとえば,次のセグメント定義は「Memory Map」内の15番目のセグメントを表します。 このセグメントのタイプはLIBRTLです。

             0004ECA5     15: 00040000+0001CA00=0005CA00 LIBRTL (Image)

内容定義は,部分的なセグメント定義(カーソル・アドレスのないセグメント定義) と,セグメント・アドレスの内容のASCII表現からなります。次に例を示します。

     contents of: 38: 001C7000+000000C0=001C70C0
        LIBTRL\LIB$VM\LIB$GET_VM (Block)

               [ASCII representation]

アドレス定義は,指定されたアドレスへのユーザ・アクセスを文の形式で示します。 次に例を示します。

     001C710B is read and write accessible by the user

タイプ定義は,セグメント・タイプが使用している総セグメント数と総バイト数を, 要約した文の形式で示します。次に例を示します。

     LIBRTL\LIB$VM\LIB$GET_VM (Block) has 39 segments
        using 00002160 bytes

図 12-6に,コンテキスト依存の「Memory Map」ポップアップ・メニューを示します。この図には,「Memory Map」内で使用できるマウスとポップアップ・ メニューのすべての項目を示してあります。

図 12-6 ヒープ・アナライザのコンテキスト依存の「Memory Map 」ポップアップ・メニュー

1.「Memory Map」 MB1のクリック: 「Message」ウィンドウにセグメント定義を表示する。
2.「Memory Map
ポップアップ
「Traceback of Allocation」:セグメントに対応したトレースバック情報を「Information 」ウィンドウに表示する(第12.2.4項を参照)。

「Display Segment」:セグメント定義を「Information」ウィンドウに表示する。

「Display Contents」:セグメント定義と各アドレスの内容を「Information 」ウィンドウに表示する。

「Display Address」:カーソル位置のアドレスおよびユーザ・アクセスのタイプを「Information 」ウィンドウに表示する。

「Display Type」:セグメント・タイプ定義を「Information」ウィンドウに表示する。

「Go to Type」:「Type」ヒストグラム内のセグメント・タイプから「Views-and-Types 」ディスプレイにある同一のセグメント・タイプへジャンプする。

「Do Not Use Type」:「Do-not-use Type」リストにセグメント・タイプを追加する。

12.2.4 トレースバック情報の表示

問題のセグメントを個々に特定した後,「Memory Map」ポップアップ・メニューの「Traceback of Allocation 」を選択します。トレースバック情報は, そのセグメントが作成された理由を知るのに役立ちます。トレースバックを調べることは, アプリケーション・コードを表示するための準備的な手順でもあります。

トレースバック情報は,部分的なセグメント定義(カーソル・アドレスのないセグメント定義) と,セグメント作成時に呼び出しスタック上にあった要素のリストで構成されます。 要素の命名規約は,イメージ名 \モジュール名\ルーチン名\行番号です。次に例を示します。

     traceback:     8:000BA800+00065C00=00120400 DECC$SHR (Image)
     00066EDE   DBG$HA_KERNEL
     00005864   CRL$MAIN_DB\CRL_LIBRARY\crl__initialize_libraries\%LINE 5592

12.2.5 トレースバック情報とソース・コードとの対応づけ

トレースバック・ディスプレイが現れたら,調べているセグメントに最も緊密に対応するトレースバック・ エントリを探します。ほとんどの場合, セグメント・タイプ名とトレースバックのルーチン名とを比較することで見つけられます。

見つかったトレースバック・エントリ上でMB1をダブル・クリックすると, そのエントリに対応したソース・コードが「Source」ウィンドウに( 強調)表示されます。次に,ソース・コード・ディスプレイをスクロールして, 問題のあるコードを特定し,修正方法を決定することができます。

表示されたソース・コードに問題が見当たらない場合は, 「Information」ウィンドウに戻り,前に選択したルーチンの直前または直後のルーチンをMB1 でダブル・クリックします。

トレースバック・エントリ上でMB1をダブル・クリックしたときに'Source Not Available'というメッセージが「Source」ウィンドウに表示された場合は, ヒープ・アナライザ・セッションの開始時にソース・ディレクトリの設定を忘れていた可能性があります。 検索ディレクトリの設定については, 第12.1.5項を参照してください。

図 12-7に,「Information」ウィンドウ内で強調表示されているトレースバック・ エントリをMB1でダブル・クリックしたときに表示されるソース・ コードを示します。この図には, 「Source」ウィンドウと「Information」ウィンドウ内で使用できるマウスとメニューのすべての選択項目を示してあります。

図 12-7 ヒープ・アナライザの「Information」ウィンドウと「Source 」ウィンドウ

1.「Information」ウィンドウ MB1のダブル・ クリック:「Information」ウィンドウに表示されているトレースバックの行から「Source 」ウィンドウ内の対応するソース・コードへジャンプできる。
2.「Information」ウィンドウ・
ポップアップ
「Go to Source」: 「Information」ウィンドウに表示されているトレースバックの行から「Source 」ウィンドウ内の対応するソース・コードへジャンプできる。
3.「Display」メニュー 「Clear Information Window」:「Information」ウィンドウのテキストやメッセージを消去する。

12.3 タイプ設定とタイプ・ディスプレイの変更

以下の各項では,省略時設定の「Memory Map」に表示されるメモリ・イベントが分かりにくく, 問題の有無を判断できない場合に実行する手順について説明します。

こういう状況になるのは,ヒープ・アナライザが選択するセグメント・ タイプ名が多すぎてユーザ・アプリケーションには不都合なときや, 「Memory Map」内の表示が多すぎて問題のセグメントを見分けにくいときです。

このようなときは,次の1つまたはいくつかの方法を選択できます。

タイプ設定またはタイプ・ディスプレイを変更することで問題点が明らかになったら, 省略時の「Memory Map」ディスプレイで作業する場合と同じ方法で問題を解決できます( 詳しい説明は, 第12.2節を参照してください)。

12.3.1 詳細な情報についてのオプション

「Memory Map」を調べるとき,「Memory Map」の動きを要約した「Type」ヒストグラムを同時に参照したい場合があります。2 つのヒストグラムを背中合わせにした「Type 」ヒストグラムには,「Memory Map」の各セグメント・ タイプが,総セグメント数と総バイト数の何パーセントを占めているかが表示されます。

グラフィック表現を数値に変えるには,それぞれのセグメント・タイプをMB1 でクリックします。

総セグメント数と総バイト数は両ヒストグラムの上部に表示されます。

図 12-8は,「Type」ヒストグラムに表示されたセグメント・ タイプを示しています(図のウィンドウは全タイプを表示するためにサイズを変更しています) 。この図には,「Type」ヒストグラム内で使用できるマウスとメニューのすべての選択項目を示してあります。

図 12-8 ヒープ・アナライザの「Type」ヒストグラム

1.「Type」ヒストグラム MB1のクリック: 総セグメント数と総バイト数に占める各セグメントの使用率を表示する。
2.「Type」ヒストグラム・
ポップアップ
「Display Type」:タイプ定義を「Information 」ウィンドウに表示する。

「Go to Type」:「Type」ヒストグラム内のセグメント・タイプから「Views-and-Types 」ディスプレイにある同一のセグメント・タイプへジャンプする。

「Do Not Use Type」:「Do-not-use Type」リストにセグメント・タイプを追加する。

12.3.2 タイプ設定の変更

「Memory Map」を調べると,ユーザには無意味なセグメント・タイプ名が見つかる場合があります。 このような名前を「Do-not-use Type」リストに追加することで, セグメント名の変更と,必要な場合には「Memory Map」ディスプレイの再生成をヒープ・アナライザに指示します。

省略時の設定では,セグメント・タイプ名はセグメント作成時に割り当てられます。 場合によっては要素の名前(たとえば,LIBRTL)が割り当てられることもありますが, ほとんどの場合,ヒープ・アナライザは呼び出しスタックを下方向へ検索してルーチン名を探し, そのルーチン名をセグメント・ タイプ名として使用します。

アナライザが選択するルーチン名は,呼び出しスタック内にあり,「Do- not-use Type」リストによって禁止されていない最初のルーチン名です。 先頭のルーチンが禁止されている場合は,順に次のルーチンを調べていきます。

省略時のこの動作は,「Memory Map」に次の問題を引き起こすことがあります。

セグメント・タイプ名を「Do-not-use Type」リストに追加するには,プルダウンの「Options 」メニューから「Add to Do-not-use Type List」を選択するか, または「Memory Map」,「Type」ヒストグラム,および「Views-and-Types 」ディスプレイの各ポップアップ・メニューで「Do Not Use Type」を選択します。「Do-not-use Type」リストからセグメント・ タイプを削除するには,「Do-not-use Type」リストのポップアップ・ メニューで「Use Type」を選択します。

「Do-not-use Type」リストの内容を保存するには,「Options」メニューで「Save Do-not-use Type 」リストを選択します。今後のヒープ・アナライザ・ セッション用にリストの内容が保存されます。メニュー項目の「Restore Do-not-use Type 」リストを使用すると,リストの最後の保存後の追加分が削除されます。

図 12-9に,「Add to Do-not-use Type」リスト・ダイアログ・ボックスへのLIBRTL \*\*の入力を示します。 このダイアログ・ボックスは「Options」メニューから選択できます。 この図には,「Do-not-use Type」リスト内で使用できるマウスとメニューのすべての選択項目を示してあります。

図 12-9 ヒープ・アナライザの「Do-not-use Type」リスト

1.「Do-not-use Type」リスト・
ポップアップ
「Use Type」:「Do-not-use Type」リストからセグメント・タイプを削除する。
2.「Options」メニュー 「Add to Do- not-use Type List」:「Do-not-use Type」リストにセグメント・タイプを追加する。

「Save Do-not-use Type List」:「Do-not-use Type」リストに表示されているセグメント・ タイプを保存する。次のヒープ・アナライザ・セッションで使用できる。

「Restore Do-not-use Type List」:「Do-not-use Type」リストを最後に保存してからの追加分を削除する。

3.「Memory Map」ポップアップ
「Type 」ヒストグラムポップアップ
「Views-and-Types」ディスプレイ・
ポップアップ
「Do Not Use Type」:「Do-not-use Type」リストにセグメント・タイプを追加する。

12.3.3 「Views-and-Types」ディスプレイの変更

「Memory Map」を調べるとき,重要な領域がはっきりするようにタイプ・ ディスプレイを変更しなければならない場合があります。「Views-and- Types」ディスプレイでは,同じタイプの複数または個々のセグメントに対して変更を指定できます。

「Views-and-Types」ディスプレイは実際は2つのウィンドウからなり,枠で区切られています。 左のウィンドウは拡大して,ユーザ・アプリケーション内の既知のタイプをすべて表示できます。 右のウィンドウにはディスプレイ・ オプション(色,表示状態,拡大状態,保存状態)が表示されます。

12.3.3.1 変更の有効範囲の選択

ヒープ・アナライザはOpenVMSの4つのメモリ・マネージャからセグメントについての情報を受け取ります。 これらのメモリ・マネージャは,メモリ空間の割り当てと割り当て解除を実行します。 各メモリ・マネージャが持つ動的メモリのビュー( 全体像)は少しずつ異なっています。

メモリ・マネージャが認識するセグメント・タイプのセットは,マネージャごとに異なります。 これは,各メモリ・マネージャからのビューが互いに重なっている部分では, ヒープ・アナライザ内で,単一のメモリ記憶位置が1 つまたは複数のセグメント・タイプと対応する場合があることを意味します。

「Views-and-Types」ディスプレイの左のウィンドウには,この重なりを反映した階層が表示されます。

各メモリ・マネージャが認識している個々のセグメント・タイプを表示するには, 「Blocks」,「Images」,「Regions」,「Zones」の各キーワードをMB1 でダブル・クリックして,省略時設定の表示を拡大します。それぞれの表示を元に戻すには, 前に選択したキーワードをMB3でクリックします。

この階層で次の有効範囲を選択できます。

図 12-10に,「Blocks」の階層の項目を示します。 「B locks」をMB1でクリックして全ブロックを選択すると, 「Blocks」が強調表示されます。この図には,「Views-and-Types」ディスプレイの階層側で使用できるマウスとメニューのすべての選択項目も示してあります。

図 12-10 ヒープ・アナライザの「Views-and- Types」の階層

1. MB1のダブル・クリック 「Views- and-Types」の階層を拡大(または縮小)する。
2.「Views-and-Types」
階層のポップアップ
「Display Type」:タイプ定義を「Information」ウィンドウに表示する。

「Go to Type」:「Views-and-Types」ディスプレイ内で選択したタイプを強調表示する。

「Do Not Use Type」:「Do-not-use Type」リストにセグメント・タイプを追加する。

12.3.3.2 ディスプレイ・オプションの選択

「Views-and-Types」ディスプレイの右ウィンドウには,使用可能な次のディスプレイ・ オプションがあります。

選択を取り消すには,「Reset」ボタンをクリックするか,または「Show 」,「Expand」,「Save」の各ポップアップ・メニューで「Reset 」を選択します。

図 12-11に,「Show」ポップアップ・ メニューを示します。このメニューは,「Views-and-Types」ディスプレイのオプション側でMB3 をクリックすると表示されます。すでに強調表示されている「Blocks 」が変更の有効範囲です。この図には,「Views-and- Types」ディスプレイのオプション側で使用できるマウスとメニューのすべての選択項目も示してあります。

図 12-11 ヒープ・アナライザの「Views-and- Types」ディスプレイのオプション

1. MB1のクリック 「Show」, 「Expand」,「Save」の各トグル・ボタンを切り替える。
2.「Color」ポップアップ 個々のまたはグループ化したタイプの表示色を調節する。
3.「Show」ポップアップ 選択したセグメント・タイプの表示を制御する。 「Show」と「Hide」の各メニュー項目で表示を復元または抑制できる。 選択は「Reset」で取り消される。
4.「Expand」ポップアップ 選択したセグメント・タイプ内のセグメントの表示を制御する。 「Expand」と「Collapse」の各メニュー項目で表示を復元または抑制できる。 選択は「Reset」で取り消される。
5.「Save」ポップアップ 選択したセグメント・タイプについての情報を表示または格納するヒープ・ アナライザの機能を制御する。 「Remove」メニュー項目は情報を全て削除する。「Save」は表示機能を元に戻し, 情報を保存する。選択は「Reset」で取り消される。
6.「Apply」ボタン 選択した内容を「Memory Map 」ディスプレイに適用する。
7.「Reset」ボタン 選択を取り消す。

12.4 ヒープ・アナライザの終了

ヒープ・アナライザを終了するには,ヒープ・アナライザ画面の「File」メニューで「Exit 」を選択します。

12.5 サンプル・セッション

この節では,ヒープ・アナライザの各ウィンドウとメニューから得られる情報をまとめて, ユーザ・アプリケーションにある特定のメモリ・リークを見つける方法の例を示します。

この例では,すでにヒープ・アナライザを起動し,ユーザ・アプリケーションを実行してあると考えます。 「Memory Map」ディスプレイをスクロールして戻しながら, ユーザ・アプリケーションが会話型コマンドを呼び出したときに表示されるセグメントに注目します。

12.5.1 会話型コマンドの表示の取り出し

メモリ・リークが生じたのは,会話型コマンドSHOW UNITSを入力したときかもしれません。 そこで最初の手順として,「Memory Map」を消去し,このコマンドを再入力してみます。

「Memory Map」を消去してSHOW UNITSコマンドを再入力するには,次の手順に従います。

  1. 「Views-and-Types」ディスプレイの「Views」項目の「Remove 」オプションをクリックしてから,「Apply」ボタンをクリックする。

    「Memory Map」内の以前の出力がすべて消去される。

  2. 「Views」項目の「Save」オプションをクリックしてから, 「Apply」ボタンをクリックする。

    以後の「Memory Map」への出力が,すべて保存される。

  3. 別のDECtermウィンドウ内で,ユーザ・アプリケーションのプロンプトにSHOW UNITS コマンドをいくつか入力する。

    小さく表示された一連のセグメントは増分されているらしいが,表示が小さすぎて確認できない。

  4. 「Zoom」メニューの「Extremely Close」を選択する。

    セグメントのビューが拡大表示される。

それぞれのSCA__MEM_GET_VMセグメントに割り当てられたメモリ空間は, SHOW UNITSコマンドごとに少しずつ増大しています(図 12-12 を参照)。同一サイズのはずの割り当てが増大していることは, メモリ・リークの発生を示しています。

図 12-12 メモリ・リークを示すメモリ割り当ての増分

12.5.2 タイプ設定の変更

各セグメントに対応したセグメント・タイプには,SCA__MEM_GET_VM というラベルが付けられています。 これはかなり下位レベルでのメモリ管理ルーチンであり, 多数のセグメントがこのルーチンを共有しています。次の手順は, セグメント・タイプを再定義して,抽象化レベルをもっと役に立つものにすることです。 できればアプリケーションのルーチン名と対応させます。

セグメント・タイプを再定義するには,次の手順に従います。

図 12-13 セグメント・タイプを再定義する「Do Not Use Type」メニュー項目

12.5.3 トレースバック情報の表示

セグメントを表示する抽象化レベルを決定したら,次は,セグメントが割り当てられたときの呼び出しスタックの状態を調べます。 セグメントごとのトレースバックを調べると, セグメントが作成された時点と理由,およびメモリに問題が生じた理由が分かります。

トレースバック情報を表示するには,次の手順に従います。

  1. セグメントにマウス・ポインタを置いてから,MB3をクリックする。

    コンテキスト依存の「Memory Map」ポップアップ・メニューが表示される。

  2. ポップアップ・メニューで「Traceback of Allocation」を選択する。

    セグメントのトレースバック情報が「Information」ウィンドウに表示される。

12.5.4 トレースバックとソース・コードとの相互対応

セグメントのトレースバックは,crl_begin_unit_queryルーチンがSHOW UNITSコマンド用の環境を設定していることを示しています。このイベントをさらに詳しく調べるには, イベントに対応したソース・コードを表示させます。

ソース・コードを表示するには,crl_begin_unit_queryを参照するトレースバック行をMB1 でダブルクリックします。

「Source」ウィンドウにソース・コードが表示されます。crl_begin_ unit_queryを呼び出しスタックに置いたルーチン呼び出しが強調表示されます( 図 12-14を参照)。

図 12-14 トレースバック・エントリのクリックによる, 対応したソース・コードの表示

12.5.5 ソース・コードにある割り当てエラーの発見

トレースバック・エントリをアプリケーション・ソース・コードのルーチンと結び付けた後, 「Source」ウィンドウを拡大して,ソース・コードの記憶位置で割り当てエラーを探すことができます。

たとえば,図 12-15では,強調表示されている5725 行目がunit_queryへの割り当てを行っています。この割り当ては, 別の割り当てが行われる5740行目より前で割り当て解除されていません。 このコーディング・エラーがメモリ・リークの原因です。

図 12-15 二重の割り当てを示すソース・コード


[ 前のページ ] [ 次のページ ] [ 目次 ] [ 索引 ] [ DOC Home ]