EGL 调试器

在工作台中,EGL 调试器允许您进行 EGL 代码调试,而不要求首先生成输出。下列类别有效:
如果您正在开发准备部署在 J2EE 上下文中的批处理程序,则可以使用启动配置来在非 J2EE 上下文中调试程序。尽管设置较为简单,但是需要调整一些值:

下面有一节描述了构建描述符与 EGL 首选项之间进行的交互。

调试器命令

使用下列命令来与 EGL 调试器进行交互:
添加断点
标识一行,处理将在该位置暂停。当代码执行暂停时,您可以检查变量值以及文件和屏幕的状态。

除非除去断点,否则会将断点从一个调试会话记录到下一个调试会话。

不能在空行或注释行上设置断点。

禁用断点
释放断点,但不将其除去。
启用断点
激活先前被禁用的断点。
除去断点
清除断点,以使处理不再自动地在该行暂停。
除去全部断点
清除每个断点。
运行
运行代码,直到下一个断点或者直到运行单元结束为止。(在任何一种情况下,调试器都在主函数中的第一个语句处停止。)
运行至行
运行所有语句,直到(但不包括)指定行上的语句。
单步跳入
运行下一个 EGL 语句并暂停。
以下列表指示了当对特定语句类型发出单步跳入命令时发生的情况:
call
如果被调用程序在 EGL 调试器中运行,则停止在被调用程序的第一个语句处。如果被调用程序在 EGL 调试器外部运行,则停止在当前程序中的下一个语句处。

EGL 调试器将在工作台中的每个项目中搜索接收程序。

converse
等待用户输入。该输入导致处理在下一个运行语句处停止,该语句可能位于验证器函数中。
forward
如果代码前进到 PageHandler,则调试器将等待用户输入并在下一个运行语句处停止,该语句可能位于验证器函数中。

如果代码前进到程序中,则调试器在该程序中的第一个语句处停止。

函数调用
在函数中的第一个语句处停止。
JavaLib.invoke 和相关函数
停止在下一个 Java 语句处,以便可以调试由 Java 访问函数提供的 Java 代码。
show,transfer
在接收控制权的程序的第一个语句处停止。目标程序是在 EGL 调试器中运行的 EGL 源代码,而不是 EGL 生成的代码。

show 语句或具有 transfer to a transaction 格式的 transfer 语句之后,EGL 调试器切换至新程序的构建描述符或者(如果未使用任何此类构建描述符的话)提示用户输入新的构建描述符。新程序可以具有与先前运行的程序不同的属性集。

EGL 调试器将在工作台中的每个项目中搜索接收程序。

单步跳过
运行下一个 EGL 语句并暂停,但不在当前函数所调用的函数中停止。
以下列表指示了当对特定语句类型发出单步跳过命令时发生的情况:
converse
等待用户输入,然后跳过任何验证函数(除非存在有效的断点)。在 converse 语句后面的语句处停止。
forward
如果代码前进到 PageHandler,则调试器将等待用户输入并在下一个运行语句处停止,但是,除非存在有效的断点,否则不在验证器函数中停止。

如果代码前进到程序中,则调试器在该程序中的第一个语句处停止。

show,transfer
在接收控制权的程序的第一个语句处停止。目标程序是在 EGL 调试器中运行的 EGL 源代码,而不是 EGL 生成的代码。

show 语句或具有 transfer to a transaction 格式的 transfer 语句之后,EGL 调试器切换至新程序的构建描述符或者(如果未使用任何此类构建描述符的话)提示用户输入新的构建描述符。新程序可以具有与先前运行的程序不同的属性集。

EGL 调试器将在工作台中的每个项目中搜索接收程序。

单步返回
运行要返回至调用程序或函数所需的语句;然后,在该程序或函数中接收控制权的语句处暂停。

如果在验证器函数中发出单步返回命令,则会导致异常。在该情况下,该行为等同于单步跳入命令的行为,后者主要表示 EGL 调试器运行下一个语句并暂停。

EGL 调试器将下列 EGL 语句视为空运算符:
  • sysLib.audit
  • sysLib.purge
  • sysLib.startTransaction

