日本-日本語
日本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
デバッガ説明書


目次 索引



省略時の設定では,トレースポイントは,プロセスがデバッガの制御下に置かれたとき,およびプロセスがイメージ終了命令を実行したときに検出されます。これらの定義済みトレースポイントは,SET TRACE/ACTIVATING コマンドおよび SET TRACE/TERMINATING コマンドをそれぞれ入力した場合と同じ結果をもたらします。SET BREAK/ACTIVATING コマンドおよび SET BREAK/TERMINATING コマンドによって,これらのイベント発生時にブレークポイントを設定することができます。

定義済みのトレースポイントを取り消すには,CANCEL TRACE/PREDEFINED コマンドを /ACTIVATING 修飾子および /TERMINATING 修飾子といっしょに使用します。ユーザ定義の起動時および終了時のブレークポイントを取り消すには,CANCEL BREAK コマンドを /ACTIVATING 修飾子および /TERMINATING 修飾子といっしょに使用します。 /USER 修飾子は,ブレークポイントまたはトレースポイントを取り消す場合の省略時の設定です。

デバッガ・プロンプトは,最初のプロセスがデバッガの制御下に置かれたときに表示されます。その結果,単一プロセス・プログラムの場合のように,メイン・イメージの実行が開始される前にコマンドを入力できます。

同様に,デバッガ・プロンプトは,最後のプロセスがイメージ終了命令を実行したときにも表示されます。その結果,単一プロセス・プログラムの場合のように,プログラムの実行の終了後,コマンドを入力できます。

15.16.3 イメージの実行に割り込みをかけてデバッガに接続する方法

ユーザは,デバッガの制御外で動作しているあるプロセス内のデバッグ可能なイメージに割り込みをかけて,そのプロセスをデバッガに接続することができる。

  • 新しくデバッグ・セッションを開始するには,DCL レベルで, Ctrl/Y--DEBUG シーケンスを使用する。この場合には,マルチプロセス・プログラムのデバッグには使用できない非保持デバッガが起動されることに注意すること。

  • イメージに割り込みをかけて,既存のマルチプロセス・デバッグ・セッションに接続するには,デバッガ CONNECT コマンドを使用する。



15.16.4 マルチプロセス・デバッグの画面モード機能

省略時の設定では,ソース,命令,およびレジスタ・ディスプレイは,可視プロセスに関する情報を表示します。

/PROCESS 修飾子を DISPLAY コマンドといっしょに使用して,それぞれプロセス固有のディスプレイを作成したり,既存のディスプレイをプロセス固有にすることができます。プロセス固有のディスプレイは,そのプロセスのコンテキスト内で生成および修正されます。ユーザは,PROMPT ディスプレイを除く任意のディスプレイをプロセス固有にすることができます。たとえば,次のコマンドは,プロセス 3 において,実行が中断している箇所のソース・コードを表示する,ソース・ディスプレイ SRC_3 を自動的に更新します。

2> DISPLAY/PROCESS=(3) SRC_3 AT RS23 -
2> SOURCE (EXAM/SOURCE .%SOURCE_SCOPE\%PC)

同じ方法で,プロセス固有のディスプレイに属性を割り当てて,プロセス固有でないディスプレイにすることもできます。たとえば,次のコマンドは,SRC_3 ディスプレイを,現在のスクロール・ディスプレイおよびソース・ディスプレイにします。すなわち,SCROLL,TYPE,および EXAMINE/SOURCE の各コマンドの出力は SRC_3 に変更されます。

2> SELECT/SCROLL/SOURCE SRC_3

プロセス指定なしの DISPLAY/PROCESS コマンドを入力すると,指定されたディスプレイが,そのコマンドが入力されたときの可視プロセスに固有のディスプレイとなります。たとえば,次のコマンドは,ディスプレイ OUT_X をプロセス 2 に固有のディスプレイにします。

2> DISPLAY/PROCESS OUT_X

