Java 卡 调 试 平 台 设 计 与 实 现 刘 剑 周 晓 光 ( 北 京 邮 电 大 学 自 动 化 学 院 北 京 100876) 摘 要 : 从 Java 语 言 源 代 码 级 调 试 的 一 般 性 原 理 入 手, 经 过 对 Java 卡 调 试 协 议 规 范 和 Java 调 试 规 范 的 深 入 分 析 和 对 Java 虚 拟 机 工 作 原 理 的 了 解, 模 仿 Java 平 台 调 试 体 系 设 计 出 一 个 合 理 的 Java 卡 调 试 平 台 的 设 计 方 案 并 且 文 章 还 给 出 了 设 计 实 现 调 试 软 件 设 计 的 要 点, 包 括 run-to-line 获 取 变 量 值 等 功 能 最 终 的 实 验 测 试 表 明, 该 调 试 设 计 方 案 是 可 行 的 关 键 词 :Java 卡 调 试 规 范 Java 调 试 规 范 Java 虚 拟 机 Java 平 台 调 试 体 系 设 Java 卡 调 试 平 台 The Design And Achievement Of Java Card Debug Platform LiuJian Zhou Xiaoguang (Beijing University of Posts and Telecommunication, Beijing 100876 ) Abstract: The paper deep analyzes Java Card Debug Protocol Specifications and Java Debug wire Protocol and understands the principle of work of Java virtual machine,using Java language,imitating Java Platform Debugger Architecture presents reasonable debugger architecture for Java Card debug tool. Furthermore, the paper also gives the details about the key points involved in the imp lementation of the debugger, including the function of run-to-line watching the values of variables and so on, the results of testing show that this debugger architecture is feasible. Keywords:Java Card Debug Protocol Specification Java Debug Wire Protocol Java Card Vitual Machine Java Platform Debugger Architecture Java Card Debugger Platform 1 引 言 [1] 随 着 Java 卡 地 越 来 越 智 能,Java 卡 的 优 点 越 来 越 被 人 认 可, 应 用 范 围 也 越 来 越 广 泛, 从 而 使 得 越 来 越 多 的 商 家 开 发 生 产 Java 卡 然 而 与 这 相 矛 盾 的 是 :Java 卡 的 开 发 调 试 确 实 一 个 漫 长 而 复 杂 的 过 程, 并 且 目 前 的 JPDA [2] 并 不 适 用 于 JCPDA(Java 卡 平 台 调 试 体 系 ), 因 此 设 计 开 发 一 个 新 的 JCPDA 是 必 要 的 利 用 新 的 JCPDA 解 析 处 理 来 自 Debugger Card 和 Terminal Application 信 息, 完 成 对 java 卡 上 applet [1] 的 调 试 JCPDA 是 一 个 基 于 JDWP [3] (JAVA DEBUG WIRE PROTOCOLS) 1
JCDPS [4] (JAVA CARD DEBUG PROTOCOL SPECIFICATION) 和 SUN_JC2.2.1-VirtualMachine [5] 等 协 议 且 遵 循 GEMCORE V1.1-BASED READER PROTOCOLS [6] 或 TLP224 [6] 协 议 中 规 定 的 命 令 格 式 设 计 开 发 出 的 Java 卡 平 台 调 试 体 系 它 弥 补 了 我 们 无 法 用 直 接 使 用 JVM [7] 调 试 Java Applet 的 不 足, 且 在 此 基 础 上 还 增 加 了 接 收 并 处 理 来 自 Terminal Application(Eclipse Ucard Snooper) 发 送 的 命 令, 并 将 命 令 转 发 给 卡 片 或 JDI(Java Debugger Interface) 2 JCPDA 概 述 JCPDA 主 要 采 用 代 理 模 式 [8], 如 图 1 所 示 在 图 中, 我 们 可 以 清 晰 的 看 出 JCPDA 主 要 有 四 个 功 能 模 块 和 一 个 Agent 四 个 功 能 模 块 分 别 为 MY_JPDA( 与 Debugger 相 互 通 信 模 块 ), 用 于 实 现 Java 卡 调 试 软 件 中 所 需 要 的 JVM 扮 演 的 角 色 的 功 能, 主 要 用 于 管 理 对 Applet 程 序 调 试 的 工 作 ; 与 Terminal Application 相 互 相 应 的 模 块, 即 应 用 代 理, 主 要 用 于 接 收 Java 卡 调 试 人 员 利 用 终 端 应 用 设 备 发 送 过 来 的 命 令, 并 将 命 令 解 析 再 转 发 给 Card Reader 或 Debugger; 解 析 Applet.jar 的 功 能 模 块, 即 jar [5] 包 解 析, 主 要 用 于 获 得 调 试 Java 卡 上 Applet 时 所 必 须 的 关 于 Applet 的 信 息 ; 与 Card Reader 相 互 通 信 的 模 块, 即 MY_JCDI( 我 的 java card 调 试 接 口 ), 主 要 用 于 与 Card 相 互 作 用 实 现 对 卡 片 状 态 或 行 为 的 控 制 Agent 主 要 负 责 整 个 JCPDA 中 模 块 间 的 相 互 协 作, 以 及 在 公 共 变 量 的 管 理 等 工 作 图 1 JCPDA 调 试 体 系 模 型 图 3 设 计 原 理 根 据 Java 卡 调 试 软 件 所 要 实 现 的 功 能 以 及 在 整 个 软 件 架 构 中 所 处 的 位 置, 决 定 采 用 代 理 模 式 的 设 计 模 式 代 理 模 式 是 一 种 结 构 型 设 计 模 式, 一 种 典 型 的 调 试 体 系 结 构, 著 名 的 JPDA(Java 平 台 调 试 体 系 ) 结 构 即 采 用 了 该 模 式 其 中, 调 试 的 目 标 环 境 是 Applet 的 运 行 时 环 境, 即 eclipse 调 试 的 服 务 器 是 JVM, 用 于 执 行 Java [9] 程 序 ( 因 该 调 试 软 件 为 Java 语 言 实 现 的 ); 调 试 客 户 端 是 终 端 应 用, [10] 如 Ucard eclipse 等, 最 终 将 该 调 试 软 件 以 Eclipse 插 件 的 形 式 应 用 在 Eclipse 2
中 4 实 现 细 节 下 面 我 们 将 借 助 一 个 基 于 Eclipse Debug 插 件 中 的 run-to-line 功 能 来 重 点 说 明 JCPDA 四 个 功 能 模 块 的 实 现 及 他 们 之 间 的 相 互 交 互 虽 然 这 只 是 一 个 功 能 实 例, 但 却 几 乎 涉 及 到 了 调 试 软 件 工 作 的 方 方 面 面 4.1 MY_JPDA: 与 (JDI)Debugger 通 信 的 模 块 这 一 模 块 在 整 个 JCPDA 中 功 能 类 似 于 一 个 标 准 的 JPDA 中 的 JVMTI 层 和 JDWP 层 的 功 能, 由 于 我 们 最 终 是 要 将 这 款 调 试 软 件 以 插 件 的 形 式 放 置 到 Eclipse 中, 借 助 于 Eclipse 中 的 Debug 插 件 来 实 现 JDI 角 色 部 分 的 功 能, 所 以 我 们 的 JCPDA 中 的 JDI 层 与 MY_JVMTI 之 间 的 通 信 仍 然 是 基 于 标 准 的 JDWP 协 议, 因 此 我 们 的 JCPDA 中 的 MY_JVMTI 层 要 能 够 实 现 对 JDWP 协 议 的 解 析, 但 和 标 准 的 JDI 层 与 JVMTI 层 基 于 JDWP 协 议 通 信 不 同 的 是, 我 们 对 JDWP 协 议 的 解 析 采 用 单 线 程 按 顺 序 解 析 来 自 JDI 层 的 命 令 ( 即 执 行 完 当 前 命 令 之 前 不 会 接 收 下 一 条 命 令 ) 其 模 型 层 次 如 下 图 所 示 : 图 2 JPDA 模 型 层 次 其 中, 在 实 现 run-to-line 功 能 过 程 中, 这 一 次 主 要 要 完 成 打 断 点 step_run 删 除 断 点 等 命 令 的 任 务 即 Debugger 向 JVMTI 发 送 上 述 三 个 命 令, 但 要 想 完 成 上 述 任 务 还 需 要 与 MY_JCDI 和 jar 包 解 析 模 块 的 帮 助 才 能 真 正 完 成 任 务 4.2 应 用 代 理 : 与 Terminal Application 通 信 的 模 块 这 一 层 我 们 采 用 基 于 TLP-224 协 议 的 通 信 格 式, 调 试 软 件 将 接 收 到 命 令 分 解 为 header 和 data 两 部 分 以 备 响 应 来 自 卡 片 端 IO_RECEIVE_HEADER 和 IO_RECEIVE_BYTES 的 命 令, 当 和 与 (JDI)Debugger 通 信 的 模 块 一 样, 这 一 功 能 模 块 我 们 也 将 采 用 单 线 程 的 方 式 完 成 调 试 软 件 与 Terminal Application 的 相 互 交 互 这 一 模 块 在 实 现 run-to-line 功 能 过 程 中 主 要 完 成 选 中 被 调 试 的 Applet 程 序 的 功 能 4.3 jar 包 解 析 : 解 析 Applet.jar 的 功 能 模 块 3
此 模 块 是 利 用 IO 流 将 Applet.jar 包 根 据 Sun 公 司 关 于 JavaCard 虚 拟 机 规 范 中 关 于 Cap 文 件 格 式 的 部 分, 将 Applet.jar 解 析, 然 后 将 信 息 交 给 Agent 管 理, 以 准 备 我 们 在 调 试 Applet 时 所 须 要 的 信 息 其 中 解 析 Applet.jar 时, 调 试 软 件 主 要 解 析 jar 包 中 的 header.cap 和 debug.cap 两 个 cap 文 件 header.cap 文 件 中 包 含 我 们 需 要 的 packageid, 此 packageid 是 用 于 区 分 Java 卡 上 各 个 Applet 所 在 的 package 且 我 们 利 用 packageid 从 卡 上 获 得 调 试 Applet 时 所 须 要 的 classcomponentid 等 必 需 的 信 息 debug.cap 文 件 包 含 了 调 试 Applet 时 的 几 所 所 有 必 须 的 信 息, 如 Applet 类 的 名 字, 此 Applet 类 在 卡 中 的 相 对 位 置 等, 这 些 都 是 调 试 Applet 时 的 必 须 信 息 在 实 现 run-to-line 功 能 过 程 中, 此 模 块 为 我 们 提 供 了 Applet 的 所 有 必 要 信 息 4.4 MY_JCDI: 与 Card Reader 相 互 通 信 的 模 块 由 于 Java 卡 是 有 状 态 的, 且 其 在 不 同 的 状 态 时, 只 能 接 收 特 定 的 命 令 或 返 回 特 定 的 信 息, 因 此, 我 们 首 先 要 了 解 Java 卡 的 状 态 如 下 图 示 : 图 3 卡 片 状 态 图 图 3 中 / 左 边 的 字 符 表 示 命 令, 右 边 的 为 响 应 由 图 中, 我 们 可 以 看 出 当 卡 片 接 收 到 命 令 或 返 回 响 应 信 息 时 会 改 变 它 的 状 态, 圆 角 方 框 中 字 符 表 示 卡 片 正 在 等 待 来 自 调 试 软 件 的 命 令 时 的 状 态 这 一 功 能 模 块 是 整 个 JCPDA 中 最 重 要 最 关 键 的 一 块, 因 为 我 们 对 JavaCard 调 试 的 整 个 过 程 都 需 要 也 必 须 通 过 这 一 模 块 完 成, 如 对 Applet 程 序 的 某 一 行 打 断 点 查 看 程 序 中 的 某 变 量 值 信 息 以 及 处 理 来 自 Terminal Application 的 命 令 等 功 能 此 模 块 基 于 JCDP, 与 卡 之 间 相 互 发 送 符 合 IOS7816 规 定 的 APDUs(Application Protocol Data Unit 应 用 协 议 数 据 单 元 ) 或 DPDUs(Debugging Protocol Data Unit, 每 个 APDU 可 以 被 分 解 转 换 成 调 试 协 议 数 据 单 元 在 调 试 软 件 与 卡 之 间 交 互, 其 实 DPDU 就 是 APDU, 只 是 在 卡 处 于 调 试 挂 起 状 态 时, 即 图 3 中 的 suspended 状 态, 只 能 接 收 DPDUs), 以 完 成 与 卡 之 间 的 交 互 该 模 块 也 是 采 用 单 线 程 的 模 式 来 解 析 处 理 MY_JCDI 与 卡 片 之 间 的 命 令 的 在 实 现 run-to-line 功 能 过 程 中,MY_JCDI 主 要 完 成 处 理 由 Agent 解 析 的 来 自 JDI 的 命 令, 即 真 正 4
的 在 卡 上 完 成 打 断 点, 运 行 至 断 点 处 取 消 断 点 功 能 图 4 为 实 现 run-to-line 功 能 的 时 序 图, 在 图 中 我 们 可 以 清 晰 的 看 出 在 实 现 这 一 功 能 过 程 中, 调 试 软 件 是 如 何 与 Debugger 和 Card 相 互 交 互, 以 完 成 这 一 任 务 的 图 4 时 序 图 Watch 功 能 Watch 是 查 看 变 量 值 的 一 种 调 试 手 段, 以 下 是 查 看 Applet 中 当 前 对 象 静 态 成 员 的 过 程 的 命 令 组 合, 实 现 该 功 能 主 要 由 JCPDA 中 MY_JPDA 和 jar 包 解 析 两 个 模 块 完 成 jar 包 解 析 模 块, 从 jar 包 获 得 该 静 态 成 员 的 值 并 将 该 值 交 给 Agent 管 理, 而 JCPDA 则 主 要 完 成 与 JDI 之 间 的 交 互 : 图 5 命 令 组 合 图 5 中 我 们 给 出 了 完 成 查 看 功 能 时 JCPDA 与 JDI 之 间 交 互 的 几 个 主 要 命 令, 其 中 步 骤 3 是 由 Agent 直 接 将 从 jar 中 获 得 的 该 静 态 成 员 变 量 的 值 返 回 给 JDI, 但 是 如 果 是 查 看 其 他 非 静 态 变 量 值, 我 们 必 须 还 要 借 助 MY_JCDI 模 块 来 从 卡 上 获 5
取 变 量 值, 此 处 不 再 赘 述 4.5 Eclipse 插 件 最 终 我 们 将 该 调 试 平 台 以 插 件 的 形 式 嵌 入 Eclipse 中, 但 如 何 将 该 平 台 制 作 成 Eclipse 插 件 不 是 本 文 讨 论 的 重 点, 所 以 我 们 将 不 再 赘 述 5 总 结 文 章 给 出 了 Java 卡 平 台 调 试 体 系 的 设 计 过 程 和 实 施 过 程 中 的 关 键 细 节, 是 调 试 体 系 规 范 制 定 和 调 试 平 台 实 施 的 一 个 参 考 这 个 研 究 方 法 也 适 用 于 所 有 的 Java 系 列 平 台, 对 于 其 他 语 言 的 调 试 体 系 研 究 也 有 很 大 的 参 考 价 值 笔 者 的 实 践 证 实 了 方 案 是 可 行 的 参 考 文 献 [1] 张 大 伟 Java 智 能 卡 原 理 与 应 用 开 发 [Z]. 北 京. 电 子 工 业 出 版 社. 2008 年 5 月 [2] 邱 小 侠, 吕 晶. JPDA 体 系 概 览 [Z]. http://www.ibm.com/developerworks/cn/java/j-lo-jpda1/?s_tact=105agx52&s_cmp=te c-csdn[eb/ol]. 2008-09-03 [3] Sun Microsystems, Inc. Java TM Debug Wire Protocol[EB/OL]. http://java.sun.com/j2se/1.3/docs/guide/jpda/jdwp-spec.html.2009-03-01 [4] Alexandre Frey. Java Card Debug Protocol Specification[Z]. 2001-09 [5] Sun Microsystems, Inc. Java Card TM Specification[Z]. Sun Microsystems, Inc.2003. [6] GEMPLUS.GemCore V1.10-Based Reader Reference Manual[Z]. GEMPLUS.1999 [7] JVM. http://baike.baidu.com/view/374952.htm[eb/ol]. 2009-07 [8] 阎 宏. Java 与 模 式 [Z]. 电 子 工 业 出 版 社. 2007-03. [9] Bruce Eckel. Java 编 程 思 想 [Z]. 机 械 工 业 出 版 社. 2007.06 [10] Eric Clayberg, DanRubel. Eclipse 插 件 开 发 [Z]. 人 民 邮 电 出 版 社. 2006-10 6