注意:映射布局 DTD 和样本 XML 映射可在本产品的 plugins/ 目录的 com.ibm.debug.pdt_>version number</mapping_xml/ 中获得。
以下示例定义 zOS 上以下 C 语言结构的布局:
typedef struct { char char_val; unsigned short ushort_val; short short_val; unsigned long ulong_val; long long_val; char string_val[32]; } _test;
创建布局 XML 文件
在 layout.dtd 文档类型定义(DTD)文件中定义了 XML 文件格式,如下所示:
<?xml version="1.0" encoding="ISO-8859-1"?> <!ELEMENT LAYOUT (FIELD)+> <!ATTLIST LAYOUT Header CDATA #REQUIRED length CDATA #REQUIRED> <!ELEMENT FIELD (FIELD)*> <!ATTLIST FIELD Header CDATA #REQUIRED Type (16_BIT_INT|16_BIT_UINT|16_BIT_HINT|32_BIT_INT|32_BIT_UINT|32_BIT_HINT|32_BIT_FLOAT|64_BIT_INT|64_BIT_FLOAT|CHARACTER|HEX|ASCII|EBCDIC|STRUCTURE|PADDING|BIT|BITMASK|MAP) #REQUIRED length CDATA #REQUIRED layout CDATA #IMPLIED>
这意味着 XML 布局文件将首先指定头(标题)和布局的总长度,接着是由头(名称)、长度和基本类型(它用来确定子元素的缺省表示)描述的子元素(字段)的列表。
还具有下列特殊的子元素类型:
用于描述 _test 结构的树形视图并且符合此格式的 XML 文件是:
<?xml version="1.0"?> <!DOCTYPE LAYOUT SYSTEM "Layout.dtd" > <LAYOUT Header = "A Layout" length="17"> <FIELD Header = "char_val" Type = "CHARACTER" length = "1" > </FIELD> <FIELD Header = "ushort_val" Type = "16_BIT_UINT" length = "2" > </FIELD> <FIELD Header = "short_val" Type = "16_BIT_INT" length = "2" > </FIELD> <FIELD Header = "ulong_val" Type = "32_BIT_UINT" length = "4" > </FIELD> <FIELD Header = "long_val" Type = "32_BIT_INT" length = "4" > </FIELD> <FIELD Header = "string_val" Type = "ASCII" length = "32"> </FIELD> </LAYOUT>
注:<!DOCTYPE LAYOUT SYSTEM "Layout.dtd" > 这一行指定使用哪个 DTD 文件来分析此文件的内容。如果 Layout.DTD 文件位于另一位置,则必须指定该位置的完整路径。
定义填充字段
如果您决定忽略 long_val 字段,但是想要在布局中显示 string_val 类型,则 XML 文件将为如下所示:
<FIELD Header = "short_val" Type = "16_BIT_INT" length = "2" > </FIELD> <FIELD Header = "ulong_val" Type = "32_BIT_UINT" length = "4" > </FIELD> <FIELD Header = "" Type = "PADDING" length = "4" > </FIELD> <FIELD Header = "string_val" Type = "ASCII" length = "32"> </FIELD>
定义 PADDING 子元素的最初目的是用于处理字节对齐的结构,但是,它还可以用来跳过不需要在布局中详细说明的数据区。
定义结构
以下 XML 片段说明如何使用 STRUCTURE 字段来映射嵌套结构。结构顶级元素没有相关联的值,可以展开它以显示其子元素。当将 STRUCTURE 字段的长度计入 XML 布局的总大小时,所包括的字段大小只用于显示目的。例如,以下结构将只表示超过了总布局大小 344 个字节。
<FIELD Header = "MACHINE CHECK LOG OUT AREA" Type = "STRUCTURE" length = "344" > <FIELD Header="reserved" Type="HEX" length="16"></FIELD> <FIELD Header="FLCSID" Type="HEX" length="4"></FIELD> <FIELD Header="FLCIOFP" Type="HEX" length="4"></FIELD> <FIELD Header="reserved" Type="HEX" length="20"></FIELD> <FIELD Header="FLCESAR" Type="HEX" length="4"></FIELD> <FIELD Header="FLCCTSA" Type="HEX" length="8"></FIELD> <FIELD Header="FLCCCSA" Type="HEX" length="8"></FIELD> <FIELD Header="FLCMCIC" Type="HEX" length="8"></FIELD> <FIELD Header="reserved" Type="HEX" length="8"></FIELD> <FIELD Header="FLCFSA" Type="HEX" length="4"></FIELD> <FIELD Header="reserved" Type="HEX" length="4"></FIELD> <FIELD Header="FLCFLA" Type="HEX" length="16"></FIELD> <FIELD Header="FLCRV110" Type="HEX" length="16"></FIELD> <FIELD Header="FLCARSAV" Type="STRUCTURE"length="64"> <FIELD Header="AR0" Type="HEX" length="4"></FIELD> <FIELD Header="AR1" Type="HEX" length="4"></FIELD> <FIELD Header="AR2" Type="HEX" length="4"></FIELD> <FIELD Header="AR3" Type="HEX" length="4"></FIELD> <FIELD Header="AR4" Type="HEX" length="4"></FIELD> <FIELD Header="AR5" Type="HEX" length="4"></FIELD> <FIELD Header="AR6" Type="HEX" length="4"></FIELD> <FIELD Header="AR7" Type="HEX" length="4"></FIELD> <FIELD Header="AR8" Type="HEX" length="4"></FIELD> <FIELD Header="AR9" Type="HEX" length="4"></FIELD> <FIELD Header="AR10" Type="HEX" length="4"></FIELD> <FIELD Header="AR11" Type="HEX" length="4"></FIELD> <FIELD Header="AR12" Type="HEX" length="4"></FIELD> <FIELD Header="AR13" Type="HEX" length="4"></FIELD> <FIELD Header="AR14" Type="HEX" length="4"></FIELD> <FIELD Header="AR15" Type="HEX" length="4"></FIELD> </FIELD> <FIELD Header="FLCFPSAV" Type="HEX" length="32"></FIELD> <FIELD Header="" Type="PADDING" length="64"></FIELD> <FIELD Header="" Type="PADDING" length="64"></FIELD> </FIELD>
定义位屏蔽字段
以下 XML 片段是用于描述 BITMASK 字段的一个样本。BITMASK 的长度是以字节为单位指定的,它包含一组 BIT 字段,其长度是以位为单位来指定的。对 BIT 字段显示的偏移是 BITMASK 字段中的位偏移。当将位屏蔽字段的长度计入 XML 布局的总大小时,个别 BIT 字段大小只用于显示目的。
<FIELD Header="byte_field" Type="BITMASK"length="2"> <FIELD Header="hi_byte" Type="BIT" length="8"></FIELD> <FIELD Header="lo_byte" Type="BIT" length="8"></FIELD> </FIELD>
定义嵌套布局
MAP 字段类型以及可选的布局字段允许您描述嵌套布局,如以下 z/OS DSA 布局示例所示:
<?xml version="1.0"?> <!DOCTYPE LAYOUT SYSTEM "Layout.dtd" > <LAYOUT Header = "DSA" length="72"> <FIELD Header = "FLAGS" Type = "HEX" length = "2"></FIELD> <FIELD Header = "junk" Type = "HEX" length = "2"></FIELD> <FIELD Header = "Back Chain" Type = "MAP" length = "4"layout="dsa.xml" ></FIELD> <FIELD Header = "Forward Chain" Type = "MAP" length ="4" layout="dsa.xml" ></FIELD> <FIELD Header = "R14" Type = "HEX" length = "4"></FIELD> <FIELD Header = "R15" Type = "HEX" length = "4"></FIELD> <FIELD Header = "R0" Type = "HEX" length = "4"></FIELD> <FIELD Header = "R1" Type = "HEX" length = "4"></FIELD> <FIELD Header = "R2" Type = "HEX" length = "4"></FIELD> <FIELD Header = "R3" Type = "HEX" length = "4"></FIELD> <FIELD Header = "R4" Type = "HEX" length = "4"></FIELD> <FIELD Header = "R5" Type = "HEX" length = "4"></FIELD> <FIELD Header = "R6" Type = "HEX" length = "4"></FIELD> <FIELD Header = "R7" Type = "HEX" length = "4"></FIELD> <FIELD Header = "R8" Type = "HEX" length = "4"></FIELD> <FIELD Header = "R9" Type = "HEX" length = "4"></FIELD> <FIELD Header = "R10" Type = "HEX" length = "4"></FIELD> <FIELD Header = "R11" Type = "HEX" length = "4"></FIELD> <FIELD Header = "R12" Type = "HEX" length = "4"></FIELD> </LAYOUT>
此格式良好的 XML 布局存储在一个称为 DSA.XML 的文件中。由于您知道字段 3 和 4 包含指向不同 DSA 结构的指针,所以添加两个嵌套的布局定义。
注意:该布局的实际存储器映射实际上是在第一次展开布局元素时执行的,这样可以防止发生递归的布局扩展。