Лоуренс (Ларри) Ингланд, старший технический сотрудник, IBM Манчала Викрам, инженер-разработчик, IBM
IBM Rational Developer for System z V7.1 (в дальнейшем Developer for z) - интегрированная среда разработки на платформе Eclipse, позволяющая программистам работать с приложениями и ресурсами непосредственно на z/OS. Перспектива Debugging среды Developer for z позволяет оптимальным образом использовать средства отладки Debug Tool for z/OS V8.1 и Debug Tool Utilities and Advanced Functions V8.1.
Debug Tool и Debug Tool Utilities and Advanced Functions - дополнительные продукты, позволяющие отлаживать программы на COBOL, PL/I, C, C++ и High Level Assembler (HLASM). Символьная информация, доступная в перспективе отладки включает в себя имена точек входа и переменных, метки и регистры, включая регистры общего назначения и регистры с плавающей точкой.
Для работы с символьной информацией HLASM-приложения, Debug Tool Utilities and Advanced Functions включает в себя специальную утилиту для генерации мета-данных приложения на HLASM, поддерживаемом в языковой среде LE. Для символьной отладки программы от вас не потребуется знание формата мета-данных. В статье приводится пример того, как организовать символьную отладку HLASM-приложения. В качестве примера используется простая программа на ассемблера, код которой можно скачатьниже.
Инструкции, приведенные в статье, предполагают, что вы являетесь зарегистрированным пользователем с корректным идентификатором userid в системе z/OS, на которой и будет работать ваша программа. Конфигурация Developer for z должна быть правильно настроена для удаленной работы на z/OS. После того как вы настроили Developer for z для удаленной работы с z/OS и прошли идентификацию в системе, используя свой уникальный userid и пароль, панель вида Remote Systems будет выглядеть примерно так:
Рисунок 1. Панель вида Remote Systems с идентификационными настройками
Краткое описание шагов
Для символической отладки приложения на LE HLASM в среде Developer for z необходимо выполнить следующие шаги (подробное описание каждого пункта приводится ниже):
- Настройка JCL процедуры, которая включает в себя шаг генерации мета-данных для Debug Tool.
- Создание MVS-проекта и подпроекта с указанием JCL процедуры и ее соответствующих настроек.
- Создание программы на ассемблере.
- Построение приложения.
- Запуск приложения в режиме отладки.
- Использование символьной информации, содержащейся в вашем HLASM-приложении.
Настройка JCL процедуры ELAXFADT
Для отладки приложения на HLASM, поддерживаемом в среде LE, вам необходимо создать файл мета-данных, который содержит информацию о символах, используемых в ассемблерной программе. Эта информация хранится в специальном формате и используется Debug Tool для отладки приложения. Файл мета-данных также известен как IDILANGX или EQALANGX файл. Это библиотечный набор данных (Partitioned dataset - PDS) с форматом записи RECFM=VB
и длиной LRECL=1562
.
Пакет Debug Tool Utilities and Advanced Functions включает в себя специальную утилиту для генерации IDILANGX файла из ADATA файла, сгенерированного HLASM при ассемблировании приложения. Для запуска отладочной утилиты EQALANGX воспользуйтесь JCL-процедурой ELAXFADT, которая включена в дистрибуцию Developer for z и должна быть установлена вашим системным администратором (см. листинг 1).
Листинг 1. JCL процедура ELAXFADT для ассемблирования HLASM кода и генерации мета-данных, содержащих отладочную информацию
//ASMDEBUG PROC LNGPRFX='D94PP.HLASM'
//ASM EXEC PGM=ASMA90,REGION=2048K,
// PARM=('TEST',
// 'ADATA',
// 'SYSPARM(MVS)',
// 'LIST')
//STEPLIB DD DSN=&LNGPRFX..LINKLIB,DISP=SHR
//SYSPRINT DD SYSOUT=*
//SYSLIN DD DUMMY
//SYSUT1 DD UNIT=SYSALLDA,SPACE=(CYL,(1,1))
//SYSUT2 DD UNIT=SYSALLDA,SPACE=(CYL,(1,1))
//SYSUT3 DD UNIT=SYSALLDA,SPACE=(CYL,(1,1))
//SYSUT4 DD UNIT=SYSALLDA,SPACE=(CYL,(1,1))
//SYSUT5 DD UNIT=SYSALLDA,SPACE=(CYL,(1,1))
//SYSUT6 DD UNIT=SYSALLDA,SPACE=(CYL,(1,1))
//SYSUT7 DD UNIT=SYSALLDA,SPACE=(CYL,(1,1))
//*
//SYSTERM DD SYSOUT=*
//SYSADATA DD DSNAME=&ADATADS(&MEM),DISP=SHR
//XTRACT EXEC PGM=EQALANGX,REGION=32M,
// PARM='&MEM (ASM ERROR OFT IDILANGX FAULT'
//SYSADATA DD DSNAME=&ADATADS(&MEM),DISP=SHR
//IDILANGX DD DSNAME=&LANGXDS(&MEM),DISP=SHR
|
Системному администратору, возможно, придется слегка модифицировать JCL процедуру, приведенную в листинге 1, для корректной работы на вашей системе z/OS. Например, значение LNGPREX в листинге может не соответствовать вашей установке. Убедитесь, что все параметры, используемые ассемблером (такие как ADATA
и TEST
), корректно определены.
JCL процедура использует следующие переменные:
ADATADS
- указывает на набор данных ADATA
, содержащих информацию HLASM ADATA. JCL процедура предполагает, что такой набор уже создан и является библиотечным набором данных фиксированной длины PDS/E с параметрами RECFM=VB
and LRECL=8188
.
LANGXDS
определяет набор для хранения специальным образом отформатированных мета-данных, которые Debug Tool использует при отладке приложения. JCL процедура также считает, что такой набор уже создан и является библиотечным набором данных фиксированной длины PDS/E с параметрами RECFM=VB
and LRECL=1562
. По умолчанию имя этого набора данных задается в формате <userid>.EQALANGX
. Если вы хотите использовать другой формат имени, вам потребуется создать DDNAME EQADEBUG
для ссылки на набор данных EQALANGX PDS/E
во время отладки приложения.
MEM
- определяет имя раздела для наборов данных ADATA
и EQALANGX
.
Создание проекта и подпроекта
В среде разработки Developer for z:
- Создайте проект и подпроект. В нашем примере они названы
PLEX4Bhlasm
и HLASMDebug
соответственно.
- Укажите вызов процедуры ELAXFADT в параметрах ассемблера и определите значения переменных, используемых в процедуре. Для этого отредактируйте шаг
ASM
и укажите имя JCL процедуры ELAXFADT
как показано на следующем рисунке.
Рисунок 2. Определение JCL процедуры для генерации отладочных мета-данных.
-
В окне настроек ассемблера Assembler Settings откройте закладку JCL Substitutions и убедитесь, что ваши настройки соответствуют настройкам примера, показанным на рисунке 3.
Рисунок 3. Проверка значений переменных JCL процедуры
Использование MEM
в качестве глобальной переменной очень удобно в случае, если в проект включены несколько HLASM файлов, так как в этом случае имя раздела в файле исходного кода проекта используется как переменная подстановки для каждого запуска JCL процедуры.
- Убедитесь, что поле Application Entry Point указывает на точку входа для HLASM ассемблера.
Рисунок 4.
Создание программы на ассемблере
Теперь нам нужно создать исходный код приложения в системе z/OS. Для написания кода воспользуемся возможностями Developer for z:
- Создайте набор данных для нашей программы. В панели вида Remote Systems щелкните правой кнопкой мышки на MVS Files. В контекстном меню выберите опцию Allocate PDS.
- В окне мастера создания PDS укажите имя набора данных. В нашем примере это
ENGLAND.SOURCE.ASSEMBLE
. Убедитесь, что значение крайнего справа параметра соответствует ASSEMBLE
. Нажмите Next.
- Выберите опцию Specify characteristics by usage type, укажите значения SOURCE и ASM.
- Нажмите Finish.
- Распакуйте архив с кодом приложения на вашей локальной системе Microsoft Windows. В панели вида Remote Systems раскройте папку Local. В дереве локальной файловой системы найдите исходный файл нашего приложения и щелкните на нем правой кнопкой мышки. В контекстном меню выберите команду Copy.
- Чтобы перенести ассемблерный код с вашей системы Windows на удаленную систему z/OS, в панели вида Remote System найдите в дереве системы z/OS созданный ранее PDS, щелкните на нем правой кнопкой мышки, и в открывшемся контекстом меню выберите команду Paste.
- Добавьте файл в подпроект, свойства которого мы определили ранее. Для этого разверните только что созданный PDS, найдите исходный файл, который вы скопировали и вставили в этот набор данных, выделите имя раздела PDS и перетащите его мышкой из панели вида Remote Systems в подпроект (в нашем примере это HLASMDebug).
Ассемблерный код приложения приведен в листинге 2. Архив, содержащий файл с исходным кодом, можно скачать ниже.
Листинг 2. Исходный код приложения на LE-ассемблере
DBGMAIN CEEENTRY PPA=MAINPPA,AUTO=WORKSIZE,MAIN=YES
USING WORKAREA,R13
*
LA R2,STRT_MSG
LA R3,DEST
LA R4,FBCODE
STM R2,R4,PLIST
LA R1,PLIST
L R15,MOUT
BALR R14,R15
*
PACK PCKA,ZNA
PACK PCKB,ZNB
PACK PCKC,ZNC
ZAP PCKSUM,PCKA
AP PCKSUM,PCKB
AP PCKSUM,PCKC
MVC OUTSUM,SUMMSK
ED OUTSUM,PCKSUM
MVC SUMMSG+1(8),OUTSUM
MVC LINE_ST,SUMMSG
*
LA R2,LINE_MSG
LA R3,DEST
LA R4,FBCODE
STM R2,R4,PLIST
LA R1,PLIST
L R15,MOUT
BALR R14,R15
*
LA R2,DONE_MSG
LA R3,DEST
LA R4,FBCODE
STM R2,R4,PLIST
LA R1,PLIST
L R15,MOUT
BALR R14,R15
*
CEETERM RC=0
* ==============================================================
* Constants and Variables
* ==============================================================
ZLEN EQU 5
PLEN EQU ZLEN/2+1
*
SUMMSG DC C'(xxxxxxxx) -- The sum '
SUMMSK DC X'4020202020202120'
ZNA DC ZL5'100'
ZNB DC ZL5'150'
ZNC DC ZL5'50'
*
PCKA DS PL(PLEN)
PCKB DS PL(PLEN)
PCKC DS PL(PLEN)
PCKSUM DS PL(PLEN+1)
OUTSUM DS CL(L'SUMMSK)
*
MOUT DC V(CEEMOUT) The CEL Message service
*
LINE_MSG DS 0F
DC AL2(LINE_END-LINE_ST)
LINE_ST DS CL25
LINE_END EQU *
*
STRT_MSG DS 0F
DC AL2(STRT_END-STRT_ST)
STRT_ST DC C'Starting the program.'
STRT_END EQU *
*
DONE_MSG DS 0F
DC AL2(DONE_END-DONE_ST)
DONE_ST DC C'Terminating the program.'
DONE_END EQU *
*
DEST DC F'2' The destination is the MSGFILE
*
MAINPPA CEEPPA
* ===================================================================
* The Workarea and DSA
* ===================================================================
WORKAREA DSECT
ORG *+CEEDSASZ
PLIST DS 0D
PARM1 DS A
PARM2 DS A
PARM3 DS A
PARM4 DS A
PARM5 DS A
*
FBCODE DS 3F
*
DS 0D
WORKSIZE EQU *-WORKAREA
CEEDSA Mapping of the Dynamic Save Area
CEECAA Mapping of the Common Anchor Area
*
R0 EQU 0
R1 EQU 1
R2 EQU 2
R3 EQU 3
R4 EQU 4
R5 EQU 5
R6 EQU 6
R7 EQU 7
R8 EQU 8
R9 EQU 9
R10 EQU 10
R11 EQU 11
R12 EQU 12
R13 EQU 13
R14 EQU 14
R15 EQU 15
END DBGMAIN Nominate DBGMAIN as the entry point
|
Сборка приложения
Для построения приложения выполните следующие шаги:
- Убедитесь, что все наборы данных, указанные в свойствах проекта, созданы. Эти наборы данных используются в JCL процедуре, отвечающей за сборку приложения.
- Выделите имя подпроекта (в нашем примере это HLASMDebug), щелкните на нем правой кнопкой мышки. В контекстном меню выберите команду Rebuild Subproject.
- Проверьте вывод JES, чтобы убедится, что приложение построилось без ошибок. Для того чтобы открыть вывод JES в окне редактора, дважды щелкните на задании.
- Если вывод JES содержит ошибки, исправьте их и перестройте приложение.
Если сборка приложения прошла успешно, в проект добавится имя раздела загрузочного модуля. В примере это ENGLAND.EXEC.LOAD(DBGMAIN).
Важно: Developer for z искусственно добавляет расширение .exe
к имени модуля. На самом деле это расширение не является частью имени модуля.
Рисунок 5. Так выглядит проект в результате успешной сборки приложения
Запуск приложения в режиме отладки
Для запуска приложения выполните следующие действия:
- В подпроекте выделите выполняемый модуль
ENGLAND.EXEC.LOAD(DBGMAIN).exe
.
- Щелкните правой кнопкой мышки на имени модуля, в контекстном меню выберите команду Debug Application.
- Для отладки приложения автоматически откроется перспектива Debug. Если в параметрах настройки Developer for z автоматическое переключение в другую перспективу без согласия пользователя запрещено, Developer for z выведет на экран запрос о переключение. Нажмите Yes чтобы открыть перспективу Debug.
Загрузка отладочной информации
Теперь вам необходимо загрузить информацию о символьных данных вашего HLASM приложения. Воспользуйтесь командой LoadDebugData (ldd
) для загрузки мета-данных для Debug Tool.
Убедитесь, что в перспективе Debug открыта панель вида Debug Console. Если такой панели нет, выполните следующие шаги, чтобы открыть ее:
- Щелкните на кнопке Windows главного меню. В открывшемся списке выберите пункт Show View.
- Щелкните на пункте Other.
- В списке панелей вида выберите Debug Console и откройте эту панель. Команда LoadDebugData (
ldd
) загрузит мета-данные для текущей отладочной сессии.
- Введите команду
ldd dbgmain
, где dbgmain
- имя раздела набора данных EQALANGX, который мы указали в свойствах проекта и создали во время построения приложения. Пример команды показан на рисунке 6.
Рисунок 6. Команда ldd dbgmain
Если при генерации отладочных мета-данных вы использовали формат имени, отличный от <userid>.EQALANGX
, то вам следует указать JCL процедуре, предназначенной для выполнения HLASM приложения, новое имя набора данных, воспользовавшись инструкцией DDNAME EQADEBUG. Это можно сделать в панели определения параметров выполнения приложения как показано на рисунке 7.
Рисунок 7. Установка параметров выполнения приложения
Теперь при запуске приложения в режиме отладке вы можете пошагово выполнить приложение, назначать точки останова, отслеживать значения переменных, просматривать и изменять (осторожно!) содержимое регистров и использовать другие возможности Debug Tool. При этом окно Developer for z должно выглядеть, как показано на рисунке 8.
Рисунок 8. Приложение запущено в режиме отладки
- Воспользовавшись кнопкой Step Into панели вида Debug View (верхняя левая часть перспективы Debug), вы можете пошагово пройти приложение, выполняя одну инструкцию за один шаг.
- После того, как вы начали выполнение приложения в режиме отладки, переместите курсор на имя переменной и задержите его там на некоторое время - текущее значение переменной появится в всплывающем окне.
- Выделите имя переменной и щелкните на нем правой кнопкой мышки. В появившемся контекстном меню вы можете выбрать одно из действий, применимых к данной переменной, например, просмотр памяти. Эта опция особенно полезна в случае, если переменная содержит машинный адрес.
Теперь вы можете отлаживать свое приложение, используя имена переменных, определенных в ассемблерном коде.
Полезные советы
Для того чтобы максимально эффективно использовать площадь окна перспективы Debug в среде Developer for z, вы можете переместить закладку Register в область, находящуюся непосредственно справа от панели Listing, где показан листинг вашего приложения. Для этого просто перетащите мышкой закладку Register на верхнюю часть панели вида Outline. Теперь вы можете видеть регистры общего назначения одновременно с панелью вида Monitors или Breakpoints.
Переменные и их значения не отображаются в панели вида Variables. Однако вы можете отслеживать значение переменной, дважды щелкнув по ней мышкой. Другая возможность посмотреть значение переменной - щелкнуть по ней правой кнопкой мышки и выбрать в контекстном меню опцию Monitor Expression. Выражение будет показано в панели вида Monitors. В приведенном ниже примере таким способом отслеживается значение переменной OUTSUM.
Рисунко 9. Изменяющиеся значения переменных в панели вида Monitors
Вы можете задать точку останова, дважды щелкнув мышкой на левой границе той строчки исходного кода, где вы хотите остановить отладку. Рисунок 10 показывает точку останова на строке 58 исходного кода HLASM.
Щелкните на кнопке Resume action в верхней части панели вида Debug View - приложение будет выполняться до тех пор, пока не достигнет назначенной точки останова. Тогда выполнение остановится, и система будет ждать дальнейших действий пользователя.
Рисунок 10. Выполнение приложение остановлено на контрольной точке
Воспользуйтесь командой set automonitor on
в окне Debug Console для отображения данных, соответствующих инструкции HLASM, которая будет выполнена при следующей команде step
.
На приведенном ниже примере видно, что на следующем шаге будет выполнена ассемблерная инструкция STM
- именно она выделена в листинге программы.
Рисунок 11. Пошаговое выполнение приложения и отслеживание соответствующих данных
Данные, соответствующие этой инструкции, отображаются в панели вида Monitors. Инструкция STM
сохранит значения регистров 2, 3, и 4 по адресу, расположенному в регистре 13, с соответствующим смещением (X"80"
). Дополнительно в панели Monitors выводится значение метки PLIST.
Рисунок 12. Отслеживание данных регистров
По мере пошагового выполнения программы панель Monitors отображает новые данные, связанные с той инструкцией ассемблера, которая будет выполнена на следующем шаге.
Заключение
Возможность символьной отладки HLASM приложения на уровне кода значительно увеличивает продуктивность работы разработчика. Rational Developer for System z в сочетании с Debug Tool и Debug Tool Utilities and Advanced Functions обеспечивают возможность символьной отладки приложений на HLASM, а также предоставляют единый гибкий интерфейс для такой отладки. Процесс генерации и загрузки мета-данных для символьной отладки HLASM приложений очень прост, в чем вы уже смогли убедиться в процессе отладки приведенного в статье примера.
Ссылки по теме
Файлы для загрузки