以图形方式调试 IBM i 程序

IBM i 调试器分步简介

对于 IBM i 新手或者习惯于使用图形化工具调试应用程序的用户来说,调试 IBM i 程序非常困难。本文将展示如何使用集成的 IBM i 调试器以图形化方式调试程序。

Jin Jiang Zhang, 软件工程师, IBM

Jin Jiang Zhang 的照片Jin Jiang Zhang 目前就职于北京的 IBM Lotus Domino 团队。他是可在 Unix、IBM i、zLinux 和 Windows 等多种平台上运行的 Domino Server Language Pack 的所有者。



Li Jiu Yu, 软件工程师, IBM

Li Jui Yu 的照片Li Jiu Yu 于 2010 年加入北京 IBM CDL,担任 Domino 开发人员,负责 LCU (Lotus Component for Unicode) 的开发工作。



Shuang Hong Wang, 高级软件工程师, IBM

Shuang Hong Wang photoShuang Hong Wang 自 2005 年起从事 Lotus Domino 的开发和客户支持工作。目前,他是 IBM i 上的 Lotus 产品的技术主管。



2011 年 12 月 19 日

IBM i 调试器概述

调试工具是应用程序开发环境中的关键组件。开发人员可以利用调试器来隔离问题、了解软件代码路径,甚至还可以评估潜在的代码更改。功能强大的调试器能够大幅提高软件开发人员的工作效率。

IBM i 开发人员熟悉 IBM i 及其前身平台(AS/400、iSeries 和 System i)提供的绿屏调试器。绿屏调试器可以通过 STRDBG (Start Debug) 和 STRISDB (Start Interactive Source Debugger) 命令进行访问。尽管有这些调试器可以使用,但它们并未提供现代图形化调试器的生产率和易用性。好消息是,IBM 提供了两款图形化调试工具,可帮助您提升生产率。

大多数 IBM i 开发人员仅仅注意到了 IBM Rational Developer for Power Systems 软件中提供的图形化调试器。IBM i 操作系统附带的图形化 IBM i 调试器往往被人们忽视。这种调试器在产品文档中称为 IBM System Debugger,但为了简便起见,本文将其称为图形化 IBM i 调试器。这种集成的图形化调试器最初是在 OS/400 的 V5R1 版本中提供的。

IBM Rational Developer for Power Systems 软件调试器

IBM Rational Developer for Power Systems 产品是一款用于开发在 IBM Power Systems 上运行的应用程序的 IDE。这款功能强大的工具为 IBM i 提供了 RPG 和 COBOL 开发工具,为 AIX 提供了 C/C++ 和 COBOL 开发工具。开发人员可以利用这种工具,在 IBM i 上创建、编辑、编译和调试源代码。图 1 展示了 IBM Rational Developer 产品提供的图形化调试器界面。程序员也可利用这种工具在任何 IBM i 服务器上创建库、源物理文件和成员。

这种图形化工具集支持创建和调试应用程序代码的典型步骤:

  1. 在不希望使用现有库的情况下创建新库
  2. 创建一个物理文件,以便包含源代码成员
  3. 创建一个成员,以便编写源代码
  4. 使用调试信息编译源代码成员
  5. 将编译器创建的程序文件添加到服务入口点
  6. 调试程序(步骤与其他 IDE 类似)
图 1. Rational Developer for Power Systems 软件
Rational Developer for Power Systems 软件

图形化 IBM i 调试器

图形化 IBM i 调试器可视为传统 IBM i 绿屏调试器的图形版本。图形化 IBM i 调试器封装在 IBM Toolbox for Java 提供的两个 JAR 文件中。这种图形化调试器可在任何支持 Java 的平台上运行,例如 Windows、Linux 和 Unix 平台。本文将详细讨论这种图形化调试器。

两种调试器的优缺点

如表 1 所示,在两款调试器中,Rational 调试器更为强大。但与图形化 IBM i 调试器相比,它需要的磁盘空间也多得多。图形化 IBM i 调试器是一款轻量级的调试器,仅需占用工作站 5M 字节的空间,同时也能提供强大的调试功能。除此之外,这种调试器的安装非常简单,可以按照与基于 Java 的平台上相同的使用方法在各种平台上进行使用。最重要的是,图形化 IBM i 调试器包含于 IBM i 操作系统之中,因此,无需额外付费即可使用这款调试器。相比之下,使用 Rational 调试器需要购买整个 Rational IDE 产品。