例如,可以在这些语句处添加断点,但单步跳入命令仅仅是前进到下一个语句,而没有其它作用。

最后,如果对函数中运行的最后一个语句发出单步跳入单步跳过命令(并且,如果该语句不是 returnexit programexit stack),则处理在函数本身中暂停,以便您可以查看该函数的局部变量。在这种情况下,要使调试会话继续,请发出另一个命令。

构建描述符的使用

构建描述符有助于确定调试环境的各个方面。EGL 调试器根据下列规则选择构建描述符:
  • 如果为程序或 PageHandler 指定了调试构建描述符,则 EGL 调试器使用该构建描述符。有关如何建立调试构建描述符的详细信息,请参阅设置缺省构建描述符
  • 如果未指定调试构建描述符,则 EGL 调试器将提示您从构建描述符列表中进行选择或接受 None 值。如果接受 None 值,则 EGL 调试器将构造构建描述符以便在调试会话期间使用;首选项确定了 VisualAge® Generator 兼容性是否起作用。
  • 如果指定 None 或者指定的构建描述符缺少某些必需的数据库连接信息,则 EGL 调试器通过查看首选项来获取连接信息。有关如何设置那些首选项的详细信息,请参阅设置 SQL 数据库连接首选项

如果您正在调试将要在 Java 环境中的文本或批处理应用程序中使用的程序,并且该程序发出一个 transfer 语句,该语句将控制权切换至也将要在 Java 环境中的另一个运行单元中使用的程序,则 EGL 调试器使用对接收程序指定的构建描述符。对构建描述符的选择基于前面描述的规则。

如果您正在调试被另一个程序调用的程序,则 EGL 调试器使用对被调用程序指定的构建描述符。对构建描述符的选择基于上面描述的规则,但是,如果未指定构建描述符,当调用被调用程序时调试器不会提示您输入构建描述符;而是继续使用调用程序的构建描述符。
注: 如果调用程序和被调用程序二者中的一个(而不是全部)利用 VisualAge Generator 兼容性,则必须对它们使用不同的构建描述符。VisualAge 兼容性的生成时状态是由构建描述符选项 VAGCompatibility 的值确定的。

用于调试代码的构建描述符或资源关联部件可能与用于生成代码的构建描述符或资源关联部件不同。

SQL 数据库访问

为了确定用来访问 SQL 数据库的用户标识和密码,EGL 调试器按顺序考虑下列源,直到找到信息或考虑了每个源为止:
  1. 在调试时使用的构建描述符;特别是,构建描述符选项 sqlID 和 sqlPassword。
  2. SQL 首选项页,如设置 SQL 数据库连接首选项中所述;在该页上,也可以指定其它连接信息。
  3. 在连接时显示的交互式对话框。仅当选择了根据需要提示输入 SQL 用户标识和密码复选框时才会显示这样的对话框。

call 语句

如上所述,EGL 调试器通过解释 EGL 源代码来响应 transfershow 语句。然而,EGL 调试器通过查看构建描述符中指定的链接选项部件(如果有的话)来响应 call 语句。如果引用的链接选项部件包含调用的 callLink 元素,则结果如下所示:
  • 如果将 callLink 属性 remoteComType 设置为 DEBUG,则 EGL 调试器解释 EGL 源代码。调试器通过引用 callLink 属性 packagelocation 来查找源。
  • 如果 callLink 属性 remoteComType 未设置为 DEBUG,则调试器将调用 EGL 生成的代码并使用链接选项部件中的信息,就象是调试器正在运行 EGL 生成的 Java 程序一样。
当不存在链接信息时,EGL 调试器通过解释 EGL 源代码来响应 call 语句。在下列情况下,没有链接信息:
  • 未使用构建描述符;或者
  • 使用了构建描述符,但在该构建描述符中未指定链接选项部件;或者
  • 在构建描述符中指定了链接选项部件,但引用的部件不具有引用被调用程序的 callLink 元素。

