Символьная отладка HLASM-приложений с использованием Rational Developer for System z и Debug Tool

Источник: ibm
Лоуренс (Ларри) Ингланд, старший технический сотрудник, 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 необходимо выполнить следующие шаги (подробное описание каждого пункта приводится ниже):

  1. Настройка JCL процедуры, которая включает в себя шаг генерации мета-данных для Debug Tool.
  2. Создание MVS-проекта и подпроекта с указанием JCL процедуры и ее соответствующих настроек.
  3. Создание программы на ассемблере.
  4. Построение приложения.
  5. Запуск приложения в режиме отладки.
  6. Использование символьной информации, содержащейся в вашем 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:

  1. Создайте проект и подпроект. В нашем примере они названы PLEX4Bhlasm и HLASMDebug соответственно.
  2. Укажите вызов процедуры ELAXFADT в параметрах ассемблера и определите значения переменных, используемых в процедуре. Для этого отредактируйте шаг ASM и укажите имя JCL процедуры ELAXFADT как показано на следующем рисунке.

    Рисунок 2. Определение JCL процедуры для генерации отладочных мета-данных.
     


  3. В окне настроек ассемблера Assembler Settings откройте закладку JCL Substitutions и убедитесь, что ваши настройки соответствуют настройкам примера, показанным на рисунке 3.

    Рисунок 3. Проверка значений переменных JCL процедуры
     


    Использование MEM в качестве глобальной переменной очень удобно в случае, если в проект включены несколько HLASM файлов, так как в этом случае имя раздела в файле исходного кода проекта используется как переменная подстановки для каждого запуска JCL процедуры.

  4. Убедитесь, что поле Application Entry Point указывает на точку входа для HLASM ассемблера.

    Рисунок 4.
     


Создание программы на ассемблере

Теперь нам нужно создать исходный код приложения в системе z/OS. Для написания кода воспользуемся возможностями Developer for z:

  1. Создайте набор данных для нашей программы. В панели вида Remote Systems щелкните правой кнопкой мышки на MVS Files. В контекстном меню выберите опцию Allocate PDS.
  2. В окне мастера создания PDS укажите имя набора данных. В нашем примере это ENGLAND.SOURCE.ASSEMBLE. Убедитесь, что значение крайнего справа параметра соответствует ASSEMBLE. Нажмите Next.
  3. Выберите опцию Specify characteristics by usage type, укажите значения SOURCE и ASM.
  4. Нажмите Finish.
  5. Распакуйте архив с кодом приложения на вашей локальной системе Microsoft Windows. В панели вида Remote Systems раскройте папку Local. В дереве локальной файловой системы найдите исходный файл нашего приложения и щелкните на нем правой кнопкой мышки. В контекстном меню выберите команду Copy.
  6. Чтобы перенести ассемблерный код с вашей системы Windows на удаленную систему z/OS, в панели вида Remote System найдите в дереве системы z/OS созданный ранее PDS, щелкните на нем правой кнопкой мышки, и в открывшемся контекстом меню выберите команду Paste.
  7. Добавьте файл в подпроект, свойства которого мы определили ранее. Для этого разверните только что созданный 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     
			

Сборка приложения

Для построения приложения выполните следующие шаги:

  1. Убедитесь, что все наборы данных, указанные в свойствах проекта, созданы. Эти наборы данных используются в JCL процедуре, отвечающей за сборку приложения.
  2. Выделите имя подпроекта (в нашем примере это HLASMDebug), щелкните на нем правой кнопкой мышки. В контекстном меню выберите команду Rebuild Subproject.
  3. Проверьте вывод JES, чтобы убедится, что приложение построилось без ошибок. Для того чтобы открыть вывод JES в окне редактора, дважды щелкните на задании.
  4. Если вывод JES содержит ошибки, исправьте их и перестройте приложение.

Если сборка приложения прошла успешно, в проект добавится имя раздела загрузочного модуля. В примере это ENGLAND.EXEC.LOAD(DBGMAIN).

Важно: Developer for z искусственно добавляет расширение .exe к имени модуля. На самом деле это расширение не является частью имени модуля.

Рисунок 5. Так выглядит проект в результате успешной сборки приложения 

 

Запуск приложения в режиме отладки

Для запуска приложения выполните следующие действия:

  1. В подпроекте выделите выполняемый модуль ENGLAND.EXEC.LOAD(DBGMAIN).exe.
  2. Щелкните правой кнопкой мышки на имени модуля, в контекстном меню выберите команду Debug Application.
  3. Для отладки приложения автоматически откроется перспектива Debug. Если в параметрах настройки Developer for z автоматическое переключение в другую перспективу без согласия пользователя запрещено, Developer for z выведет на экран запрос о переключение. Нажмите Yes чтобы открыть перспективу Debug.

Загрузка отладочной информации

Теперь вам необходимо загрузить информацию о символьных данных вашего HLASM приложения. Воспользуйтесь командой LoadDebugData (ldd) для загрузки мета-данных для Debug Tool.

Убедитесь, что в перспективе Debug открыта панель вида Debug Console. Если такой панели нет, выполните следующие шаги, чтобы открыть ее:

  1. Щелкните на кнопке Windows главного меню. В открывшемся списке выберите пункт Show View.
  2. Щелкните на пункте Other.
  3. В списке панелей вида выберите Debug Console и откройте эту панель. Команда LoadDebugData ( ldd) загрузит мета-данные для текущей отладочной сессии.
  4. Введите команду ldd dbgmain, где dbgmain - имя раздела набора данных EQALANGX, который мы указали в свойствах проекта и создали во время построения приложения. Пример команды показан на рисунке 6.

    Рисунок 6. Команда ldd dbgmain
     


Если при генерации отладочных мета-данных вы использовали формат имени, отличный от <userid>.EQALANGX, то вам следует указать JCL процедуре, предназначенной для выполнения HLASM приложения, новое имя набора данных, воспользовавшись инструкцией DDNAME EQADEBUG. Это можно сделать в панели определения параметров выполнения приложения как показано на рисунке 7.

Рисунок 7. Установка параметров выполнения приложения
 

 

Теперь при запуске приложения в режиме отладке вы можете пошагово выполнить приложение, назначать точки останова, отслеживать значения переменных, просматривать и изменять (осторожно!) содержимое регистров и использовать другие возможности Debug Tool. При этом окно Developer for z должно выглядеть, как показано на рисунке 8.

Рисунок 8. Приложение запущено в режиме отладки
 

 

  1. Воспользовавшись кнопкой Step Into панели вида Debug View (верхняя левая часть перспективы Debug), вы можете пошагово пройти приложение, выполняя одну инструкцию за один шаг.
  2. После того, как вы начали выполнение приложения в режиме отладки, переместите курсор на имя переменной и задержите его там на некоторое время - текущее значение переменной появится в всплывающем окне.
  3. Выделите имя переменной и щелкните на нем правой кнопкой мышки. В появившемся контекстном меню вы можете выбрать одно из действий, применимых к данной переменной, например, просмотр памяти. Эта опция особенно полезна в случае, если переменная содержит машинный адрес.

Теперь вы можете отлаживать свое приложение, используя имена переменных, определенных в ассемблерном коде.

Полезные советы

Для того чтобы максимально эффективно использовать площадь окна перспективы 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 приложений очень прост, в чем вы уже смогли убедиться в процессе отладки приведенного в статье примера.


Страница сайта http://www.interface.ru
Оригинал находится по адресу http://www.interface.ru/home.asp?artId=20266