表 1. 适用于 IBM i 的调试器对比
Rational 调试器图形化 IBM i 调试器
功能 能够从调试会话中启动代码编辑器。
远程调试
远程调试
磁盘空间 约 1G 字节 约 5M 字节
用户体验 非常好 良好
成本 需要额外支付许可费用 没有成本,包含于 IBM i 操作系统之中

安装图形化 IBM i 调试器

通常情况下,有两种方法可用于安装图形化 IBM i 调试器。一种方法是通过安装 IBM System i Navigator 客户端完成的。另外一种方法需要手动将所需的 JAR 文件复制到您的工作站中。

通过 IBM System i Navigator 安装和启动图形化 IBM i 调试器

IBM System i Navigator 客户端为最终用户提供了一种图形化用户界面,用该界面取代管理 IBM i 系统的传统绿屏。除了这种功能之外,它还嵌入了图形化 IBM i 调试器,供开发人员使用。如果您的工作站上已经安装了 IBM System i Navigator 客户端,则无需执行任何步骤来安装图形化 IBM i 调试器。有关 IBM System i Navigator 产品的更多信息,请参阅参考资料部分。

安装了 IBM System i Navigator 客户端之后,执行以下步骤即可启动调试器:

  1. 在 IBM System i Navigator 客户端的导航树中,依次展开以下各项:My connections -> Your System Name-> Databases
  2. 右键单击所需数据库,并选择 Run SQL Scripts 任务。
  3. Run SQL Scripts 窗口中,从 Run 下拉菜单中选择 Debugger 任务,如图 2 所示。

毫无疑问,在调试 SQL 过程、函数和触发程序时,通过这种方式启动调试器更加便捷。这个界面还可用于启动不包含 SQL 的程序的调试器。

图2. 通过 Run SQL Scripts 启动图形化 IBM i 调试器
图2. 通过 Run SQL Scripts 启动图形化 IBM i 调试器

通过 IBM Toolbox for Java 安装图形化 IBM i 调试器

如果您无法安装 IBM System i Navigator 客户端,那么还有另外一种安装图形化 IBM i 调试器的方法。这种方法会复制 IBM Toolbox for Java 中的特定组件。这种包含一组 JAR 文件的工具箱并非专门为调试 IBM i 上的程序而设计,而是设计用于开发利用 IBM i 资源的 Java 程序。

具体来说,仅有两个 JAR 文件需要复制到您的工作站中,这两个文件由 IBM Toolbox for Java 提供。有两种方法可将图形化调试器需要的 JAR 文件复制到您的工作站中。一种方法是将 JTOpen 程序包下载到工作站。JTOpen 是 IBM Toolbox for Java 的开放源码版本。两种程序包所包含的代码是相同的。第二种方法是访问安装了 IBM Toolbox for Java 的系统。第一种方法简单直接,因此本文不作详细讨论。请参阅参考资料部分中的 IBM Toolbox for Java 条目。下面介绍了第二种方法。

为了从 IBM i 系统获得这两个 JAR 文件,您需要访问安装了 IBM Toolbox for Java 程序包的服务器。当使用图形化 IBM i 调试器调试在某个系统上运行的程序时,该系统中不必安装 IBM Toolbox for Java。默认情况下,工具箱应已安装在系统中。要检查您的系统中是否安装了 IBM Toolbox for Java,请按照以下步骤进行操作:

  1. 登录 IBM i 系统
  2. 在命令行中,输入 go licpgm,这会使您导航到 Work with Licensed Programs 窗格。
  3. 选择选项 10,Display installed licensed programs。这个选项将生成目前已安装的、获得许可的程序的列表。
  4. 向下翻页,在 Display Installed Licensed Programs 窗格中查看已经安装的程序。如果 IBM Toolbox for Java 产品出现在列表中,则可以确定已经安装了该产品。

