软件调试
对于编程
人员来说
有着非常
重要的意
义,应用
程序功能
的开发和
完善是在
不断调试
中完成的
。本文围
绕IBM
i上C/
C++语
言的编译
调试问题
进行分析
和介绍。
主要介绍
两方面的
内容:一
是sys
tem i上C/
C++源
程序编译
方法,二
是C/C
++程序
在sys
tem i上的调试方法。IBM i上编辑
应用程序
代码可以
选择绿屏
或者其他
平台编辑
后上传的
方式,这
里采用w
indo
ws 端自选编
辑器编辑
示例程序
test
.c,然
后通过F
TP将源
文件传输
到sys
tem i上编译
调试的方
式。假设
已通过此
方式将C
的源文件
bubb
leSo
rt.c
、bub
bleF
un.c
、bub
bleM
ain.
c上传到
目录/m
yApp
下。
一 C/C++源程序编译方法
System i上编译
C/C+
+应用程
序采用I
LE的程
序模型,
源文件首
先被编译
成MOD
ULE对
象,Mo
dule
对象可以
连接生成
PGM对
象和SR
VPGM
对象。为
便于理解
,可以将
Wind
ows平
台的ob
i、ex
e、dl
l类型对
照到IB
M i的MO
DULE
、PGM
、SRV
PGM对
象。这里
需要注意
,一个P
GM可以
链接一个
或者多个
MODU
LE和S
RVPG
M,一个
SRVP
GM同样
可以链接
多个MO
DULE
和不同的
SRVP
GM。下
面首先介
绍MOD
ULE的
创建方法
,然后根
据生成的
MODU
LE介绍
如何创建
PGM和
SRVP
GM。在
介绍创建
MODU
LE、P
GM、S
RVPG
M详细步
骤中,仅
对本文涉
及到的参
数项进行
解释说明
,其他选
项的详细
信息可参
阅IBM
info center。
创建MODULE
a)绿屏
命令行下
输入“C
RTCM
OD”,
按F4提
示功能键
。准备调
用ILE
C编译器。
MODU
LE:待
编译源文
件生成的
目标MO
DULE
名。
Libr
ary:
生成的M
ODUL
E放置的
目标库名
。
Source stream file
:源代码
所在的I
FS路径
。填写源
文件的位
置时可以
采用IF
S文件路
径或QS
YS.L
IB MBR文件的方式(须填写Source file、library和Source memb
er),
本例采用
文件IF
S路径。
Text 'description': 该MOD
ULE的
描述信息
(非必填
信息)。
本例中上
述选项所
填的信息
如下图所
示,其中
APP为
系统中之
前创建的
libr
ary。
b) 按F10 → PageDown功能键。
Output options: 表示是否
产生相应
的编译l
isti
ng结果
信息,该
信息可显
示编译的
选项设置
、过程和
结果用以
更正程序
语法错误
。选择*
PRIN
T代表在
SPOO
L FILE
中生成编
译信息,
通过WR
KSPL
F命令查
看该文件
。
Title: 生成的l
isti
ng文件
的主标题
,最大8
0字符。
用于标识
生成的文
件。
Subtitle: 生成的l
isti
ng文件
的副标题
,最大8
0字符。
本例中上述选项所填信息如下图所示:
c)按PageDown功能键。
Debugging view
:控制如
何编译带
有调试信
息的程序
,*SO
URCE
表示编译
生成的调
试信息中
带有源代
码的路径
,调试时
可以自动
找到并显
示源代码
,但源代
码的路径
在编译后
不可以移
到其他地
方。*S
TMT表
示生成的
调试信息
中不包含
源代码的
位置信息
,但包含
源程序语
句序号的
信息。用
户可以根
据过程名
和语句编
号来设置
断点。*
LIST
表示编译
生成的调
试信息中
包含完整
的源代码
清单,编
译完成后
,该源代
码清单与
源程序文
件没有直
接关系,
属于不同
的副本,
故源代码
的路径可
以更改。
其编译出
的程序源
代码尺寸
较前两种
大。此处
我们填写
为*AL
L,同时
生成前面
三种调试
信息。
本例中Debugging view 填写*ALL, 未涉及的选项标签在本例中为默认设置。
d)正确填写以上信息后按回车键。
若源代码
书写正确
编译成功
,将在所
填写的库
位置产生
相应的带
有deb
ug信息
的TES
TMOD
ULE *MOD
ULE对
象。若编
译出错,
可到sp
ool File
中查找B
UBBL
E文件根
据错误的
提示修改
源码,重
复上述编
译步骤。
创建PGM
应用上面生成的MODULE BUBBLE对象创建PGM方法如下:
a) 绿屏命令
行下输入
CRTP
GM,按
F4提示
功能键。
Program: 待生成的PGM名。
Library: 生成的程序所放置的目标位置库名。
Module: 生成该P
GM所需
要的MO
DULE
,可以填
写一个或
多个MO
DULE
。
Library : 所添MODULE的位置库名。
Text 'des
crip
tion
':待生
成的PG
M的描述
信息。
本例中上述选项所填信息如下图所示:
b)按F10 → PageDown功能键。
此处介绍下Bind service program相关选项,当绑定 SRVPGM时需要填写下面信息。
Service prog
ram:
绑定的S
RVPG
M名字。
Lib
rary
:绑定的
SRVP
GM所在
的库。
Acti
vati
on:激
活服务程
序的方式
。*IM
MED代
表调用应
用程序时
立即激活
服
务程序,
*DEF
ER表示
当应用程
序调用到
服务程序
导出的过
程时再加
载。我们
生成的第
一个PG
M中不包
含SRV
PGM,
上述信息
不填,采
用默认值
。后文调
试SRV
PGM时
,需要自
行创建绑
定有待调
试SRV
PGM的
PGM。
c++源
文件生成
MODU
LE的命
令是CR
TCPP
MOD,
生成PG
M命令仍
为CRT
PGM。
创建SRVPGM
System i上ILE SRVP
GM不能
独立运行
,但可以
被其他S
RVPG
M和PG
M调用。
一般创建
SRVP
GM所需
的MOD
ULE对
象的源文
件不包含
main
()函数
。创建S
RVPG
M前首先
创建MO
DULE
,命名为
BUBB
LESR
V,方法
与前文介
绍的相同
,注意开
启DEB
UG参数
。接下来
在绿屏下
输入CR
TSRV
PGM,
按F4提
示功能键
。
Service prog
ram:
待生成的
目标SR
VPGM
名称。
Library: 待生成的SRVPGM所在的库名字。
Modu
le:生
成该SR
VPGM
所链接的
MODU
LE名字
。一个S
RVPG
M可以链
接一个或
多个MO
DULE
。
Libr
ary:
被链接的
MODU
LE所在
的库名字
。
Export: 标识此S
RVPG
M导出的
函数或者
数据。可
以通过源
文件标识
特定的导
出函数或
者数据,
此时需要
填写Ex
port
source file,Library,Export source memb
er。也
可以填写
*ALL
,表示M
ODUL
E中导出
的的所有
函数和数
据在生成
的SRV
PGM中
也将全部
导出。
本例中上述选项所填信息如下图所示:
二 C/C++绿屏调试方法
下面介绍IBM I 上C/C
++应用
程序绿屏
环境下的
调试方法
。调试方
法可以按
照调试过
程中JO
B的个数
简单分为
两种类型
,单jo
b调试和
两个jo
b之间联
合调试。
所谓单j
ob调试
是指被调
试的PG
M对象在
当前的J
OB中运
行和调试
。所谓两
个job
之间联调
是指被调
试的PG
M对象在
当前jo
b中调试
,但在另
外一个j
ob中运
行。通过
启动特定
的服务j
ob监控
调用被调
试PGM
的job
,服务j
ob负责
绑定并触
发绿屏调
试界面。
下面分别
进行阐述
。
IBM i绿屏下单job调试
在一个j
ob中调
试PGM
是C/C
++应用
程序调试
的最简单
情况,它
的基本原
理可以概
括为:启
动待调试
的PGM
源码 → 在源码上设置断点 → 退出源码界面 → 触发待调试的PGM → 调试 → 关闭。详细步骤如下:
a) 启动待调试PGM。
绿屏命令行下执行“STRDBG APP/
BUBB
LE”启
动待调试
的PGM
源码(B
UBBL
E为上文
生成
的PGM
对象),
源代码调
试界面如
图所示:
b)设置断点/条件断点。
可以通过命令行或功能键设置断点。如br 25将在25行设置断点;br 25 when value=1 将设置条
件断点;
按功能键
F6将在
鼠标当前
所在行设
置断点,
断点行以
白色显示
。断点设
置完成后
按F12
返回。此
处我们在
行Tes
t.c的
第11行
设置断点
命令br
11。
c) 触发待调试程序。
如何触发
已设断点
的待调试
应用程序
是调试的
关键步骤
,本例相
对比较容
易,直接
执行CL
command:“CALL APP/
BUBB
LE”,
待调试程
序将被触
发并停止
在之前所
设置的1
1行断点
处,当前
运行以白
色显示。
将如图所
示。
d) 调试程序。此时仍然有命令行和功能键两种方式控制debug程序的执行。如F10单步执行, F11显示光标所在处变量的值。其调试方法和技巧与其他平台类似。可以在绿屏命令行下执行”HELP“命令查询具体的命令的使用方法。此处我们单步执行,按F10程序执行一行如图所示:
快捷键对应的命令可以参照下表:
调试程序
可以反复
修改并调
用cal
l命令触
发调试,
也可以通
过F14
功能键添
加更多的
调试程序
。需要注
意的是S
TRDB
G命令只
能成功执
行一次,
即针对一
个调试程
序有效,
对程序成
功调试之
后需调用
ENDD
BG命令
结束程序
调试,否
则无法调
试下一个
不同的程
序。
IBM i绿屏下两个Job联合调试
上面的调
试属于在
一个jo
b内完成
调试工作
,但在实
际应用中
很多待调
试程序以
服务程序
对象SR
VPGM
方式存在
所以如何
调用SR
VPGM
、如何触
发DEB
UG调试
器是调试
SRVP
GM的关
键。IB
M i上利用
服务JO
B来调试
ILE程
序或者I
LE服务
程序,调
试器和被
调试程序
将位于不
同的JO
B中,即
两个jo
b间联合
调试。其
基本原理
是:作为
服务jo
b B连接到job A,服务job B负责设
置断点和
调试程序
。而调试
程序的触
发则是在
job A中完成的。详细的调试步骤为:
a)编译带有调试信息的ILE服务程序。
创建MODULE:CRTCMOD MODULE(APP/SRVMOD)
SRCS
TMF(
'/my
App/
bubb
leFu
n.c'
) OUTPUT(*PRINT) DBGVIEW(*ALL)
创建SRVPGM:CRTSRVPGM SRVPGM(APP/SRV)
MODULE(APP/SRVMOD) EXPORT(*ALL)
b) 编译带有
调试信息
的调用I
LE服务
程序的P
GM。
创建MODULE:CRTCMOD MODULE(APP/SRVP) SRCS
TMF(
'/my
App/
bubb
leMa
in.c
') OUTPUT(*PRINT) DBGVIEW(*ALL)
创建PGM:CRTPGM PGM(APP/BUBBLEMAIN) MODULE(APP/SRVP) BNDSRVPGM((APP/SRV *IMMED))
c) 启动绿屏
终端A,
A中将会
触发调试
的服务程
序。
d) 启动另一
个绿屏终
端B,在
终端B中
通过ST
RSRV
JOB命
令来捕获
终端A中
触发的服
务程序。
该命令有
Job name
、Use
r、Nu
mber
三个参数
需要填写
,代表需
要被监控
的终端A
上的作业
。终端A
上shi
ft+E
SC回车
,选择3
,即可显
示A上终
端作业,
如图:
STRSRVJOB的填写信息如下:
e) 在终端B中,使用STRDBG SRVPGM(LCF/SRV) 命令将被
调试的I
LE服务
程序置于
调试模式
并按上文
介绍的方
法设置断
点在第六
行,如图
所示:
f) 在终端A
中启动一
个作业,
在该作业
中调用被
调试的I
LE服务
程序,此
过程是单
Job调
试方式中
的deb
ug触发
,执行C
ALL LCF/ TESTMAIN。
g) 当终端A
中的作业
调用到I
LE服务
程序提供
的某个过
程时,终
端B将自
动显示调
试界面,
并且程序
将停止在
上文在A
终端设置
的断点处
。如图所
示:
h) 在终端B
中,利用
上文介绍
的PGM
对应的调
试命令进
行调试。
i) 调试结束
后,终端
B中按下
F3或者
F12功
能键退出
调试器。
在终端B
中,命令
行下执行
“END
DBG”
退出调试
模式。在
终端B中
,命令行
下执行“
ENDS
RVJO
B”,结
束终端B
对终端A
中作业的
调试。
以上介绍了System i上C/
C++应
用程序绿
屏编译调
试MOD
ULE、
PGM、
SRVP
GM的基
本方法,
在实际应
用中,应
用程序的
编译还需
考虑很多
因素。由
于篇幅所
限,很多
详细的编
译选项未
全部阐述
,读者可
以根据上
述编译命
令查阅相
关文档自
行尝试。
绿屏调试
是sys
tem i调试的
一种方式
,GUI
方式调试
具有更好
的人机交
互界面,
有兴趣的
读者可以
尝试。