[ 前のページ ]
[ 次のページ ]
[ 目次 ]
[ 索引 ]
[ DOC Home ]
ヒープ・アナライザはデバッガの1機能で,メモリの使用状況をリアルタイムにグラフィック表示します。 ヒープ・アナライザは,OpenVMS Alpha とOpenVMS VAXの両方のシステムで使用できます。この表示を調べることで, ユーザ・アプリケーション内のどの領域でメモリの使用状況と性能を改善できるかを確認することができます。 たとえば,頻繁に行われすぎる割り当て, 大きすぎるメモリ・ブロック,フラグメンテーションの形跡, メモリ・リークなどを見つけることができます。
問題の領域がどこか見つけた後,ビューを拡大してさらに詳しく表示したり, 変更したりすることができます。割り当てのサイズ,内容,アドレスなどの追加情報も表示することができます。
問題点を個々の割り当てにまで絞りこんだ後は,トレースバック情報を表示できます。 ヒープ・アナライザでは,割り当てのトレースバック・エントリをアプリケーション・ プログラムのソース・コードと相互に対応させることができます。 それからソース・コード・ディスプレイをスクロールして調べていけば, 問題のあるコードを特定でき,どう修正したらいいかを決定することができます。
本章では,次のことについて説明します。
以下の各項では,ヒープ・アナライザを起動してユーザ・アプリケーションを実行する方法について説明します。
デバッグ・セッション中は,次のいずれかの方法でヒープ・アナライザを起動することができます。
$ 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 VAX システムでは,/NODEBUG修飾子を使用してリンクされたプログラムでヒープ・ アナライザは動作しますが, 表示されるトレースバック情報はわずかです。
ヒープ・アナライザが問題なく起動すると,ヒープ・アナライザ起動画面が表示されます。
ヒープ・アナライザには,メイン・ウィンドウ,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」ヒストグラムには,セグメント・タイプの要約と統計情報が表示されます。
ヒープ・アナライザを使用するとき,作業中のウィンドウのサイズを拡大または縮小しなければならない場合があります。 この拡大や縮小には,ウィンドウ間の枠を引っぱるか, または画面全体のサイズを変更します。
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」ヒストグラム | セグメントのサイズと使用状況についての統計情報を表示する。 |
ヒープ・アナライザの「Memory Map」の上には5つのプルダウン・メニューがあります( 図 12-2を参照)。メニュー項目をすべて示すために, この図は少し修正してあります。
1.「File」メニュー | ヒープ・アナライザを終了する。 |
2.「Display」メニュー | 「Memory Map」ディスプレイを調整したり, 「Information」ウィンドウを消去する。 |
3.「Zoom」メニュー | 「Memory Map」のビューを拡大または縮小する。 |
4.「View」メニュー | ディスプレイの粒度を選ぶ。 |
5.「Options」メニュー | 検索ディレクトリ・リストを指定したり, 「Do-not-use Type」リストを修正する。 |
6.「Help」メニュー | コンテキスト依存またはタスク指向のオンライン・ ヘルプを表示する。 |
ヒープ・アナライザのほとんどの操作は,コンテキスト依存のポップアップ・ メニューから実行できます。ヒープ・アナライザのほとんどのウィンドウには, 使用可能なタスクを並べたポップアップ・メニューがあります( 図 12-3を参照)。各ウィンドウのポップアップ・ メニューにアクセスするには,そのウィンドウの中にマウス・ポインタを置いてMB3 をクリックします。
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」リストにセグメント・タイプを追加する。 |
アプリケーションのソース・コードを格納しているディレクトリ以外のディレクトリからヒープ・ アナライザを起動する場合は,起動画面が表示されてから, ヒープ・アナライザにソース・ディレクトリを設定することができます。
ソース・ディレクトリを設定するには,次の手順に従います。
「Set Source」ダイアログ・ボックスが表示される。
SET SOURCEコマンドについての詳しい説明は,『デバッガ・コマンド・ ディクショナリ』を参照。
これでヒープ・アナライザがユーザ・アプリケーションにアクセスできます。
デバッグ・セッションの中からヒープ・アナライザを起動した場合は,次の手順に従ってユーザ・ アプリケーションを起動します。
「Message」ウィンドウに"application starting"というメッセージが表示され, 「Start」ボタンのラベルが「Step」に変わる。OpenVMSデバッガのメイン・ ウィンドウが前面に出る。
ユーザ・アプリケーションに対応したメモリ・イベントの表示が, 「Memory Map」内で開始される。
デバッグ・セッションの外でヒープ・アナライザを起動した場合は,上の手順の1 だけを実行してユーザ・アプリケーションを起動してください。
アプリケーションが実行されると,「Memory Map」(および,ヒープ・アナライザの他の部分) は連続的に更新されて,ユーザ・アプリケーションの状態を反映します。
中断しなければ(第12.1.7項を参照), この更新は, 何らかのオカレンスによってメモリ・イベントが停止されるまで続きます。 たとえば,ユーザ・アプリケーションが入力を求めるプロンプトを出す場合や, デバッガが入力を求めるプロンプトを出す場合,アプリケーションの実行が完了した場合などです。
アプリケーションを実行しながら「Memory Map」でイベントを調べる場合, ヒープ・アナライザのプッシュ・ボタンを使用して,表示の一時停止, 低速化などの速度調節が行えます。図 12-4 は,「Start」ボタンが押された直後のヒープ・アナライザ・ ウィンドウの様子で,これらのプッシュ・ボタンがどう表示されるかを表しています。
「Slow」と「Pause」のプッシュ・ボタンは,それぞれ表示を低速化または一時停止します。
「Step」プッシュ・ボタンは,メモリ・イベントを1ステップずつ進めます。
「Sync」ボタンの右側の「Sync」ヒストグラム(図には示されていない) は,アプリケーションからどれだけ離れてヒープ・アナライザが実行されているかを表します。 性能面での理由から,ヒープ・アナライザにメモリ・ イベントが表示されるのは,アプリケーション内でそのイベントが発生してから数秒後になります。
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 を使って実行されている場合,共有リンクを避け,プライベート・ イメージのコピーを起動するようにします。ただしこの場合, ヒープ・アナライザが制御するアプリケーションの性能に影響が現れ, 共有リンクによって起動されたイメージほど高速に動作しなくなります。
以下の各項では,メモリに問題のあることが省略時設定の「Memory Map」ディスプレイを見て分かる場合に, ヒープ・アナライザをどう使用するかについて説明します。
見て分かる問題とは,割り当てが予想より大きすぎる,割り当てが頻繁に繰り返される, 割り当てが行われるごとに割り当て量が増分される,より効率的な割り当てを行えることなどです。
そのような場合,ヒープ・アナライザ・セッションを次の手順で実行します。
「Memory Map」ディスプレイを調べるときは,ユーザ・アプリケーションのサイズに応じて, アプリケーション実行中に調査したい場合と実行完了後に調査したい場合とがあります。 実行中は,プッシュ・ボタンを使用して, イベントを低速化または一時停止したり,1ステップずつ進めたりできます。 実行後は,「Memory Map」ディスプレイの縦のスクロール・バーを使用してディスプレイをスクロールできます。
サイズや記憶位置が期待と異なるセグメントを特定するには,「Memory Map」内のセグメントの位置が動的メモリ内のセグメントの記憶位置に対応していることを覚えておく必要があります。 「Memory Map」ディスプレイの左上が動的メモリの最下位アドレスです。 右へいくほど上位になり, 表示は各行の右端から左端に折り返されます。
「Memory Map」を調べる場合,必要に応じてディスプレイ・オプションを選択すると, 最も関心がある部分を分かりやすく表示することができます。
「Display」メニューでは,「Memory Map」内にセグメント・タイプ名を表示するかどうか, ディスプレイを自動的にスクロールして最新の動作を表示するかどうか, ディスプレイを圧縮するかどうかを指定できます。
「Zoom」メニューでは,「Memory Map」に表示されるセグメントの拡大率を指定できます。 たとえば,「Far」メニュー項目を選択するとメモリを概観でき, 「Extremely Close」を選択するとメモリの内容が詳細に表示されます。
図 12-5に,「Display」プルダウン・ メニューのディスプレイ・ オプションを示します。この図には,「Memory Map」内で使用できるすべてのディスプレイ・ オプションを示してあります。
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」のビューを拡大または縮小するオプションを表示する。 |
「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」内で使用できるマウスとポップアップ・ メニューのすべての項目を示してあります。
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」リストにセグメント・タイプを追加する。 |
問題のセグメントを個々に特定した後,「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
トレースバック・ディスプレイが現れたら,調べているセグメントに最も緊密に対応するトレースバック・ エントリを探します。ほとんどの場合, セグメント・タイプ名とトレースバックのルーチン名とを比較することで見つけられます。
見つかったトレースバック・エントリ上でMB1をダブル・クリックすると, そのエントリに対応したソース・コードが「Source」ウィンドウに( 強調)表示されます。次に,ソース・コード・ディスプレイをスクロールして, 問題のあるコードを特定し,修正方法を決定することができます。
表示されたソース・コードに問題が見当たらない場合は, 「Information」ウィンドウに戻り,前に選択したルーチンの直前または直後のルーチンをMB1 でダブル・クリックします。
トレースバック・エントリ上でMB1をダブル・クリックしたときに'Source Not Available'というメッセージが「Source」ウィンドウに表示された場合は, ヒープ・アナライザ・セッションの開始時にソース・ディレクトリの設定を忘れていた可能性があります。 検索ディレクトリの設定については, 第12.1.5項を参照してください。
図 12-7に,「Information」ウィンドウ内で強調表示されているトレースバック・ エントリをMB1でダブル・クリックしたときに表示されるソース・ コードを示します。この図には, 「Source」ウィンドウと「Information」ウィンドウ内で使用できるマウスとメニューのすべての選択項目を示してあります。
1.「Information」ウィンドウ | MB1のダブル・ クリック:「Information」ウィンドウに表示されているトレースバックの行から「Source 」ウィンドウ内の対応するソース・コードへジャンプできる。 |
2.「Information」ウィンドウ・ ポップアップ | 「Go to Source」: 「Information」ウィンドウに表示されているトレースバックの行から「Source 」ウィンドウ内の対応するソース・コードへジャンプできる。 |
3.「Display」メニュー | 「Clear Information Window」:「Information」ウィンドウのテキストやメッセージを消去する。 |
以下の各項では,省略時設定の「Memory Map」に表示されるメモリ・イベントが分かりにくく, 問題の有無を判断できない場合に実行する手順について説明します。
こういう状況になるのは,ヒープ・アナライザが選択するセグメント・ タイプ名が多すぎてユーザ・アプリケーションには不都合なときや, 「Memory Map」内の表示が多すぎて問題のセグメントを見分けにくいときです。
このようなときは,次の1つまたはいくつかの方法を選択できます。
タイプ設定またはタイプ・ディスプレイを変更することで問題点が明らかになったら, 省略時の「Memory Map」ディスプレイで作業する場合と同じ方法で問題を解決できます( 詳しい説明は, 第12.2節を参照してください)。
「Memory Map」を調べるとき,「Memory Map」の動きを要約した「Type」ヒストグラムを同時に参照したい場合があります。2 つのヒストグラムを背中合わせにした「Type 」ヒストグラムには,「Memory Map」の各セグメント・ タイプが,総セグメント数と総バイト数の何パーセントを占めているかが表示されます。
グラフィック表現を数値に変えるには,それぞれのセグメント・タイプをMB1 でクリックします。
総セグメント数と総バイト数は両ヒストグラムの上部に表示されます。
図 12-8は,「Type」ヒストグラムに表示されたセグメント・ タイプを示しています(図のウィンドウは全タイプを表示するためにサイズを変更しています) 。この図には,「Type」ヒストグラム内で使用できるマウスとメニューのすべての選択項目を示してあります。
1.「Type」ヒストグラム | MB1のクリック: 総セグメント数と総バイト数に占める各セグメントの使用率を表示する。 |
2.「Type」ヒストグラム・ ポップアップ | 「Display Type」:タイプ定義を「Information
」ウィンドウに表示する。
「Go to Type」:「Type」ヒストグラム内のセグメント・タイプから「Views-and-Types 」ディスプレイにある同一のセグメント・タイプへジャンプする。 「Do Not Use Type」:「Do-not-use Type」リストにセグメント・タイプを追加する。 |
「Memory Map」を調べると,ユーザには無意味なセグメント・タイプ名が見つかる場合があります。 このような名前を「Do-not-use Type」リストに追加することで, セグメント名の変更と,必要な場合には「Memory Map」ディスプレイの再生成をヒープ・アナライザに指示します。
省略時の設定では,セグメント・タイプ名はセグメント作成時に割り当てられます。 場合によっては要素の名前(たとえば,LIBRTL)が割り当てられることもありますが, ほとんどの場合,ヒープ・アナライザは呼び出しスタックを下方向へ検索してルーチン名を探し, そのルーチン名をセグメント・ タイプ名として使用します。
アナライザが選択するルーチン名は,呼び出しスタック内にあり,「Do- not-use Type」リストによって禁止されていない最初のルーチン名です。 先頭のルーチンが禁止されている場合は,順に次のルーチンを調べていきます。
省略時のこの動作は,「Memory Map」に次の問題を引き起こすことがあります。
呼び出しスタックの最初のルーチンが,下位レベルのメモリ管理ルーチンまたはユーティリティ・ ルーチンである場合に起きる。ユーザ・ アプリケーションの割り当てイベントの大部分はこれらのルーチンを使用するので, 関連のない割り当てが同じタイプ名で1つにグループ化されて表示される。
この問題を防ぐには,ユーザ・アプリケーションを実行する前に,アプリケーション固有のメモリ管理ルーチンまたはユーティリティ・ ルーチンの名前を「Do-not-use Type 」リストに追加しておく。
呼び出しスタックの最初のルーチンが,ユーザの調べているレベルほどのアプリケーション・ バウンドでない場合に起きる可能性がある。 アプリケーションの各関数を反映したタイプ名を見ることが必要な場合は, 中間のメモリ管理ルーチンに由来するタイプ名が表示されるとかえって不便になる。
呼び出しスタックの最初のルーチンがユーザ・アプリケーションの一部分を対象にしていて, ユーザがその部分に関心がない場合も, この問題が起きる可能性がある。サブシステムの関数(たとえば, initialize_death_star)を反映したタイプ名を見ることが必要な場合, サブシステムの全関数(たとえば,initialize_star)が1つのタイプ名で表示されては不便になる。
この問題を修正するには,「Memory Map」に反映される抽象化レベルがユーザの希望と一致するまで, 現在のタイプ名を「Do-not-use Type」リストに追加していく。
セグメント・タイプ名を「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」リスト内で使用できるマウスとメニューのすべての選択項目を示してあります。
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」リストにセグメント・タイプを追加する。 |
「Memory Map」を調べるとき,重要な領域がはっきりするようにタイプ・ ディスプレイを変更しなければならない場合があります。「Views-and- Types」ディスプレイでは,同じタイプの複数または個々のセグメントに対して変更を指定できます。
「Views-and-Types」ディスプレイは実際は2つのウィンドウからなり,枠で区切られています。 左のウィンドウは拡大して,ユーザ・アプリケーション内の既知のタイプをすべて表示できます。 右のウィンドウにはディスプレイ・ オプション(色,表示状態,拡大状態,保存状態)が表示されます。
ヒープ・アナライザはOpenVMSの4つのメモリ・マネージャからセグメントについての情報を受け取ります。 これらのメモリ・マネージャは,メモリ空間の割り当てと割り当て解除を実行します。 各メモリ・マネージャが持つ動的メモリのビュー( 全体像)は少しずつ異なっています。
メモリ・マネージャが認識するセグメント・タイプのセットは,マネージャごとに異なります。 これは,各メモリ・マネージャからのビューが互いに重なっている部分では, ヒープ・アナライザ内で,単一のメモリ記憶位置が1 つまたは複数のセグメント・タイプと対応する場合があることを意味します。
「Views-and-Types」ディスプレイの左のウィンドウには,この重なりを反映した階層が表示されます。
各メモリ・マネージャが認識している個々のセグメント・タイプを表示するには, 「Blocks」,「Images」,「Regions」,「Zones」の各キーワードをMB1 でダブル・クリックして,省略時設定の表示を拡大します。それぞれの表示を元に戻すには, 前に選択したキーワードをMB3でクリックします。
この階層で次の有効範囲を選択できます。
図 12-10に,「Blocks」の階層の項目を示します。 「B locks」をMB1でクリックして全ブロックを選択すると, 「Blocks」が強調表示されます。この図には,「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」リストにセグメント・タイプを追加する。 |
「Views-and-Types」ディスプレイの右ウィンドウには,使用可能な次のディスプレイ・ オプションがあります。
全セグメント・タイプ,特定のビューだけの全セグメント・タイプ, または個々のセグメント・タイプの色を変更するには,「Views-and- Types」ディスプレイの色のボタンをMB3でクリックする。縦の色の帯が表示されたら, 選択する色をMB1でクリックする。その後「Apply」ボタンをクリックして, 変更を実際に適用する。
全セグメント・タイプ,特定のビューだけの全セグメント・タイプ, または個々のセグメント・タイプのディスプレイを抑制(または復元) するには,「Show」ボタンを選択して設定を「Hide」または「Show」に切り替えてからMB1 をクリックする(または,「Show」ポップアップ・ メニューで適切なメニュー項目を選択する方法もある)。その後「Apply 」ボタンをクリックして,変更を実際に適用する。
調べないセグメントの「Memory Map」を消去する場合に,このオプションを使用する。 このオプションを使用して,他のタイプの全セグメントを表示しないようにすれば, 特定のタイプのセグメントをすべて見つけることもできる。
全セグメント・タイプ,特定のビューだけの全セグメント・タイプ, または個々のセグメント・タイプのディスプレイを縮小(または拡大) するには,「Expand」ボタンを選択して設定を「Collapse」または「Expand 」に切り替えてからMB1をクリックする(または,「Expand」ポップアップ・ メニューで適切なメニュー項目を選択する方法もある) 。その後「Apply」ボタンをクリックして,変更を実際に適用する。
ネストしたセグメントは調べないので,そのようなセグメントの「Memory Map 」を消去する場合に,このオプションを使用する。ユーザ・ アプリケーションによっては,ヒープ・アナライザの性能も向上することがある。
全セグメント・タイプ,特定のビューだけの全セグメント・タイプ, または個々のセグメント・タイプについての情報を削除(または保存) するには,「Save」ボタンを選択して設定を「Remove」または「Save 」に切り替えてからMB1をクリックする(または,「Expand」ポップアップ・ メニューで適切なメニュー項目を選択する方法もある)。 その後「Apply」ボタンをクリックして,変更を実際に適用する。
「Memory Map」を完全に消去してからもう一度表示する場合に, このオプションを使用する。会話型のコマンドを調べる場合にこのオプションがいかに有効であるかの説明については, 第12.5節を参照。
選択を取り消すには,「Reset」ボタンをクリックするか,または「Show 」,「Expand」,「Save」の各ポップアップ・メニューで「Reset 」を選択します。
図 12-11に,「Show」ポップアップ・ メニューを示します。このメニューは,「Views-and-Types」ディスプレイのオプション側でMB3 をクリックすると表示されます。すでに強調表示されている「Blocks 」が変更の有効範囲です。この図には,「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」ボタン | 選択を取り消す。 |
ヒープ・アナライザを終了するには,ヒープ・アナライザ画面の「File」メニューで「Exit 」を選択します。
この節では,ヒープ・アナライザの各ウィンドウとメニューから得られる情報をまとめて, ユーザ・アプリケーションにある特定のメモリ・リークを見つける方法の例を示します。
この例では,すでにヒープ・アナライザを起動し,ユーザ・アプリケーションを実行してあると考えます。 「Memory Map」ディスプレイをスクロールして戻しながら, ユーザ・アプリケーションが会話型コマンドを呼び出したときに表示されるセグメントに注目します。
メモリ・リークが生じたのは,会話型コマンドSHOW UNITSを入力したときかもしれません。 そこで最初の手順として,「Memory Map」を消去し,このコマンドを再入力してみます。
「Memory Map」を消去してSHOW UNITSコマンドを再入力するには,次の手順に従います。
「Memory Map」内の以前の出力がすべて消去される。
以後の「Memory Map」への出力が,すべて保存される。
小さく表示された一連のセグメントは増分されているらしいが,表示が小さすぎて確認できない。
セグメントのビューが拡大表示される。
それぞれのSCA__MEM_GET_VMセグメントに割り当てられたメモリ空間は, SHOW UNITSコマンドごとに少しずつ増大しています(図 12-12 を参照)。同一サイズのはずの割り当てが増大していることは, メモリ・リークの発生を示しています。
各セグメントに対応したセグメント・タイプには,SCA__MEM_GET_VM というラベルが付けられています。 これはかなり下位レベルでのメモリ管理ルーチンであり, 多数のセグメントがこのルーチンを共有しています。次の手順は, セグメント・タイプを再定義して,抽象化レベルをもっと役に立つものにすることです。 できればアプリケーションのルーチン名と対応させます。
セグメント・タイプを再定義するには,次の手順に従います。
コンテキスト依存の「Memory Map」ポップアップ・メニューが表示される。
セグメントに対応したセグメント・タイプが,SCA__MEM_GET_ VM から,有用な"crl_begin_unit_query"に変更される(図 12-13 を参照)。
セグメントを表示する抽象化レベルを決定したら,次は,セグメントが割り当てられたときの呼び出しスタックの状態を調べます。 セグメントごとのトレースバックを調べると, セグメントが作成された時点と理由,およびメモリに問題が生じた理由が分かります。
トレースバック情報を表示するには,次の手順に従います。
コンテキスト依存の「Memory Map」ポップアップ・メニューが表示される。
セグメントのトレースバック情報が「Information」ウィンドウに表示される。
セグメントのトレースバックは,crl_begin_unit_queryルーチンがSHOW UNITSコマンド用の環境を設定していることを示しています。このイベントをさらに詳しく調べるには, イベントに対応したソース・コードを表示させます。
ソース・コードを表示するには,crl_begin_unit_queryを参照するトレースバック行をMB1 でダブルクリックします。
「Source」ウィンドウにソース・コードが表示されます。crl_begin_ unit_queryを呼び出しスタックに置いたルーチン呼び出しが強調表示されます( 図 12-14を参照)。
トレースバック・エントリをアプリケーション・ソース・コードのルーチンと結び付けた後, 「Source」ウィンドウを拡大して,ソース・コードの記憶位置で割り当てエラーを探すことができます。
たとえば,図 12-15では,強調表示されている5725 行目がunit_queryへの割り当てを行っています。この割り当ては, 別の割り当てが行われる5740行目より前で割り当て解除されていません。 このコーディング・エラーがメモリ・リークの原因です。
[ 前のページ ]
[ 次のページ ]
[ 目次 ]
[ 索引 ]
[ DOC Home ]