如果未安装工具箱,请按照以下步骤安装 IBM Toolbox for Java:

  1. 在命令行中输入 go licpgm
  2. 选择选项 11, Install licensed programs
  3. 在名为 Extended Base Directory Support 的条目的 Option 列中键入 1,安装工具箱。
  4. 安装完成后,使用上述步骤确认 IBM Toolbox for Java 已安装。

有关安装 IBM Toolbox for Java 的具体信息和先决条件,请参阅 IBM Toolbox for Java 一书,可在 IBM i 信息中心 内找到此书。

假设 IBM Toolbox for Java 已安装,那么您的下一个步骤就是在工作站上安装所需的 JAR 文件。本文给出的安装步骤是针对 Windows 工作站的步骤。其他类型的工作站的安装过程大体相同。

  1. 复制 IBM i 的 /QIBM/ProdData/HTTP/Public/jt400/lib/ 中的两个 JAR 文件 jt400.jar 和 tes.jar(或从您刚刚复制到工作站的 JTOpen 程序包中复制)。这两个 JAR 文件是提供图形化调试器功能的 IBM Toolbox for Java 组件。
  2. 将这两个 JAR 文件的路径添加到您的 CLASSPATH 环境变量中。举例来说,如果您将这两个 JAR 文件复制到了 Windows 工作站的 C:\iDebugger\ 目录中,则应添加以下一行内容来更新 CLASSPATH 变量:;C:\iDebugger\jt400.jar;C:\iDebugger\tes.jar。

至此,图形化 IBM i 调试器的安装便已完成。要运行图形化调试器,则必须在工作站上安装恰当的 JDK 或 JRE 版本。所需的最低 JDK 和 JRE 版本取决于您复制 JAR 文件的 IBM i OS 版本。举例来说,IBM i V5R4 版本所需的最低版本是 Java 1.3.1 版。IBM i 7.1 版的 IBM Toolbox for Java 需要 Java 1.4 版。在 IBM i 信息中心 内可以找到图形化 IBM i 调试器的具体软件需求列表。为了成功访问图形化编辑器的帮助文档,您需要将 jhall.jar 文件添加到 CLASSPATH 中。可从 JavaHelp 系统中获得这个 JAR 文件。有关图形化 IBM i 调试器的先决条件和安装的更多具体信息,请参阅 IBM i 信息中心内名为 System i5 Debugger 的书籍

您可以使用以下命令,从 Windows 命令提示符中调用图形化 IBM i 调试器,以便确认安装:java utilities.Debug。结果应类似于图 3 所示的图形化调试器输出。

图 3. 启动 IBM i 系统调试器
启动 IBM i 系统调试器

图形化 IBM i 调试器概述

首先,我们来看看调试器的架构。如图 4 所示,在工作站一端,图形化 IBM i 调试器包含三个组件:Debug Manager、System Debugger 和 OS/400 PASE System Debugger。在 IBM i 一端,图形化调试器依赖于 Debug Hub 和 Debug Server 组件。

图 4. 图形化 IBM i 调试器架构
图 4. 图形化 IBM i 调试器架构

点击查看大图

图 4. 图形化 IBM i 调试器架构

图 4. 图形化 IBM i 调试器架构

Debug Manager 负责使用 Debug Hub 组件注册客户端,以便在 IBM i 上启用图形化调试器。除此之外,它还能添加或删除系统或用户,帮助您调试设置。Debug Manager 提供了一个便捷的界面,方便您在多个不同系统中调试程序时启动调试器。图 5 展示了 Debug Manager 的用户界面。Debug Hub 组件在自己的注册库中存储用户信息。通过存储用户的信息,Debug Hub 就能够在相同的用户发出 STRDBG CL 命令时自动启动图形化 IBM i 调试器。Debug Hub 组件执行的另外一项功能是:在接收到远程工作站发出的请求时调用 Debug Server。例如,在您通过 Debug Manager 或 Windows 命令行启动图形化调试会话时,Debug Hub 会接收到一个请求。随后,Hub 将开始创建对应的 Debug Server 实例,以处理来自调试会话的调试命令。PASE System Debugger 用于 PASE 环境中运行的程序。这种调试器提供与图形化 IBM i 调试器相似的调试功能,还提供了一些 PASE 环境特有的其他功能。有关 PASE 环境的更多信息,请参阅 IBM i 7.1 信息中心 中名为 PASE for IBM i 的图书。图形化 IBM i 调试器可以调试使用 ILE 和非 ILE 语言以及 Java 语言编写的程序。

