如何使用 IBM i System Debugger 调试 Java 程序

调试在 IBM i 上运行的 Java 程序有很多种选择,其中最为方便有效的是使用 IBM i 提供的 IBM i System Debugger。本文主要站在使用者的角度介绍如何在 IBM i 上使用 IBM i System Debugger 调试 Java 程序,为在 IBM i 上开发及调试 Java 程序的用户提供了较为详细的使用指南。保证了用户在 IBM i 上可以开发出更优质高效的 Java 程序。

李 琰, 软件工程师, IBM

李琰,来自 IBM 中国系统与科技研发中心 IBM i System Debugger 团队,目前主要负责 IBM i 上 Debugger 的开发与测试工作 o



2011 年 11 月 17 日

如何使用 IBM i System Debugger 调试 Java 程序

当在 IBM i 上使用 Java 时,您可以使用 Qshell Interpreter 或者 CL 命令提供的 Java tools,在 Qshell 环境和 IBM i 环境上进行与 Java 开发有关的操作。本文主要介绍如何在 IBM i 上调试 Java 程序,对于在 IBM i 开发 Java 程序的其他环节不在此介绍。

调试在 IBM i 上运行的 Java 程序有很多种选择,其中最为方便有效的是使用 IBM i 提供的 IBM i System Debugger。IBM i System Debugger 提供了两种调试方式,在绿屏上直接使用 CL 命令行调试和使用图形化交互式人机界面调试(以下简称,IBM i System Debugger GUI)。本文主要站在使用者的角度介绍这两种调试方法。

调试前的准备工作

首先为了能够调试 IBM i 的 Java Job ,JVM 必须被启动。它是是伴随调试功能的启动而启动的,调试引擎则负责 Java 程序的调试管理。当 JVM 启动时调试引擎运行,这是成功调试 Java 代码的关键所在。一旦 JVM 成功启动了调试引擎,Java Job 就可使用绿屏上的 CL 命令去调试,或者使用 IBM i System Debugger GUI 调试。在 IBM i 上使用调试命令时,只要我们设定了和调试有关的参数即可自动启动调试引擎,例如 OPTION(*DEBUG)、-g,不用特别设定和启动调试引擎有关的参数。

其次在调试 Java 程序之前要对 Java 源程序进行编译,这是任何程序被 CPU 执行前必须做的动作,目的是将源代码编译成机器可以识别的机器码。编译可调式的 Java 程序时,编译命令中一定要设定 Debug View 参数,这样 debugger 运行可执行程序时就会显示出当前执行指令对应的源代码,可以查看程序中定义的变量所对应的存储空间等。针对 Java 程序可被调试的编译,过程如下。

  1. 输入 CL 命令 ' MD DIR (java) '

    创建 IFS 下的 /java 目录,目的是把 IBM i 上要调试的 Java 源程序都放在 IFS 下的

    /java 目录下,进行之后的编译。

  2. 输入 CL 命令 ' qsh '

    进入 Qshell,如图 1 所示,java 即为 a) 创建的 java 目录,在此目录下存放将要进行编译的 Java 源程序。

    图 1. 进入 QSH Command Entry
    图 1. 进入 QSH Command Entry
  3. 输入 QSH 命令 ' cd /java ',输入 QSH 命令 ' javac -g sleep.java '

    进入 java 目录下使用 javac 编译产生出可调试的 sleep.class ,其中参数 -g 不可或缺,就是之前提到的产生 Debug View 参数的 DEBUG option。在此建议把源代码文件 .java 文件和编译产生的 .class 文件放在 IBM i 同一个目录下,这样便于 debugger 查找文件,如图 2 所示。

    图 2. java 目录下的文件
    图 2. java 目录下的文件
  4. Press F3 (Exit) 退出 Qshell,输入 CL 命令 ' wrklnk java ' 确认查看 sleep.class 是否成功产生。

IBM i 上两种 Java 程序的调试方法

