Compaq OpenVMS
デバッガ説明書


前へ 次へ 目次 索引


15.16.6 マルチプロセス・デバッグのシステム要件

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

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

15.16.6.1 ユーザ・クォータ

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

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

15.16.6.2 システム・リソース

カーネル・デバッガとメイン・デバッガはグローバル・セクションを通して通信を行います。個々のメイン・デバッガは少なくとも 65 ページのグローバル・セクションを 1 つ必要とし,これを通して最大 8 つのカーネル・デバッガと通信を行います(デバッグ対象のプロセス 1 つにつき 1 つ)。このため,システムのグローバル・ページ・パラメータとグローバル・セクション・パラメータ(それぞれ GBLPAGES と GBLSECTIONS)の値を増やさなければならないことがあります。たとえば,10 人のユーザがデバッガを同時に使用する場合には,デバッガは 10 個のグローバル・セクションを必要とし,全部で 650 グローバル・ページを使用します。

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                 


第 16 章
ベクタ化されたプログラムのデバッグ(VAX のみ)

本章では,ベクタ化されたプログラム(VAX ベクタ命令を使用するプログラム)に固有のデバッガの機能について説明します。他の章で説明するデバッガの機能のほかに,これらの機能も使用します。

本章では,以下のタスクを実行する方法を説明しています。

ベクタ化された高級言語プログラムについての詳しい説明は,各言語のドキュメントを参照してください。ベクタ命令とベクタ・レジスタについての詳しい説明は,『VAX MACRO and Instruction Set Reference Manual』を参照してください。

注意

  1. コンパイラは,プログラム内で宣言されたシンボルにベクタ・レジスタを関連づけるためのシンボル・テーブル・データを生成しません。したがって,デバッグ・セッション中,ベクタ・レジスタはシンボル化できません。また,有効範囲 0(呼び出しスタックの最上部にあるルーチンの有効範囲)にあるベクタ・レジスタにしかアクセスできません。

  2. 本章の例は,配列構文(たとえば,EXAMINE %V1(37))を使用してベクタ・レジスタの要素にアクセスする方法を示します。この構文は BLISS ではサポートされていません。BLISS の場合は,SET LANGUAGE コマンドを使用して言語を一時的に他の言語(Fortran など)に変換し,その言語の配列構文を使用します。

16.1 ベクタ型プロセッサについての情報の入手

SHOW PROCESS/FULL コマンドを使用すると,ユーザのシステムでベクタ型プロセッサを使用できるかどうかおよびその使用方法に関する情報を得ることができます。次に例を示します。


DBG> SHOW PROCESS/FULL
   .
   .
   .
Vector capable:            Yes 
Vector consumer:           Yes  Vector CPU time:       0 00:03:17.18 
Fast Vector context switches:   0  Slow Vector context switches:      0
   .
   .
   .
DBG>

「Vector capable」フィールドには,次のいずれかを指定できます。

Vector-Capable項目 説明
あり VAX システムにベクタ型プロセッサがあり,現在プログラムを実行中のプロセスがアクセスできる。
なし(保護されている) VAX システムにはベクタ型プロセッサがあるが,プログラムを実行しているプロセスはこのプロセッサにアクセスできない。
VVIEF VAX システムにはベクタ型プロセッサがない。VAX ベクタ命令エミュレーション機能(VVIEF)を実行中である。プログラムを実行しているプロセスは VVIEF にアクセスできる。
No VAX システムにはアクティブなベクタ型プロセッサがない。また,VVIEF はこのシステムにロードされていない。

16.2 ベクタ命令の実行の制御とモニタ

ここでは,次のタスクを実行する方法を説明します。

16.2.1 次のベクタ命令までのプログラム実行

プログラム内で次のベクタ命令が検出されるまでそのプログラムを実行するには,STEP/VECTOR_INSTRUCTION コマンドを入力します。

STEP/INSTRUCTION=(opcode[,...])コマンドを使用すれば,命令コード・リスト内にある命令コードを持つベクタ命令を次に検出するまでプログラムを実行することもできます。次に例を示します。


DBG> STEP/INSTRUCTION=(VLDL,VSTL,MOVL)

SET STEP コマンドを使用すると,次のように STEP コマンドの省略時の実行単位を変更できます。

