浅析IBM i上C/C++应用程序编译调试方法

     软件调试 对于编程 人员来说 有着非常 重要的意 义,应用 程序功能 的开发和 完善是在 不断调试 中完成的 。本文围 绕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程序执行一行如图所示:图像 

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

快捷键对应的命令可以参照下表:

功能

快捷键

命令

显示所有支持的 Debug 命令

F1

HELP

光标当前行设置为断点

F6

BREAK

单步执行,跳过函数。

F10

STEP

显示光标所在处变量的值

F11

EVAL

运行到下一个断点

F12

NEXT

查看当前模块的所有断点

F13

NO

查看 module 列表

F14

NO

切换视图模式

F15

NO

查看调用栈

F21

NO

单步执行,进入函数内部

F22

STEP INTO

查看输出窗口

F23

WATCH

 
调试程序 可以反复 修改并调 用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 方式调试 具有更好 的人机交 互界面, 有兴趣的 读者可以 尝试。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值