マルチプロセス構成では,プロセス起動時の定義済みのトレースポイントが,新しくデバッガの制御下に置かれたプロセスごとに,新しいソース・ディスプレイと新しい機械語命令ディスプレイを自動的に作成します。これらのディスプレイ名は,それぞれソース・ディスプレイは SRC_n および機械語命令ディスプレイは INST_n という形式になります。ここで,n はプロセス番号です。これらのディスプレイは,最初に削除されたものとしてマークされます。それらは,プロセスが終了すると自動的に削除されます。

いくつかの定義済みキーパッド・キー・シーケンスを使用すれば,プロセスが起動されたときに自動的に作成されるプロセス固有のソース・ディスプレイおよび機械語命令ディスプレイを使用して,画面を構成できます。マルチプロセス・プログラム固有のキー・シーケンスは次のとおりです。PF1 KP9,PF4 KP9,PF4 KP7,PF4 KP3,PF4 KP1。これらのシーケンスの意味については 付録 A.5 節 を参照してください。これらのシーケンスに正確に対応するコマンドを知るには,SHOW KEY コマンドを使用します。

15.16.5 グローバル・セクション内でのウォッチポイントの設定 (Alpha および Integrity のみ)

Alpha および Integrity では,グローバル・セクション内にウォッチポイントを設定できます。グローバル・セクションは,マルチプロセス・プログラムのすべてのプロセス間で共有されるメモリ領域です。グローバル・セクション内のある記憶位置に設定されたウォッチポイント ( グローバル・セクション・ウォッチポイント ) は,任意のプロセスがその記憶位置の内容を変更したときに検出されます。

SET WATCH コマンドを使用して配列やレコードにウォッチポイントを設定する場合には,構造体全体を指定するよりも各要素を指定したほうが性能が向上することに注意してください。

グローバル・セクションにマップされていない記憶位置にウォッチポイントを設定すると,そのウォッチポイントは従来の静的なウォッチポイントとして処理されます。次に例を示します。

1> SET WATCH ARR(1)
1> SHOW WATCH
watchpoint of PPL3\ARR(1)

この後,ARR がグローバル・セクションにマップされると,ウォッチポイントは自動的にグローバル・セクション・ウォッチポイントとみなされるようになり,それを通知する情報メッセージが発行されます。次に例を示します。

1> GO
%DEBUG-I-WATVARNOWGBL, watched variable PPL3\ARR(1) has 
        been remapped to a global section 
predefined trace on activation at routine PPL3 in %PROCESS_NUMBER 2 
predefined trace on activation at routine PPL3 in %PROCESS_NUMBER 3 
watch of PPL3\ARR(1) at PPL3\%LINE 93 in %PROCESS_NUMBER 2 
    93:          ARR(1) = INDEX 
   old value: 0 
   new value: 1 
break at PPL3\%LINE 94 in %PROCESS_NUMBER 2 
   94:           ARR(I) = I

ウォッチされている記憶位置がグローバル・セクションにマップされると,そのウォッチポイントは,次のように,各プロセスから見えるようになります。

all> SHOW WATCH
For %PROCESS_NUMBER 1 
  watchpoint of PPL3\ARR(1) [global-section watchpoint] 
For %PROCESS_NUMBER 2 
  watchpoint of PPL3\ARR(1) [global-section watchpoint] 
For %PROCESS_NUMBER 3 
  watchpoint of PPL3\ARR(1) [global-section watchpoint] 
all>



15.16.6 デバッグのシステム要件

複数のユーザが同時にプログラムをデバッグすると,システムに負荷がかかります。本項では,デバッガが使用するリソースについて説明し,ユーザやシステム管理者が,プログラムのデバッグ作業用にシステムを調整できるようにします。

ここでは,デバッガが使用するリソースだけについて説明します。プログラム自体をサポートするには,システムを調整しなくてはならない場合もあります。

各ユーザは,デバッガ用の追加プロセスを作成するために十分な PRCLM クォータを必要とします。このとき,プログラムの実行に必要な数以上のプロセスを作成できるようにします。

