HP OpenVMS Systems Documentation |
| 前へ | 次へ | 目次 | 索引 |
「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」の階層の項目を示します。「Blocks」を 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」リストにセグメント・タイプを追加する。 |
「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」ボタン | 選択を取り消す。 |
ヒープ・アナライザを終了するには,ヒープ・アナライザ画面の「File」メニューで「Exit」を選択します。
12.5 サンプル・セッション
この節では,ヒープ・アナライザの各ウィンドウとメニューから得られる情報をまとめて,ユーザ・アプリケーションにある特定のメモリ・リークを見つける方法の例を示します。
この例では,すでにヒープ・アナライザを起動し,ユーザ・アプリケーションを実行してあると考えます。「Memory Map」ディスプレイをスクロールして戻しながら,ユーザ・アプリケーションが会話型コマンドを呼び出したときに表示されるセグメントに注目します。
12.5.1 会話型コマンドの表示の取り出し
メモリ・リークが生じたのは,会話型コマンド SHOW UNITS を入力したときかもしれません。そこで最初の手順として,「Memory Map」を消去し,このコマンドを再入力してみます。
「Memory Map」を消去して SHOW UNITS コマンドを再入力するには,次の手順に従います。
それぞれの SCA__MEM_GET_VM セグメントに割り当てられたメモリ空間は, SHOW UNITS コマンドごとに少しずつ増大しています ( 図 12-12 を参照 )。同一サイズのはずの割り当てが増大していることは,メモリ・リークの発生を示しています。
図 12-12 メモリ・リークを示すメモリ割り当ての増分
各セグメントに対応したセグメント・タイプには,SCA__MEM_GET_VM というラベルが付けられています。これはかなり下位レベルでのメモリ管理ルーチンであり,多数のセグメントがこのルーチンを共有しています。次の手順は,セグメント・タイプを再定義して,抽象化レベルをもっと役に立つものにすることです。できればアプリケーションのルーチン名と対応させます。
セグメント・タイプを再定義するには,次の手順に従います。
図 12-13 セグメント・タイプを再定義する「Do-Not-Use Type」メニュー項目
セグメントを表示する抽象化レベルを決定したら,次は,セグメントが割り当てられたときの呼び出しスタックの状態を調べます。セグメントごとのトレースバックを調べると,セグメントが作成された時点と理由,およびメモリに問題が生じた理由が分かります。
トレースバック情報を表示するには,次の手順に従います。
セグメントのトレースバックは,crl_begin_unit_query ルーチンが SHOW UNITS コマンド用の環境を設定していることを示しています。このイベントをさらに詳しく調べるには,イベントに対応したソース・コードを表示させます。
ソース・コードを表示するには,crl_begin_unit_query を参照するトレースバック行を MB1 でダブルクリックします。
「Source」ウィンドウにソース・コードが表示されます。 crl_begin_unit_query を呼び出しスタックに置いたルーチン呼び出しが強調表示されます ( 図 12-14 を参照 )。
図 12-14 トレースバック・エントリのクリックによる,対応したソース・コードの表示
トレースバック・エントリをアプリケーション・ソース・コードのルーチンと結び付けた後,「Source」ウィンドウを拡大して,ソース・コードの記憶位置で割り当てエラーを探すことができます。
たとえば, 図 12-15 では,強調表示されている 5725 行目が unit_query への割り当てを行っています。この割り当ては,別の割り当てが行われる 5740 行目より前で割り当て解除されていません。このコーディング・エラーがメモリ・リークの原因です。
図 12-15 二重の割り当てを示すソース・コード
| 前へ | 次へ | 目次 | 索引 |