日本-日本語
日本HPホーム 製品 & サービス OpenVMS製品情報
≫  お問い合わせ


OpenVMS マニュアル


 

OpenVMS ドキュメント
ライブラリ

タイトルページ
目次
まえがき
第 1 部:デバッガ概要
第 1 章:デバッガ概要
第 2 部:コマンド・インタフェース
第 2 章:デバッガの起動
第 3 章:プログラム実行の制御とモニタ
第 4 章:プログラム・データの検査と操作
第 5 章:プログラム内シンボルへのアクセス制御
第 6 章:ソース・コードの表示の制御
第 7 章:画面モード
第 3 部:DECwindows インタフェース
第 8 章:DECwindows Motifインタフェースの概要
第 9 章:デバッグ・セッションの開始と終了
第 10 章:デバッガの使用方法
第 4 部:PC クライアント・インタフェース
第 11 章:デバッガの PC クライアント/サーバ・インタフェースの概要
第 5 部:高度なトピック
第 12 章:ヒープ・アナライザの使用
第 13 章:その他の便利な機能
第 14 章:特殊なデバッグ
第 15 章:マルチプロセス・プログラムのデバッグ
第 16 章:タスキング・プログラムのデバッグ
第 6 部:付録
付録 A :定義済みのキー機能
付録 B :組み込みシンボルと論理名
付録 C :各言語に対するデバッガ・サポートの要約
付録 D :EIGHTQUEENS.C
索引
PDF
OpenVMS ホーム

HP OpenVMS
デバッガ説明書


目次 索引



以下の各項では,メモリに問題のあることが省略時設定の「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 つまたはいくつかの方法を選択できます。

  • 「Type」ヒストグラムでタイプの要約を調べる ( 総セグメント数と総バイト数に占める各セグメント・タイプの使用率を示した要約を調べる)。

  • 「Memory Map」内のタイプ設定を変更する ( 意味のあるタイプ名を選択することを指定する)。

  • 「Memory Map」内のタイプ・ディスプレイを変更する ( 特定のタイプ・ディスプレイを抑制し,他のタイプを強調表示することを指定する )。

タイプ設定またはタイプ・ディスプレイを変更することで問題点が明らかになったら,省略時の「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」に次の問題を引き起こすことがあります。

  • 何種類かの同一のタイプ名が「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」リスト内で使用できるマウスとメニューのすべての選択項目を示してあります。

図 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」リストにセグメント・タイプを追加する。


目次 索引

© 2012 Hewlett-Packard Development Company, L.P.