软件调试对于编程人员来说有着非常重要的意义,应用程序功能的开发和完善是在不断调试中完成的。本文围绕IBM i上C/C++语言的编译调试问题进行分析和介绍。主要介绍两方面的内容:一是system i上C/C++源程序编译方法,二是C/C++程序在system i上的调试方法。IBM i上编辑应用程序代码可以选择绿屏或者其他平台编辑后上传的方式,这里采用windows 端自选编辑器编辑示例程序test.c,然后通过FTP将源文件传输到system i上编译调试的方式。假设已通过此方式将C的源文件bubbleSort.c、bubbleFun.c、bubbleMain.c上传到目录/myApp下。
一 C/C++源程序编译方法
System i上编译C/C++应用程序采用ILE的程序模型,源文件首先被编译成MODULE对象,Module对象可以连接生成PGM对象和SRVPGM对象。为便于理解,可以将Windows平台的obi、exe、dll类型对照到IBM i的MODULE、PGM、SRVPGM对象。这里需要注意,一个PGM可以链接一个或者多个MODULE和SRVPGM,一个SRVPGM同样可以链接多个MODULE和不同的SRVPGM。下面首先介绍MODULE的创建方法,然后根据生成的MODULE介绍如何创建PGM和SRVPGM。在介绍创建MODULE、PGM、SRVPGM详细步骤中,仅对本文涉及到的参数项进行解释说明,其他选项的详细信息可参阅IBM info center。
创建MODULE
a)绿屏命令行下输入“CRTCMOD”,按F4提示功能键。准备调用ILE C编译器。
MODULE:待编译源文件生成的目标MODULE名。
Library:生成的MODULE放置的目标库名。
Source stream file:源代码所在的IFS路径。填写源文件的位置时可以采用IFS文件路径或QSYS.LIB MBR文件的方式(须填写Source file、library和Source member),本例采用文件IFS路径。
Text 'description': 该MODULE的描述信息(非必填信息)。
本例中上述选项所填的信息如下图所示,其中APP为系统中之前创建的library。
二 C/C++绿屏调试方法
下面介绍IBM I 上C/C++应用程序绿屏环境下的调试方法。调试方法可以按照调试过程中JOB的个数简单分为两种类型,单job调试和两个job之间联合调试。所谓单job调试是指被调试的PGM对象在当前的JOB中运行和调试。所谓两个job之间联调是指被调试的PGM对象在当前job中调试,但在另外一个job中运行。通过启动特定的服务job监控调用被调试PGM的job,服务job负责绑定并触发绿屏调试界面。下面分别进行阐述。
IBM i绿屏下单job调试
在一个job中调试PGM是C/C++应用程序调试的最简单情况,它的基本原理可以概括为:启动待调试的PGM源码 → 在源码上设置断点 → 退出源码界面 → 触发待调试的PGM → 调试 → 关闭。详细步骤如下:
a) 启动待调试PGM。
绿屏命令行下执行“STRDBG APP/BUBBLE”启动待调试的PGM源码(BUBBLE为上文生成
的PGM对象),源代码调试界面如图所示:
b) 按F10 → PageDown功能键。
Output options: 表示是否产生相应的编译listing结果信息,该信息可显示编译的选项设置、过程和结果用以更正程序语法错误。选择*PRINT代表在SPOOL FILE中生成编译信息,通过WRKSPLF命令查看该文件。
Title: 生成的listing文件的主标题,最大80字符。用于标识生成的文件。
Subtitle: 生成的listing文件的副标题,最大80字符。
本例中上述选项所填信息如下图所示:
c)按PageDown功能键。
Debugging view:控制如何编译带有调试信息的程序,*SOURCE表示编译生成的调试信息中带有源代码的路径,调试时可以自动找到并显示源代码,但源代码的路径在编译后不可以移到其他地方。*STMT表示生成的调试信息中不包含源代码的位置信息,但包含源程序语句序号的信息。用户可以根据过程名和语句编号来设置断点。*LIST表示编译生成的调试信息中包含完整的源代码清单,编译完成后,该源代码清单与源程序文件没有直接关系,属于不同的副本,故源代码的路径可以更改。其编译出的程序源代码尺寸较前两种大。此处我们填写为*ALL,同时生成前面三种调试信息。
本例中Debugging view 填写*ALL, 未涉及的选项标签在本例中为默认设置。
d)正确填写以上信息后按回车键。
若源代码书写正确编译成功,将在所填写的库位置产生相应的带有debug信息的TESTMODULE *MODULE对象。若编译出错,可到spool File中查找BUBBLE文件根据错误的提示修改源码,重复上述编译步骤。
创建PGM
应用上面生成的MODULE BUBBLE对象创建PGM方法如下:
a) 绿屏命令行下输入CRTPGM,按F4提示功能键。
Program: 待生成的PGM名。
Library: 生成的程序所放置的目标位置库名。
Module: 生成该PGM所需要的MODULE,可以填写一个或多个MODULE。
Library : 所添MODULE的位置库名。
Text 'description':待生成的PGM的描述信息。
本例中上述选项所填信息如下图所示:
b)按F10 → PageDown功能键。
此处介绍下Bind service program相关选项,当绑定 SRVPGM时需要填写下面信息。
Service program:绑定的SRVPGM名字。
Library:绑定的SRVPGM所在的库。
Activation:激活服务程序的方式。*IMMED代表调用应用程序时立即激活服
务程序,*DEFER表示当应用程序调用到服务程序导出的过程时再加载。我们生成的第一个PGM中不包含SRVPGM,上述信息不填,采用默认值。后文调试SRVPGM时,需要自行创建绑定有待调试SRVPGM的PGM。c++源文件生成MODULE的命令是CRTCPPMOD,生成PGM命令仍为CRTPGM。
创建SRVPGM
System i上ILE SRVPGM不能独立运行,但可以被其他SRVPGM和PGM调用。一般创建SRVPGM所需的MODULE对象的源文件不包含main()函数。创建SRVPGM前首先创建MODULE,命名为BUBBLESRV,方法与前文介绍的相同,注意开启DEBUG参数。接下来在绿屏下输入CRTSRVPGM,按F4提示功能键。
Service program:待生成的目标SRVPGM名称。
Library: 待生成的SRVPGM所在的库名字。
Module:生成该SRVPGM所链接的MODULE名字。一个SRVPGM可以链接一个或多个MODULE。
Library:被链接的MODULE所在的库名字。
Export: 标识此SRVPGM导出的函数或者数据。可以通过源文件标识特定的导出函数或者数据,此时需要填写Export source file,Library,Export source member。也可以填写*ALL,表示MODULE中导出的的所有函数和数据在生成的SRVPGM中也将全部导出。
本例中上述选项所填信息如下图所示:
快捷键对应的命令可以参照下表:
功能
|
快捷键
|
命令
|
显示所有支持的
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
|