方法一,在 IBM i 绿屏上使用 CL 命令调试 Java 程序

  1. 输入 CL 命令 ' addenvvar envvar('CLASSPATH') VALUE('/java') '

    设置环境变量 CLASSPATH 为 /java,即 Java 的 .class 文件存放在此目录下。

  2. 输入 CL 命令 'JAVA CLASS(sleep) OPTION(*DEBUG)'

    使用 CL 命令 JAVA,CLASS(sleep) 中的 sleep 为要调试的 Java 程序的名字。其中设定

    参数 OPTION(*DEBUG) 来启动系统调试器执行 Java 程序。这里特别注意,只能调试一个 .class 文件,如果有一个 JAR 文件的文件名做为参数 CLASS 的关键字去调试,OPTION(*DEBUG) 参数是不被支持的。

    图 3. 进入调试模式并显示被调试的 Java 程序的源代码
    图 3. 进入调试模式并显示被调试的 Java 程序的源代码
  3. 利用 IBM i System Debugger 提供的相关调试操作,如 Press F6 设置或清除断点、F10 单步执行程序、F11 操作变量、跟踪查看、F12(Resume) 继续执行等等。调试过程与在 IBM i 上调试其他程序一样,部分相关的调试操作介绍如下。
    • 设置断点

      可以把光标移至要设定断点的指令行处,Press F6 设置断点或者直接输入调试指令

      'Break + 行号' 在调试指令行上(参考图 4)。

      图 4. 设置断点 Debug . . . Break 13
      图 4. 设置断点 Debug . . . Break 13
    • 单步调试

      Java 程序在调试过程中可以在程序运行停止的开始位置或者程序运行停止的断点位置

      使用 step(F10) 单步执行程序,包括对程序调用的任何 function 的 step over 和 step

      Into (F22) 的执行。如果继续执行程序,Press F12(Resume)(参考图 5)。

      图 5. 从指令 13 行断点处 F10 Step 执行到 14 行。
      图 5. 从指令 13 行断点处 F10 Step 执行到 14 行。
    • 变量求值

      在程序调试运行过程中有两种方式可以查看变量的值:

      1. 在调试命令行上 Enter 'EVAL + 变量名';
      2. 把光标移至代码显示的变量名位置出,Press F11(Display variable);

      另外也可以通过 EVAL 命令改变变量的内容,在这里不做介绍。

      图 6. 查看变量值 Debug . . . eval mSecs
      图 6. 查看变量值 Debug . . . eval mSecs
      图 7. 范例程序 sleep.java 调试后的运行输出结果,即在屏幕上打印“Sleep now for 1 Minute...”。
      图 7. 范例程序 sleep.java 调试后的运行输出结果,即在屏幕上打印“Sleep now for 1 Minute...”。
  4. Press F14 (Work with Module List).

    您可以在此调试一个 Java 程序同时增加调试其他程序,提供了在 IBM i 上同时调试多个程序的方式(参考图 8)。

    图 8. Work with Module List
    图 8. Work with Module List

调试步骤如下:

  1. 当调试 Java 程序时,进入了调试模式显示调试程序的代码,此时 Press F14 (Work with Module List);
  2. 选择 Opt 1(Add program) 增加要调试的 SRVPGM、PGM 或 CLASS;
  3. 选择 Opt 5(Display module source) 显示要调试的 *MODULE 的代码;
  4. 按照正常调试程序的方法调试新增显示的 *MODULE 代码;
  5. 调试运行结束 Press F3 返回 Command Line。

方法二,使用 IBM i System Debugger GUI 去调试 IBM i 上的 Java 程序

IBM i System Debugger GUI 为用户提供一个更为简单、直观的交互式图形界面的调试方式,方便 IBM i 用户的使用。对于 IBM i System Debugger GUI 安装,需要到 IBM i 下的 IFS 里下载相应的 JAR 文件,具体步骤如下:

  1. 在本地 PC 上建立新的文件夹 E:\DebuggerGUI;
  2. 在 IFS 里进到 /QIBM/ProdData/HTTP/Public/JT400/Lib,下载 jt400.jar 和 tes.jar 文件到本地 PC 新建的文件夹目录下 E:\DebuggerGUI;
  3. 进入 http://javahelp.java.net/,下载 javahelp2_0_05.zip 文件;
  4. 在下载的 .zip 文件里,我们可以找到一个 jh2.0/javahelp/lib 的目录。复制这个目录下的 jhall.jar 文件到本地目录 E:\DebuggerGUI 文件夹下;
  5. 在桌面上点右键选择 New|Shortcut,建立 IBM i System Debugger GUI 的快捷方式显示(参见图 9);
    图 9. 建立桌面快捷方式
    图 9. 建立桌面快捷方式
  6. 输入以下项目内容,javaw -cp jhall.jar;jt400.jar;tes.jar utilities.DebugMgr 在空白处,Press Next;
  7. 输入新建的快捷方式名字,如 iDebugger,Press OK,在桌面上产生一个新的 icon。
  8. 在产生的新的 icon 上,点右键选择 Properties,在 shortcut tab 下的' Start in:'内填入文件夹目录,Press “OK”按键(参考图 10)。
    图 10. 快捷方式属性设置
    图 10. 快捷方式属性设置