16.2.2 ベクタ命令に対するブレークポイントとトレースポイントの設定

プログラム内でベクタ命令が検出されたとき必ずブレークポイントまたはトレースポイントを検出するには,SET BREAK/VECTOR_INSTRUCTION または SET TRACE/VECTOR_INSTRUCTION コマンドを入力します。

このようなブレークポイントまたはトレースポイントを取り消すには,CANCEL BREAK/VECTOR_INSTRUCTION コマンドまたは CANCEL TRACE/VECTOR_INSTRUCTION コマンドを入力します。

SET BREAK コマンドや SET TRACE コマンドとともに /INSTRUCTION=(opcode[,...])修飾子を使用しても,1 つまたは複数のベクタ命令上にブレークポイントやトレースポイントを設定できます。次にその例を示します。


DBG> SET BREAK/INSTRUCTION=(VVADDL,VVLEQL)

このようなブレークポイントやトレースポイントを取り消すには,CANCEL BREAK/INSTRUCTION コマンドまたは CANCEL TRACE/INSTRUCTION コマンドを使用します。

16.2.3 ベクタ・レジスタ上へのウォッチポイントの設定

ウォッチポイントは,ベクタ・レジスタ(V0 〜 V15)とベクタ制御レジスタ(VCR,VLR,および VMR)に設定できます。これらのレジスタとその組み込みのデバッガ・シンボルについては,第 16.3.1 項 を参照してください。

これらのウォッチポイントは,静的ウォッチポイントとして扱われ,設定されたあとは明示的に取り消すまで有効です。次の例では,ウォッチポイントが VCR レジスタに設定されます。


DBG> SET WATCH %VCR

レジスタ VMR と V0 から V15 の場合,ウォッチポイントはレジスタ集合体(レジスタのすべての要素),個々のレジスタ要素またはある範囲の要素(断面)のどれかに設定できます。これは,配列変数にウォッチポイントを設定する場合と同じ方法で設定します。 第 3.4 節 を参照してください。

たとえば,次のコマンドは,レジスタ V5 の要素がどれか変化するとウォッチポイントが検出されるように設定します。


DBG> SET WATCH %V5

次のコマンドは,V2 の要素 37 が変化すると,ウォッチポイントが検出されるように設定します(Fortran 配列構文)。


DBG> SET WATCH %V2(37)

次のコマンドは,V2 で要素 5 〜 13 のどれかが変化するとウォッチポイントが検出されるように設定します。


DBG> SET WATCH %V2(5:13)

16.3 ベクタ・レジスタの検査と値の格納

ここでは,ベクタ制御レジスタ(VCR,VLR および VMR)とベクタ・レジスタ(V0 〜 V15)を検査し,値を格納する方法を説明します。

16.3.1 ベクタ・レジスタとベクタ制御レジスタの指定

VAX アーキテクチャには,16 個のベクタ・レジスタ(V0 〜 V15)と 3 個のベクタ制御レジスタ(VCR,VLR,VMR)があります。デバッガ・コマンドでこれらのレジスタを参照する場合は,次の組み込みシンボル(レジスタ名の前にパーセント記号(%)がついてる)を使用します。

シンボル 説明
%V0...%V15 ベクタ・レジスタ(V0...V15)
%VCR ベクタ数レジスタ(VCR)
%VLR ベクタ長レジスタ(VLR)
%VMR ベクタ・マスク・レジスタ(VMR)

どのデバッガ・レジスタ・シンボルでもそうであるように,プログラムがその名前にパーセント記号(%)を宣言していない場合,このシンボルは省くことができます。

16.3.2 ベクタ数レジスタの検査と値の格納

ベクタ数レジスタ(VCR)は,IOTA 命令によって生成されたオフセット・ベクタの長さを指定します。

VCR の値は,0 から 64 までの整数です。省略時の設定では,デバッガは VCR をロングワード整数として扱います。64 を超す値も VCR に格納できますが,その場合,デバッガは診断メッセージを発行して値がこのクラスの限界を超えていることを知らせます。

次のコマンド・シーケンスは,VCR の値を操作する方法を示しています。


DBG> EXAMINE %VCR
0\%VCR: 8
DBG> DEPOSIT %VCR = 4
DBG> EXAMINE %VCR
0\%VCR: 4
DBG>


前へ 次へ 目次 索引