图 5. Debug Manager
图 5. Debug Manager

图形化 IBM i 调试器实践

本节将通过一个示例程序的调试来展示如何利用图形化 IBM i 调试器。示例 C 语言程序提供了一项简单的功能,即将小写英文字母转为对应的大写字母。该程序在 Windows 环境中可无任何错地运行,成功输出结果,如图 6 中所示。

图 6. 示例程序成功执行时的输出
图 6. 示例程序成功执行时的输出

在 IBM i 上运行相同的 C 语言程序逻辑将会产生如图 7 所示的不正确输出。举例来说,在 IBM i 上运行时,这个 C 语言程序会错误地将小写字母 ‘a’ 转为 ‘/’,将小写字母 ‘z’ 转为 ‘i’。

图 7. 程序在 IBM i 上运行时的不正确输出
图 7. 程序在 IBM i 上运行时的不正确输出

下面我们将使用图形化 IBM i 调试器来找到输出不正确的原因。清单 1 提供了示例程序的源代码供您参考。

清单 1. 示例程序的源代码
//LWR2UPR.c source code.
//This is the sample code used for debugging, which would fail
//when running on IBM i system.

#include <stdio.h>

//Convert a lower case letter to its corresponding upper case letter.
//Return value 0 indicates successful process, otherwise return 1;
int convert2Captial(char* pChar)
{
	//determine if the user's input is legal
 	if((*pChar < 'a') || (*pChar > 'z'))
	{
		printf("Input is error. Pls input a letter between a and z:\n");	
		return 1;
	}
	else
  	{
      	*pChar -= 32;
	 	return 0;
	}
}

int main(void)
{
  	char chInput;	//The letter that user inputs
  	char* pChar;	//Pointer to the letter
	int nRet;		

	printf("Pls input the lower case letter to be converted:\n");
	printf("Input 0 to exit.\n");
	
	//Gets letter from terminal:
  	while ((chInput = getchar()) != '0')
  	{
  		pChar = &chInput;
		if(*pChar != '\n')
		{
			printf("Your input is: %c\n", *pChar);
		}
  		else
		{
			continue;
		}
		
  		if (0 == (nRet = convert2Captial(pChar)))
		{
			printf( "Its upper case is: %c\n", *pChar);
		}
  		else
		{
			continue;
		}
	}
  
	printf("Size of a inteter in byte is: %d\n", sizeof(nRet));
	printf("Size of a char in byte is: %d\n", sizeof(chInput));
	printf("Size of a pointer in byte is: %d\n", sizeof(pChar));
  
	return 0;
}

登录图形化 IBM i 调试器

从图 3 所示的 Debug Manager 界面中,使用您的 IBM i 用户配置文件和密码登录包含要调试的程序的 IBM i 系统,以便启动调试会话。

启动程序调试会话

登录之后,Start Debug 窗格会自动显示,如图 8 所示。如果 Start Debug 面板未自动显示,请按 F4 键,或者从 Debug 下拉菜单中选择 Start 任务。

如下面的面板中所示,您可以使用两种不同的模式调试程序。第一种模式是 Submit and debug program in batch job,用于调试尚未运行的程序。第二种模式是 Debug existing job on system,用于调试已经在目标系统上运行的程序。这种模式更适合成功初始化的程序或者作为服务器运行的程序。

图 8. 指定要调试的程序
图 8. 指定要调试的程序