至此,IBM i System Debugger GUI 安装完成,只要双击桌面上的 iDebugger 图标,即可使用 IBM i System Debugger GUI 调试 Java 程序。具体调试步骤如下:

  1. 双击桌面上的 iDebugger 图标,首先开启的是 Debug Manager。Debug Manager 是 IBM i System Debugger GUI 连接到需要调试 java 程序的 IBM i 机器的一个管理工具,如图 11 所示。
    图 11. Debug Manager Window
    图 11. Debug Manager Window

    如图 11 所示我们可以单击 Add System 按键来增加希望连接到的任意 IBM i 系统,只要在建立新系统时,输入您在该系统上所拥有的 User ID 和 password。我们通过 Debug Manager 移除系统、新增或移除使用者等在这里不做过多介绍。Debug Manager 有提供两个主要基本功能:

    1. 可以方便的开启含有被调试程序的 IBM i 机器,通过包含所有产生调试功能的机器列表前的' Debug '选项。
    2. 可以通过使用绿屏上的 CL 命令' STRDBG ',在 IBM i System Debugger GUI 上注册要调试的程序。也就是说,只要 Debug Manager 与含有被调试程序的机器建立了连接,即 Status 为 Ready,在绿屏上输入 CL 命令' STRDBG '后会产生 IBM i System Debugger GUI 方式从而替代了传统的绿屏调试方式。
  2. 启动 Start Debug, 通过 System Debug Manager 提供的 Start Debug ... 注册要调试的 Java 程序并启动。进入 System Debug 界面,用户可以为所调试的程序选择调试方法、输入特殊的调试参数。Star Debug 注册界面设置如图 12 所示。
    图 12. Star Debug 注册界面
    图 12. Star Debug 注册界面

    因为本次调试过程是用户主导控制用户程序的调试开启,所以在选择调试方法时选择 Submit and debug program in batch job。另外被调试 Java 程序相关参数如 Type、Class name、Classpath 设定如图所示,和在 IBM i 上的 Java 程序编译生成的 .class 文件的相关参数是对应的。

  3. Press “OK” 按键,立即启动系统调试窗口。如图 13 所示,调试窗口会显示出被调试程序的源代码,被调试程序的相关注册信息如 Program、Job、System、User 等。
    图 13. 系统调试窗口
    图 13. 系统调试窗口
  4. 在 IBM i System Debugger GUI 的系统调试窗口可以像在绿屏下一样的执行各种调试操作,而且更加的简单直观。IBM i 的 IBM i System Debugger GUI 和大部分 Debugger 功能基本相近,并且操作简单。如设置断点、单步运行、操作变量值、跟踪查看栈调用和进程等等。图 14 为正在调试的 Java 程序,红色箭头标示出断点位置,黄色标示出的指令为当前执行指令,同时调试界面还提供了变量和指针地址的显示,Call Stack 的信息、Threads 信息等。
    图 14. IBM i System Debugger GUI 调试的 Java 程序
    图 14. IBM i System Debugger GUI 调试的 Java 程序
    图 15. Press Resume 后,Sleep 执行到断点所指的指令行 (Line No. 13),停止运行。
    图 15. Press Resume 后,Sleep 执行到断点所指的指令行 (Line No. 13),停止运行。
    图 16. sleep 执行到断点处的 Call Stack 信息、Threads 信息
    图 16. sleep 执行到断点处的 Call Stack 信息、Threads 信息-1
    图 16. sleep 执行到断点处的 Call Stack 信息、Threads 信息-2
    图 17. Step into 执行到光标所指的指令处 (Line No. 7)
    图 17. Step into 执行到光标所指的指令处 (Line No. 7)
    图 18. 查看此时变量 mSecs 的值
    图 18. 查看此时变量 mSecs 的值

    从断点位置指令 13,单步调试到指令 7,查看此时变量 mSecs 的值,也可以把光标移到 mSecs 处查看。可以看出此时 mSecs = 600,即 sleep(600) 实参附值给 mSecs。

    图 19. sleep 执行完毕输出的答应结果
    图 19. sleep 执行完毕输出的答应结果

总结

以上对如何使用 IBM i System Debugger 调试 Java 程序给予了详细的介绍,仅供使用者参考。IBM i System Debugger 为在 IBM i 开发 Java 程序的用户提供了很好的调试工具,保证了用户在 IBM i 上可以开发出更优质高效的 JAVA 程序。

参考资料

学习

获得产品和技术

讨论

条评论

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, Java technology
ArticleID=775308
ArticleTitle=如何使用 IBM i System Debugger 调试 Java 程序
publish-date=11172011