| 日本-日本語 |
|
|
|
|
OpenVMS マニュアル |
|
HP OpenVMS
|
| 目次 | 索引 |
15.16.2 プロセスの起動と終了のモニタ |
省略時の設定では,トレースポイントは,プロセスがデバッガの制御下に置かれたとき,およびプロセスがイメージ終了命令を実行したときに検出されます。これらの定義済みトレースポイントは,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 イメージの実行に割り込みをかけてデバッガに接続する方法
![]()
ユーザは,デバッガの制御外で動作しているあるプロセス内のデバッグ可能なイメージに割り込みをかけて,そのプロセスをデバッガに接続することができる。
省略時の設定では,ソース,命令,およびレジスタ・ディスプレイは,可視プロセスに関する情報を表示します。
/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> |
複数のユーザが同時にプログラムをデバッグすると,システムに負荷がかかります。本項では,デバッガが使用するリソースについて説明し,ユーザやシステム管理者が,プログラムのデバッグ作業用にシステムを調整できるようにします。
ここでは,デバッガが使用するリソースだけについて説明します。プログラム自体をサポートするには,システムを調整しなくてはならない場合もあります。
各ユーザは,デバッガ用の追加プロセスを作成するために十分な PRCLM クォータを必要とします。このとき,プログラムの実行に必要な数以上のプロセスを作成できるようにします。
BYTLM,ENQLM,FILLM,および PGFLQUOTA は,プール・クォータです。これらのクォータは,デバッガ・プロセスを考慮して,次のように増やさなければならないに場合があります。
カーネル・デバッガとメイン・デバッガはグローバル・セクションを通して通信を行います。個々のメイン・デバッガは,プラットフォームに関係なく,少なくとも 64 KB のグローバル・セクションを 1 つ使用します。 Alpha では,メイン・デバッガは,最大 6 個のカーネル・デバッガと通信できます。 Integrity では,メイン・デバッガが通信できるカーネル・デバッガの数は,最大 2 個までです。
例 15-4 と 例 15-5 は,本章の例で使用しているサーバ・プログラムとクライアント・プログラムの C のコードを示しています。
15.16.6 デバッグのシステム要件
![]()
15.16.6.1 ユーザ・クォータ
15.16.6.2 システム・リソース
![]()
15.17 例
![]()
| 例 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 |
| 目次 | 索引 |
|
||||||||