这个调试示例将使用 Submit and debug program in batch job 模式。下一步是在 Program to debug 部分中填写恰当的内容。这个部分的值对于调试目标程序非常重要。Type 字段有三个可能的值:“Program” 和 “Class File”。“Class File” 值用于 Java 程序,“Program” 值用于使用其他高级语言编写的程序,例如 C、RPG 和 COBOL。如果您选择调试现有作业,则可以使用最后一个值 “Service Program”。IBM i 上的 Service Program 类似于其他平台中的共享库。服务程序不能直接运行,因此仅在使用调试现有作业的模式时,才能使用该值。示例程序是使用 C 语言编写的,因此请为程序类型指定 “Program” 值。

接下来,您需要填写所调试的 IBM i 程序对象的程序名称和库名称。示例程序没有其他参数和初始化命令,因此将其他字段留空即可。Program to debug 部分的最后一个字段是 Standard I/O 字段。这个参数设置程序的输出位置。该字段有两个选项:“Send to spool file” 和 “Redirect to I/O panel”。如果您的程序输出较大,那么最好在这个字段中选择假脱机文件。利用另外一个选项,您可以将程序输出重定向到图形化 IBM i 调试器的 I/O 窗格,本文稍后将讨论相关内容。如果您的程序是交互式的,需要用户输入一些值,则应选择 I/O 窗格选项。此外,这个选项允许您在调试器的 I/O 窗格中轻松检查程序的输出,无需登录 IBM i 即可查看假脱机文件的内容。本例使用了 “Redirect to I/O Panel” 选项。填好所有输入字段之后,即可单击 OK 按钮,开始调试示例代码。

如果需要调试的是现有作业,则必须在 IBM i 上获取该作业的信息,以便填写 Existing job to debug 字段的对应条目。有两种获得作业信息的方法。第一种方法是按下图 8 中所示的 Start Debug 窗口的下半部分中的 Browse 按钮。按下此按钮将打开一个对话框窗口,其中显示了一些过滤器选项,可帮助您查找需要调试的作业。第二种方法是登录 IBM i,输入 wrkactjob 命令,随后向下滚动,找到希望调试的作业。

使用调试器再现问题

图 9 展示了图形化的 IBM i 调试器用户界面。该界面分为 4 个窗口。所调试的程序的源代码显示在右上角的窗口中,即 Source Window。如果该窗口中未显示源代码,那么可能的原因之一是程序对象未包含必要的调试信息。在这种情况下,请使用恰当的调试参数值重新创建程序。其余几个窗口中包含不同的标签。为明确起见,本文将按照标签名而非位置来引用这些窗口。例如,左上角窗口中的 Programs 标签将称为 Programs 窗格

图 9. System Debugger 的界面
图 9. System Debugger 的界面

在调试器中启动此程序时选择了 “Redirect to I/O Panel” 选项,因此所有输入和输出操作都可以在右下角窗口内的 Standard I/O 窗格中执行。您不需要通过模拟器会话与 IBM i 系统交互,而是可以通过图形化调试器界面与程序交互。只需单击 Standard I/O 选项卡,即可访问如图 10 所示的界面窗格。随后,选择顶端工具栏中的绿色三角形 Resume 按钮或者按下 F12 键即可运行程序。稍过一会儿之后,Standard I/O 窗口的 Standard Output 部分会显示一条消息,要求用户输入小写字母。随后,您可以通过 Standard Input 部分输入测试字母,再单击面板旁边的 Go 按钮。

图 10. 图形化调试器的 Standard I/O 窗格
图 10. 图形化调试器的 Standard I/O 窗格

图 11 包含程序调用的输出结果。结果显示,小写字母 “a” 被错误地转为斜杠 “/”,小写字母 “z” 被转为字母 “i”,这与该程序在 IBM i 上运行时生成的输出相同,如图 7 所示。

图 11. 标准输出示例
图 11. 标准输出示例

检查源代码逻辑

现在,我们已经再现了程序错误,下一个步骤就是检查源代码,确定应将调试断点设置在何处。代码的逻辑并不复杂。首先,示例程序接受来自终端的输入字母,如以下代码片段所示。

while ((chInput = getchar()) != '0')

其次,如果用户选择不退出(输入字母不是 “0”),则程序控制权会转交给 convert2Captial 函数,该函数会将字母转为大写字母:

if (0 == (nRet = convert2Captial(pChar)))