如果调试器运行 EGL 源代码,则可以通过从调用程序中发出单步跳入命令来运行该程序中的语句。但是,如果调试器调用生成的代码,则调试器运行整个程序;单步跳入命令的工作方式与单步跳过命令相似。

在调试时使用的系统类型

sysVar.systemType 包含系统类型的值。并且,如果请求了与 VisualAge Generator 的开发时兼容性,则 VGLib.getVAGSysType 提供了另一个值。

sysLib.systemType 中的值与构建描述符选项 system 的值相同,但是,在下列两种情况下,值为 DEBUG:
  • 您选择首选项将 systemType 设置为 DEBUG,如设置 EGL 调试器首选项中所述;或者
  • 您指定了 NONE 来作为在调试会话期间要使用的构建描述符,而不考虑该首选项的值。

系统函数 VGLib.getVAGSysType 返回 sysLib.systemType 值的 VisualAge Generator 等效值;有关详细信息,请参阅 VGLib.getVAGSysType 中的表。

EGL 调试器端口

EGL 调试器使用一个端口来建立与 Eclipse 工作台的通信。缺省端口号是 8345。如果另一个应用程序正在使用该端口,或者如果该端口被防火墙阻塞,则设置另一个值,如设置 EGL 调试器首选项中所述。

如果指定了除 8345 以外的值来作为 EGL 调试器端口,并且如果将在 J2EE 服务器上调试 EGL 程序,则必须编辑服务器配置:
  1. 转至“环境”选项卡的“系统属性”部分
  2. 单击“添加”
  3. 对于“名称”,输入 com.ibm.debug.egl.port
  4. 对于“值”,输入新端口号

建议

当您准备使用 EGL 调试器时,请考虑下列建议(这些建议中的绝大部分假定在调试代码时 sysVar.systemType 设置为 DEBUG):
  • 如果正在从数据库中检索日期,但期望运行时代码以不同于 ISO 格式的格式来检索该日期,则请编写一个函数来转换日期,但仅当系统类型为 DEBUG 时才调用该函数。ISO 格式为 yyyy-mm-dd,这是唯一可供调试器使用的格式。
  • 要指定外部 Java 类以便在调试器运行时使用,请修改类路径,如设置 EGL 调试器首选项中所述。可能需要额外的类,以便支持(例如)MQSeries®、JDBC 驱动程序或 Java 访问函数。
  • 当调试已由 JSF(而不是由另一个 EGL 函数)调用的 PageHandler 函数时,使用“运行”来离开该函数,而不是使用“单步跳过”、“单步跳入”或“单步返回”。使用那三个“单步”命令中的任何一个都将转到 PageHandler 的生成的 Java 代码,这在调试 EGL 时没什么用处。如果使用其中一个“单步”命令,请使用“运行”来离开生成的 Java 代码并在浏览器中显示 Web 页面。
  • 如果正在使用 SQL 选项 WITH HOLD(或 EGL 的等效选项),则您需要知道,选项 WITH HOLD 不可用于 EGL 生成的 Java,在 EGL 调试器中也不可用。将落实语句置于只在运行时才被调用的条件语句中,也许可以部分地解决该局限性,如以下示例所示:
      if (systemType not debug)
        sysLib.commit();
      end
      
如果在 J2EE 服务器上调试 EGL 程序,或者通过 EGL 侦听器来调试它,则必须配置服务器或 EGL 侦听器以指示 EGL 调试器端口号:
  • 要配置 J2EE 服务器,请编辑服务器配置:
    1. 转至“环境”选项卡的“系统属性”部分
    2. 单击添加
    3. 对于名称,输入 com.ibm.debug.egl.port
    4. 对于,输入新端口号
  • 要配置 EGL 侦听器,请编辑 EGL 侦听器的启动配置:
    1. 转至“自变量”选项卡
    2. VM 自变量字段中,输入以下内容:
        -Dcom.ibm.debug.egl.port=portNumber
      portNumber
      新端口号

相关概念
与 VisualAge Generator 的兼容性
EGL 调试器的字符编码选项
VSAM 支持

使用条款 | 反馈
(C) Copyright IBM Corporation 2000, 2005. All Rights Reserved.