BYTLM,ENQLM,FILLM,および PGFLQUOTA は,プール・クォータです。これらのクォータは,デバッガ・プロセスを考慮して,次のように増やさなければならないに場合があります。

  • 各ユーザの ENQLM クォータは,少なくともデバッグされるプロセス数の分だけ増やす。

  • 各ユーザの PGFLQUOTA クォータも増やす。PGFLQUOTA の値が不十分な場合,デバッガは起動できないか,または実行中に "virtual memory exceeded" のエラーを引き起こす。

  • 各ユーザの BYTLM および FILLM クォータも増やす。デバッガは,デバッグされる各イメージ・ファイル,それらに対応するソース・ファイル,デバッガの入力,およびログ・ファイルをオープンするのに十分な BYTLM クォータおよび FILLM クォータを必要とする。



カーネル・デバッガとメイン・デバッガはグローバル・セクションを通して通信を行います。個々のメイン・デバッガは,プラットフォームに関係なく,少なくとも 64 KB のグローバル・セクションを 1 つ使用します。 Alpha では,メイン・デバッガは,最大 6 個のカーネル・デバッガと通信できます。 Integrity では,メイン・デバッガが通信できるカーネル・デバッガの数は,最大 2 個までです。

15.17 例

例 15-4例 15-5 は,本章の例で使用しているサーバ・プログラムとクライアント・プログラムの C のコードを示しています。

例 15-4 server.c
#include <stdio.h> 
#include <starlet.h> 
#include <cmbdef.h> 
#include <types.h> 
#include <descrip.h> 
#include <efndef.h> 
#include <iodef.h> 
#include <iosbdef.h> 
#include <ssdef.h> 
#include <string.h> 
 
#include "mbxtest.h" 
 