随后,在检查输入字母确实是合法的小写字母之后,convert2Captial 函数会根据其 ASCII 代码点将该字母转为对应的大写字母。

最后,从所调用的函数返回主函数,并将结果显示到终端。

添加断点

为了确定输出不正确的原因,请在 Source Window 中右键单击对应的行,选择 Add Breakpoint 任务或直接双击行号的左侧位置,为以下三行代码添加断点。

1) return 0; 2) if(*pChar != '\n') 3) if (0 == (nRet = convert2Captial(pChar)))

此时,调试器屏幕应如图 12 所示。在 Source Window 中,源代码中对应行的旁边显示了两个红色箭头,表示断点与这些代码行相关。如果您需要浏览所有断点,只需单击 Breakpoints 选项卡即可。在这个选项卡中,您将看到有关各断点的有用属性设置,例如断点的条件、线程设置(如果程序是多线程的)以及断点样式。您可以在 Breakpoints 窗口中右键单击节点,选择 Edit Breakpoint…Breakpoint Properties… 来显示对应的设置对话框。在本例中,应该在第 20 行的断点中添加 *pChar !='A' 条件,保证只有在输入小写字母 ‘a’ 并且没有得出正确的结果时停止程序执行。这种条件断点功能在调试过程中为开发人员提供了充分的灵活性。除此之外,您还可以创建不同的断点组,以便更改断点符号颜色。不同的断点颜色有助于在复杂的程序内管理调试不同类型的问题的断点,如图 12 所示。

图 12. 分组的断点
图 12. 分组的断点

有可能在尚未找到程序中的 bug,您就不得不转到其他操作,并关闭调试器。在调试器会话终止时,您设置的所有断点会怎样?幸运的是,调试器会记住所有断点。您只需启动图形化 IBM i 调试器,上一次会话的调试环境中的所有方面都会恢复,包括断点、所监视的变量以及所调试的程序对象。在您下一次启动图形化 IBM i 调试器时,所有这些设置都会自动恢复,这种方法能够很好地提高您在日常工作中的生产率。

检查变量

检查变量值的能力是任何调试器都应该提供的一种最常用的功能。图形化 IBM i 调试器提供了四种不同的界面来检查变量值:Source window、Console 窗格、Locals 窗格和 Monitors 窗格。在 Source window 中查看变量值非常轻松。在 Source window 中,您可以将光标悬停在需要检查的变量上方,也可以突出显示这些变量。这两种操作都能在调试器窗口底端的消息部分或 Source window 的弹出窗口中显示当前变量值。在 Console 窗格中,您可以运行 EVAL 命令,手动显示变量或者表达式的值。Locals 窗格用于监视当前函数内的变量,变量值会自动显示在该窗格的 Value 列中。如果您希望在执行程序逻辑的过程中监视特定变量的值,则必须将需要监视的变量添加到 Monitors 窗格中。在这一部分内容中,您将学习如何在 Monitors 窗格中检查变量。

在示例程序中,需要检查 pChar 变量。在 Monitors 窗格或 Source Window 的任意空白位置右键单击,并从弹出菜单中选择 New Monitor 任务,将 pChar 变量添加到监视队列。执行希望监视的变量 (pChar),如图 13 所示。当程序未在源代码中的某条语句处停止时,禁用 New Monitor 菜单任务。默认情况下,调试器的停止位置是由一条黄色底线标记的,如图 13 所示。

监视变量之后,如果继续调试程序,在程序执行到达第 20 行时,将显示 pChar 的值被转为错误的字符(“a” 转为 “/”),如图 14 所示。

图 13. 在 Monitors 窗格中设置要监视的变量
图 13. 在 Monitors 窗格中设置要监视的变量

在 Monitors 窗格中,有一个对应所有被监视的变量的名为 Watch 的列。如果单击一个变量所在行的 Watch 列来选择监视该变量,那么程序会在执行导致所监视的变量值更改的语句之后自动停止。也就是说,所监视的变量的值如果发生更改,那么该变量将起到断点的作用。定义断点或所监视的变量之后,即可单击工具栏中的 Resume 按钮,运行程序。此时将执行程序,直至调试器遇到设置了断点或所监视的变量发生更改的行。除了这些控制程序执行的选项之外,工具栏还提供了多种不同类型的单步执行选项。

