向程序添加断点
要向要调试的程序添加断点,请使用 Add Breakpoint (ADDBKP) 命令。
最多可以在一个 ADDBKP 命令上指定 10 个语句标识。 ADDBKP 命令上指定的程序变量仅适用于该命令上指定的断点。 在一个 ADDBKP 命令中最多可以指定 10 个变量。
您还可以指定要将断点添加到的程序的名称。 如果不指定要将断点添加到的程序的名称,那么会将断点添加到 STRDBG , CHGDBG 或 ADDPGM 命令上指定的缺省程序。
要向程序添加断点,请指定语句标识,可以是:
- 语句标签
- 语句号
- 机器接口 (MI) 指令号
向程序添加断点时,还可以指定要在到达断点时显示其值或部分值的程序变量。 这些变量可以字符或十六进制格式显示。
在处理指令之前,程序处理在断点处停止。 对于交互式作业,系统显示程序已停止的断点以及 (如果请求) 程序变量的值。
在高级语言程序中,可以将不同的语句和标签映射到相同的内部指令。 当程序中有多个不可操作的语句 (例如 DO 和 ENDDO) 相互跟随时,会发生此情况。 您可以使用 IRP 列表来确定将哪些语句或标签映射到同一指令。
将不同语句映射到同一指令的结果是,要添加的断点可能重新定义先前为不同语句添加的断点。 发生此情况时,新的断点将替换先前添加的断点,即除去先前的断点并添加新的断点。 显示此信息后,可以执行下列任何操作:
- 通过按 F3来结束最近的请求。
- 按 Enter 键继续程序处理。
- 通过按 F10,转至下一个请求级别的命令条目屏幕。 从此屏幕,您可以:
- 输入可在交互式调试环境中使用的任何 CL 命令。 您可以显示或更改程序中变量的值,添加程序或从调试方式中除去程序,或者执行其他调试命令。
- 通过输入 Resume Breakpoint (RSMBKP) 命令继续处理程序。
- 通过按 F3键返回到断点屏幕。
- 通过输入 End Request (ENDRQS) 命令返回到上一请求级别的命令条目屏幕。
对于批处理作业,可以在到达断点时调用断点程序。 必须创建此断点程序以处理断点信息。 将断点信息传递到断点程序。 断点程序是另一个程序,例如 CL 程序,它可以包含您为交互式作业以交互方式输入的相同命令 (函数请求)。 例如,程序可以显示和更改变量,或者添加和除去断点。 可以请求在批处理作业中有效的任何功能。 当断点程序完成处理时,正在调试的程序将继续。
对于调试作业的每个断点,将在作业记录中记录一条消息。
以下 ADDBKP 命令将断点添加到程序 CUS310。 CUS310 是缺省程序,因此不必指定它。 当达到第二个断点时,变量 &ARBAL 的值就会显示出来。
ADDBKP STMT(900)
ADDBKP STMT(2200) PGMVAR('&ARBAL')
CUS310 的源如下所示。
5728PW1 R01M00 880101 SEU SOURCE LISTING
SOURCE FILE . . . . . . . QGPL/QCLSRC
MEMBER . . . . . . . . . CUS310
SEQNBR*...+... 1 ...+... 2 ...+... 3 ...+... 4 ...+... 5 ...+...
6 ...+... 7 ...+... 8 ...
100 PGM PARM(&NBRITEMS &ITEMPRC &PARBAL &PTOTBAL)
200 DCL VAR(&PARBAL) TYPE(*DEC) LEN(15 5) /*
INPUT AREA INV BALANCE */
300 DCL VAR(&PTOTBAL) TYPE(*DEC) LEN(15 5) /*
INPUT TOTAL INV BALANCE*/
400 DCL VAR(&NBRITEMS) TYPE(*DEC) LEN(15 5) /*
NUMBER OF ITEMS */
500 DCL VAR(&ITEMPRC) TYPE(*DEC) LEN(15 5) /*
PRICE OF THE ITEM */
600 DCL VAR(&ARBAL) TYPE(*DEC) LEN(5 2) /*
AREA INVENTORY BALANCE */
700 DCL VAR(&TOTBAL) TYPE(*DEC) LEN(5 2) /*
TOTAL INVENTORY BALANCE*/
800 DCL VAR(&TOTITEM) TYPE(*DEC) LEN(5 2) /*
TOTAL PRICE OF ITEMS */
900 CHGVAR VAR(&ARBAL) VALUE(&PARBAL)
1000 CHGVAR VAR(&TOTBAL) VALUE(&PTOTBAL)
1100 IF COND(&NBRITEMS *EQ 0) THEN(DO)
1200 SNDPGMMSG MSG('The number of items is zero. This item +
1300 should be ordered.') TOMSGQ(INVLIB/INVQUEUE)
1400 GOTO CMDLBL(EXIT)
1500 ENDDO
1600 CHGVAR VAR(&TOTITEM) VALUE(&NBRITEMS * &ITEMPRC)
1700 IF COND(&NBRITEMS *GT 50) THEN(DO)
1800 SNDPGMMSG MSG('Too much inventory for this item.') +
1900 TOMSGQ(INVLIB/INVQUEUE)
2000 ENDDO
2100 CHGVAR VAR(&ARBAL) VALUE(&ARBAL + &TOTITEM)
2200 IF COND(&ARBAL *GT 1000) THEN(DO)
2300 SNDPGMMSG MSG('The area has too much money in +
2400 inventory.') TOMSGQ(INVLIB/INVQUEUE)
2500 ENDDO
2600 CHGVAR VAR(&TOTBAL) VALUE(&TOTBAL + &TOTITEM)
2700 EXIT: ENDPGM
由于到达第一个断点,将显示以下内容:
Display Breakpoint
Statement/Instruction . . . . . . . . . : 900 /0009
Program . . . . . . . . . . . . . . . . : CUS310
Recursion level . . . . . . . . . . . . : 1
Press Enter to continue.
F3=Exit program F10=Command entry
由于到达第二个断点,将显示以下内容:
Display Breakpoint
Statement/Instruction . . . . . . . . . : 2200 /0022
Program . . . . . . . . . . . . . . . . : CUS310
Recursion level . . . . . . . . . . . . : 1
Start position . . . . . . . . . . . . : 1
Format . . . . . . . . . . . . . . . . : *CHAR
Length . . . . . . . . . . . . . . . . : *DCL
Variable . . . . . . . . . . . . . . . : &ARBAL
Type . . . . . . . . . . . . . . . . : PACKED
Length . . . . . . . . . . . . . . . : 5 2
'610.00'
Press Enter to continue.
F3=Exit program F10=Command entry
显示的是变量 &ARBAL。 (请注意,&ARBAL 的值会根据传递给程序的参数值而变化) 您可以按 F10 来显示命令输入显示屏,这样就可以更改变量 &ARBAL 的值,从而改变程序的处理过程。 您可以使用 Change Program Variable (CHGPGMVAR) 命令来更改变量的值。