int main (int argc, char **argv) 
{ 
    unsigned int status, write_ef; 
    char line_buf [LINE_MAX_LEN + 1]; 
    iosb myiosb; 
    short mbxchan; 
 
    /* Get event flag.  Look for or create the mailbox. 
     */ 
    status = lib$get_ef (&write_ef); 
    if (!(status & 1)) 
    { 
 fprintf (stderr, "Server unable to get eventflag, 
                                  status = %x", status); 
 return 0; 
    } 
    status = sys$crembx (0, &mbxchan, 0, 0, 0, 0, &mbxname_dsc, 
                                  CMB$M_WRITEONLY, 0); 
    if (!(status & 1)) 
    { 
 fprintf (stderr, "Server unable to open mailbox, 
                                  status = %x", status); 
 return 0; 
    } 
 
    /* Open for business.  Loop looking for and processing requests. 
     */ 
    while (TRUE) 
    { 
 printf ("Input command: "); 
 gets (&line_buf); 
 
 status = sys$clref (write_ef); 
 if (!(status & 1)) 
 { 
     fprintf (stderr, "Client unable to clear read event flag, 
                                  status = %x", status); 
     return 0; 
 } 
 status = sys$qiow (write_ef, mbxchan, 
                                  IO$_SETMODE | IO$M_READERWAIT, &myiosb, 
                           0, 0, 0, 0, 0, 0, 0, 0); 
 
 if ((status) && (myiosb.iosb$w_status)) 
 { 
     status = sys$clref (write_ef); 
     if (!(status & 1)) 
     { 
  fprintf (stderr, "Client unable to clear read event flag, 
                                  status = %x", status); 
  return 0; 
     } 
     if (strlen (line_buf) == 0) 
  status = sys$qio (write_ef, mbxchan, IO$_WRITEOF | IO$M_READERCHECK, &myiosb, 
              0, 0, 0, 0, 0, 0, 0, 0); 
     else 
  status = sys$qio (write_ef, mbxchan, IO$_WRITEVBLK | IO$M_READERCHECK, &myiosb, 
              0, 0, line_buf, strlen (line_buf), 0, 0, 0, 0); 
     if (status) 
     { 
  status = sys$waitfr (write_ef); 
  if ((myiosb.iosb$w_status & 1) && (status & 1)) 
                { 
      if (strlen (line_buf) == 0) 
   break; 
  } 
  else 
      fprintf (stderr, "Server failure during write, 
                             status = %x, iosb$w_status = %x\n", 
               status, myiosb.iosb$w_status); 
     } 
     else 
  fprintf (stderr, "Server failure for write request, 
                             status = %x\n", status); 
 } 
 else 
     fprintf (stderr, "Server failure during wait for reader, 
                             status = %x, iosb$w_status = %x\n", 
               status, myiosb.iosb$w_status);  
    } 
    printf ("\n\nServer done...exiting\n"); 
    return 1; 
} 

例 15-5 client.c
#include <stdio.h> 
#include <starlet.h> 
#include <cmbdef.h> 
#include <types.h> 
#include <descrip.h> 
#include <efndef.h> 
#include <iodef.h> 
#include <iosbdef.h> 
#include <ssdef.h> 
#include <string.h> 
 
#include "mbxtest.h" 
 
int main (int argc, char **argv) 
{ 
    unsigned int status, read_ef; 
    iosb myiosb; 
    short mbxchan; 
    char line_buf [LINE_MAX_LEN]; 
 
    /* Get event flag.  Look for or create the mailbox. 
     */ 
    status = lib$get_ef (&read_ef); 
 
    if (!(status & 1)) 
    { 
 fprintf (stderr, "Client unable to get eventflag, status = %x", status); 
 return 0; 
    } 
    status = sys$crembx (0, &mbxchan, 0, 0, 0, 0, &mbxname_dsc, CMB$M_READONLY, 0); 
    if (!(status & 1)) 
    { 
 fprintf (stderr, "Client unable to open mailbox, status = %x", status); 
 return 0; 
    } 
 
    /* Loop requesting, receiving, and processing new data. 
     */ 
    memset (&myiosb, 0, sizeof(myiosb)); 
 
    while (myiosb.iosb$w_status != SS$_ENDOFFILE) 
    { 
 status = sys$qiow (read_ef, mbxchan, IO$_SETMODE | IO$M_WRITERWAIT, &myiosb, 
      0, 0, 0, 0, 0, 0, 0, 0); 
 if ((status) && (myiosb.iosb$w_status)) 
 { 
     status = sys$clref (read_ef); 
     if (!(status & 1)) 
     { 
  fprintf (stderr, "Client unable to clear read event flag, status = %x", status); 
  return 0; 
     } 
     status = sys$qio (read_ef, mbxchan, IO$_READVBLK | IO$M_WRITERCHECK, &myiosb, 
          0, 0, line_buf, sizeof(line_buf), 0, 0, 0, 0); 
     if (status) 
     { 
  status = sys$waitfr (read_ef); 
  if ((myiosb.iosb$w_status & 1) && (status & 1)) 
      puts (line_buf); 
  else if ((myiosb.iosb$w_status != SS$_NOWRITER) && 
                             (myiosb.iosb$w_status != SS$_ENDOFFILE)) 
      fprintf (stderr, "Client failure during read, 
                             status = %x, iosb$w_status = %x\n", 
               status, myiosb.iosb$w_status); 
     } 
     else 
  fprintf (stderr, "Client failure for read request, status = %x\n", status); 
 } 
 else 
     fprintf (stderr, "Client failure during wait for writer, 
                             status = %x, iosb$w_status = %x\n", 
               status, myiosb.iosb$w_status); 
 status = sys$clref (read_ef); 
 if (!(status & 1)) 
 { 
     fprintf (stderr, "Client unable to clear read event flag, 
                             status = %x", status); 
     return 0; 
 } 
    } 
    printf ("\nClient done...exiting\n"); 
    return 1; 
} 

例 15-4 および 例 15-5 に含まれるヘッダ・ファイル mbxtest.h は,以下のように表示されます。

$DESCRIPTOR(mbxname_dsc, "dbg$mptest_mbx"); 
 
#define LINE_MAX_LEN 255                 


目次 索引

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