图 14. 在转换 “a” 之前的 Monitors 窗格
图 14. 在转换 “a” 之前的 Monitors 窗格

使用 Memory 窗格

Memory 窗格显示变量或表达式的内存。要查看与一个变量或表达式相关的内存值,您可以在该窗格的 Expression 字段中键入变量名或者表达式。但最简单的方法是在 LocalsMonitors 窗格中右键单击所需变量,并从上下文菜单中选择 Go to Memory 任务,如图 15 所示。Memory 窗格中共有三列输出。第一列是十六进制形式的内存序列号。第二列仅包含十六进制形式的内存内容。第三列称为字符表示区,显示了对应于第二列中十六进制值的字符(如果能够显示),字符两边带括号。您可以通过设置 Bytes per lineBytes,自定义每行显示的字节数,以及显示多少字符的内存。另外一个自定义选项是 Bytes 字段的 “Size of” 设置。该选项使得窗格仅显示分配给特定变量或表达式的内存。

图 15. 在转换大写字母之前的 Memory 窗格
图 15. 在转换大写字母之前的 Memory 窗格

下面我们将检查变量 pChar 的内存,因为这个变量与所转换的字母相关。在本例中,输入小写字母 “a” 时,对应的内存值为 0x81,如图 15 所示。在转换之后,内存将转为 0x61,表示斜杠字符(/),如图 16 所示。为什么会出现这样的情况?检查 ASCII 表之后,字母 “a” 的代码点应为 0x61,而斜杠 "/" 的代码点应为 0x2F。变量的内存值与 ASCII 代码点不一致。您可能会注意到,Memory 窗格中有一个名为 Format 的字段。该字段用于控制使用哪种编码系统将内存值显示为字符串。选项包括 EBCDIC、ASCII、Unicode 和 UTF32。至此,问题已经显而易见。IBM i 操作系统是一种基于 EBCDIC 的操作系统,而非基于 ASCII。以下代码表达式用于将字母转换为对应的大写字母,该表达式不适用于 EBCDIC 代码点:

*pChar -= 32;

在检查 EBCDIC 代码表之后,可确定字母 ‘a’ 的 EBCDIC 代码点为 0x81,而 "/" 的 EBCDIC 代码点为 0x61,这与图 16 所示一致。此外,从小写字母到对应大写字母的 EBCDIC 代码点距为 64,而非 32。因此,我们就确定了示例程序逻辑中的问题所在!

此面板的另外一个要点是可以在调试时更改内存内容。要更改内容,请将光标放置在希望更改内存值的位置,可放在第二列或第三列。随后键入希望使用的新值,并单击 Save 按钮来更改内存,如图 16 所示。

图 16. 更改内存内容
图 16. 更改内存内容

修复代码

至此,我们已经了解到,问题是由不同的编码系统(如 EBCDIC)所导致。应该如何修订代码,才能使之在 Windows、IBM i 和 UNIX 操作系统等不同平台上正常工作?最简单的方法就是更改 convert2Captial 函数的以下代码行中的逻辑:

*pChar -= 32;

更改为如下新逻辑:

*pChar -= ('a' – 'A');

除了这个问题之外,convert2Captial 函数中还存在另外一个问题:

if((*pChar < 'a') || (*pChar > 'z'))

这条语句用于检查输入的字母是否合法。显而易见,在 EBCDIC 代码点表中,从 'a' 到 'z' 的代码点并不是连续的。因此,验证代码逻辑需要做出如下更改:

if((*pChar < 'a')
|| ((*pChar > 'i') && (*pChar < 'j'))
|| ((*pChar > 'r') && (*pChar < 's'))
|| (*pChar > 'z'))

代码修订至此已完成,程序现在可在 IBM i 上成功运行。

图形化 IBM i 编译器的其他功能

可以右键单击 Source Window,然后选择 Change Source View 来更改 Source 视图。Change source view 对话框中的可用选项取决于源代码的编译方式。举例来说,如果您使用 OPTION(*SHOWINC) 创建程序,则对话框中将包括 ILE C include view,如图 17 所示。在希望检查所包含的头文件的内容时,这个视图非常有用。具体来说,在为 IBM i 开发 SQL 嵌入式程序,并使用 DBGVIEW(*SOURCE) 和 COMPILEOPT('option(*showinc)') 对其进行预编译时,Source Window 的可用源代码视图将与图 17 所示的视图相似。SQL Output View 有助于调试 SQL 过程、函数和触发程序(如果使用恰当的调试选项集创建或更改它们)。有关以图形化方式调试 SQL 过程的更多具体信息,请参阅参考资料部分中的对应文章。

如前文所述,您调试的程序可能非常复杂。程序中可能包含众多源代码文件和模块,也可能包含数以千计的源代码行。在此类情况下,您或许很想知道能否轻松跳过庞大的源代码文件中的一行或者找到正确的源代码文件。幸运的是,利用图形化 IBM i 调试器,可通过多种方法实现此类导航:

  • 双击 Call Stack 窗格中的条目,这将按照 Line 列所示导航到不同方法、函数或模块中的当前停止位置。
  • 双击 Breakpoints 窗格中的断点,这将导航到 Source Window 中对应的断点行。
  • 双击程序对象,例如程序、服务程序或 Java 类文件,这将在 Source Window 中打开对应的源文件。
  • 右键单击 Monitors 窗格中的条目,并选择 Go To Source
  • 右键单击 Source Window,并选择 Find…Go To Line…
图 17. Change source view 对话框
图 17. Change source view 对话框

Threads 窗格可用于调试多线程程序。Call Stack 窗格支持轻松显示当前程序的调用堆栈。Console 窗格用于显示系统消息以及在此窗格中执行 IBM i 调试命令。有关所有这些功能的更多详细信息,请参阅图形化 IBM i 调试器的文档。


结束语

本文介绍了用于 IBM i 的两种图形化调试器,此外还对调试器进行了对比,以便帮助开发人员选择最适合自己的调试器。您还了解了如何利用不同的方法安装图形化 IBM i 调试器。最重要的是,您学习了如何利用图形化 IBM i 调试器排除程序故障。


参考资料

下面列出了一些有用的资源,供您在寻找本文中提到的某些具体信息时参考:

  1. IBM i 信息中心内有关 IBM i 调试器 的主题。
  2. 下载文章 图形化调试使得在 i5/OS 上调试过程 SQL 更加轻松
  3. 阅读 developerWorks 中有关 IBM Toolbox for Java and JTOpen 的文章。
  4. 有关 IBM System i Navigator 的简介、安装和使用信息。
  5. 请参阅 IBM i Globalization 网站,获得有关 EBCDIC 的更多信息。
  6. IBM Rational Developer for Power Systems 软件
  7. 下载 JavaHelp jars
  8. IBM developerWorks - IBM i 技术更新
  9. IBM developerWorks 中国 IBM i 专区 专区:提供给 IBM i 用户和开发者的专业技术资源。

条评论

developerWorks: 登录

标有星(*)号的字段是必填字段。


需要一个 IBM ID?
忘记 IBM ID?


忘记密码?
更改您的密码

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件

 


在您首次登录 developerWorks 时,会为您创建一份个人概要。您的个人概要中的信息(您的姓名、国家/地区,以及公司名称)是公开显示的,而且会随着您发布的任何内容一起显示,除非您选择隐藏您的公司名称。您可以随时更新您的 IBM 帐户。

所有提交的信息确保安全。

选择您的昵称



当您初次登录到 developerWorks 时,将会为您创建一份概要信息,您需要指定一个昵称。您的昵称将和您在 developerWorks 发布的内容显示在一起。

昵称长度在 3 至 31 个字符之间。 您的昵称在 developerWorks 社区中必须是唯一的,并且出于隐私保护的原因,不能是您的电子邮件地址。

标有星(*)号的字段是必填字段。

(昵称长度在 3 至 31 个字符之间)

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件.

 


所有提交的信息确保安全。


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=10
Zone=IBM i
ArticleID=781536
ArticleTitle=以图形方式调试 IBM i 程序
publish-date=12192011