Effective Cross-Product Utilization: Revisited

nid

4333

vid

6775

type

naspa_articles

status

1

created

1201118306

changed

1203001709

comment

2

promote

0

sticky

0

revision_timestamp

1203001709

title

Effective Cross-Product Utilization: Revisited

body

<p>To mark my sixth anniversary of writing for NaSPA, I decided to revisit my first article and revamp it for a new audience. This article examines how one site incorporated one of the features of their change management system with the features of their dump analysis tool to help applications programmers determine the cause of development and production abends.</p> <h2>Introduction</h2> <p>When an abend occurs during a production batch run, an application programmer can determine the offending instruction by using a variety of actions and tools. Some application programmers try to determine what went wrong by recompiling a program to obtain a listing that contains the offset of the code in error. Usually the compile is done in a test environment (possibly with &quot;home grown&quot; JCL and compile options), but pointing to the production source and copy libraries. Sometimes application programmers, having attended a vendor training session for a product, continue to use the sample compile deck long after the class is over. Unfortunately, copy members may have been modified between the time the program was put into production and the time the abend occurs. This leads to ambiguous results in tracking down the offending instruction, which is not desirable when a production batch cycle is waiting to be restarted.</p> <p>This article describes how I provided one method of handling these abend situations by using one product to support another. The application programmers at this site now have a &quot;fast path&quot; to obtain the compile listing and begin their program analysis. Consequently, any down-time from production abends can be substantially reduced. Similarly, development time is improved with faster problem resolution.</p> <h2>Background</h2> <p>I recently worked with a major insurance company in the New York City metropolitan area on a significant enterprise-wide project. A significant portion of the application programming staff was provided by offshore-based consulting firms, and the majority of the staff was located in India. It was my belief that the application programmers could have used the site&#39;s existing software tools more effectively to reduce, and then eliminate, the error-prone possibilities inherent in program development and subsequent recompilations. </p> <p>This site had been using CA&#39;s Endevor for many years as its mainframe change management system. Endevor, by default, keeps the last compile listing (in a proprietary compressed form) before a program is installed in production. My goal was to use the Endevor compressed listing to provide as much information as possible and to drive the abend detection process.</p> <p>The site was also using IBM&#39;s Fault Analyzer to perform dump analysis; this product had replaced Compuware&#39;s Abend-AID several years ago. However, few application programmers, if any, were aware of the product. None of them, to my knowledge, realized they needed a side file to help them; nor did they understand how easy it was to create one.</p> <p>While the IBM product literature describes a step that can be used to create a side file when a program is compiled, this was not part of the Endevor process. I was not about to try to convince anyone in the Change Management group to modify the compile process to include an extra step for a &quot;third-party product.&quot; However, there was nothing to prevent the use of this utility after the compile was completed. Just the same, this utility requires specific compile-time options. The obvious factor was to ensure all of the required Fault Analyzer compile options were included with the Endevor compile. That way, the post-processor could write the appropriate records to the side file. </p> <p>Tangential to my overall project responsibilities, I developed an ISPF dialog to assist the application programmers. The design of the data entry panel is very straightforward. Using as few fields as possible, application programmers enter the name of the program, indicate their Endevor system and subsystem (which identifies the compressed listing data set), and specify whether the program is batch or online. A batch job is submitted to process the files.</p> <h2>The ISPF Dialog</h2> <p>The ISPF dialog helps application programmers to perform a key, and potentially time-consuming, function with greater ease; that is, detect errors in program abends, irrespective of whether the program is in development or production. It is accomplished by using the Endevor compressed listing that is saved at the completion of a successful compile.</p> <p>The dialog submits a batch job that extracts the compressed listing from the production library (or, for development, from the current Endevor compile) and uses an IBM utility to create the appropriate side file for diagnosing the cause of an abend.</p> <p>To access the dialog, application programmers navigate through a series of ISPF options. A panel, similar to the one shown in Figure 1, is displayed. Almost all of the fields on the panel are required. After the Enter key is pressed, a batch job is submitted to process the information. A message is displayed that indicates the name of the side file into which the records are placed, and reminds the application programmer of the specific Fault Analyzer option to use.</p> <p><span class="inline left"><img src="http://www.naspa.com/system/files/images/NDVRDBUG.img_assist_custom.jpg" alt="Figure 1" title="Figure 1" class="image img_assist_custom" width="399" height="299" /><span class="caption" style="width: 397px;"><strong>Figure 1</strong></span></span> </p><p>Figure 1: Endevor - Fault Analyzer data entry panel</p> <h2>An Overview of the Batch Processing</h2> <p>Here&#39;s a brief overview of what takes place within the batch job.</p> <p>The preliminary steps delete and then allocate the working partitioned data sets required in the job. Because the batch stream only processes one member at a time, there was no design requirement to use the features of a PDS/E. One file contains the output from the compressed listing, while the other contains the output of the Fault Analyzer utility (the side file).</p> <p>Another step takes the Endevor compressed listing and expands it, as shown in Figure 2. This is done using a standard CA-supplied Endevor utility program. It simply uses SCL to identify the input file name (the compressed listing data set), the output file name (the temporary partitioned data set), both of which are coded in the JCL, and the program name to be expanded.</p> <p>&nbsp;</p> <div class="codeblock"><code>//*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />//JS030&nbsp;&nbsp;&nbsp; EXEC PGM=NDVRC1,PARM=&#039;BC1PNCPY&#039;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />//CONLIB&nbsp;&nbsp; DD DISP=SHR,DSN=SYSPROD.ENDEVOR.LOADLIB&nbsp;&nbsp;&nbsp; <br />//COMPLIST DD&nbsp; DISP=SHR,DSN=&amp;amp;NDVRCLST&nbsp;&nbsp;&nbsp; <br />//PDSLIST&nbsp; DD DISP=OLD,DSN=&amp;amp;MYNDVRDS&nbsp; <br />//SYSPRINT DD&nbsp; SYSOUT=*&nbsp; <br />//BTSERR&nbsp;&nbsp; DD SYSOUT=*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />//SYSUDUMP DD&nbsp; SYSOUT=D<br />//SYSIN&nbsp;&nbsp;&nbsp; DD *&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp; COPY INPUT DDNAME=COMPLIST <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; OUTPUT DDNAME=PDSLIST<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; UNPACKED<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; UPDATE IF PRESENT&nbsp; MEMBER=&amp;NDFAPPGM<br />/*</code></div> <p>Figure 2: Abridged batch routine that expands Endevor compressed listing</p> <p>The next step invokes an ISPF Edit macro to edit the expanded listing file and reformat it.</p> <p>Another step invokes the Fault Analyzer utility to read the listing, parse the contents, and place the output into the appropriate side file.</p> <p>After the batch job completes, the programmer can view the source within Fault Analyzer by using the appropriate IDIOPTS statements.</p> <h2>The Batch Job Details</h2> <p>Now that you know what goes on in the job, we can take a closer look at the details.</p> <p>The abridged JCL to execute this job is shown in Figure 3. This example depicts the processing for a batch COBOL program. Let&#39;s look at what is going on in each of these steps.</p> <p>&nbsp;</p> <div class="codeblock"><code>//JS050&nbsp;&nbsp;&nbsp; EXEC PGM=IKJEFT01&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />//SYSPROC&nbsp; DD DISP=SHR,DSN=SYSUSER.ISPF.ISPCLIB&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DD DISP=SHR,DSN=SYSPROD.OEM.ISPCLIB&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />//ISPPLIB&nbsp; DD DISP=SHR,DSN=SYSPROD.IBM.ISPPLIB&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />//ISPMLIB&nbsp; DD DISP=SHR,DSN=SYSPROD.IBM.ISPMLIB&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />//ISPSLIB&nbsp; DD DISP=SHR,DSN=SYSPROD.IBM.ISPSLIB<br />//ISPTLIB&nbsp; DD&nbsp; DISP=(OLD,PASS),DSN=*.JS040.CPYOUT2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DD DISP=SHR,DSN=SYS1PROD.IBM.ISPTLIB&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />//ISPTABL&nbsp; DD DUMMY&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />//ISPLOG&nbsp;&nbsp; DD DUMMY&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />//ISPPROF&nbsp; DD DISP=(OLD,PASS),DSN=*.JS040.CPYOUT1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />//SYSTSPRT DD&nbsp; SYSOUT=*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />//SYSUDUMP DD&nbsp; SYSOUT=D&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />//SYSPRINT DD&nbsp; DUMMY&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />//MESSAGES DD&nbsp; SYSOUT=*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />//SYSIN&nbsp;&nbsp;&nbsp; DD&nbsp; DUMMY<br />//SYSTSIN&nbsp; DD&nbsp; *<br /> ISPSTART CMD(%EMACASEQ &amp;MYNDVRDS(&amp;NDFAPPGM) NDVRDBG1 &amp;DEBUG)&lt;/p&gt;<br />//*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />//JS060&nbsp;&nbsp;&nbsp; EXEC PGM=IDILANGX,PARM=&#039;&amp;NDFAPPGM (COBOL ERROR &#039;<br />//LISTING&nbsp; DD&nbsp; DISP=SHR,DSN=&amp;amp;MYNDVRDS&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />//IDILANGX DD&nbsp; DISP=SHR,DSN=&amp;amp;NDFAPSDS&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />//SYSUDUMP DD&nbsp; SYSOUT=D&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />//*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />//*--------------------------------------------------------<br />//* CHECK TO SEE IF MEMBER NAME MATCHES PROGRAM-ID&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />//*--------------------------------------------------------<br />//*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />//JS070&nbsp;&nbsp;&nbsp; EXEC PGM=IKJEFT1A,PARM=&#039;NDVRDBG2&amp;DEBUG&amp;&#039;<br />//SYSPROC&nbsp; DD DISP=SHR,DSN=SYSUSER.ISPF.ISPCLIB&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DD&nbsp; DISP=SHR,DSN=SYSPROD.OEM.ISPCLIB&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />//SYSTSPRT DD&nbsp; SYSOUT=*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />//MESSAGES DD&nbsp; SYSOUT=*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />//SYSTSIN&nbsp; DD DUMMY&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />//NDVRINFI DD&nbsp; *&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />)TBA 10&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />&amp;NDFAPPGM!&amp;MYNDVRDS&amp;NDFAPSDS&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />/*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />//*</code></div> <p>Figure 3: Abridged batch job to process compressed listing and create side file</p> <p>The job&#39;s fifth step invokes ISPF in batch mode. The REXX ISPF Edit macro NDVRDBG1 is invoked to edit the expanded compressed listing of the program. I will discuss the details of this processing in the following section.</p> <p>The sixth step invokes the IBM utility, IDILANGX, which reads the COBOL listing file and writes the appropriate records to the Fault Analyzer side file.</p> <p>The seventh step invokes another ISPF Edit macro to verify that the member name matches the PROGRAM-ID in the COBOL program. This is to ensure that Fault Analyzer can process the side file correctly. If the names do not match, the Edit macro renames the side file member name to the PROGRAM-ID.</p> <h2>The REXX Exec</h2> <p>The abridged code from the Edit macro, shown in Figure 4, performs validations on the data in the listing, and creates a file that is capable of being read by the post-processor.</p> <p>/* Get rid of everything before the start of the compile listing */</p> <p> &#39;Find &quot;Invocation parameters&quot; &#39; </p> <p> &#39;(<a href="/freelinking/CurLine">CurLine</a>) = <a href="/freelinking/LineNum">LineNum</a> .ZCsr&#39; </p> <p> If <a href="/freelinking/CurLine">CurLine</a> &gt; 2 Then Do </p> <p> &#39;Label &#39;<a href="/freelinking/CurLine">CurLine</a>-2&#39; = .Here&#39; </p> <p> &#39;Del .ZFirst .Here&#39; </p> <p> End </p> <p>/* Get rid of everything after the end of the compile listing */</p> <p> &#39;Find &quot;End of compilation&quot; &#39; </p> <p> &#39;(<a href="/freelinking/CurLine">CurLine</a>) = <a href="/freelinking/LineNum">LineNum</a> .ZCsr&#39; </p> <p> &#39;(<a href="/freelinking/LineLast">LineLast</a>) = <a href="/freelinking/LineNum">LineNum</a> .ZLast&#39; </p> <p> If <a href="/freelinking/LastLine">LastLine</a> -2 &gt; <a href="/freelinking/CurLine">CurLine</a> Then Do </p> <p> &#39;Label &#39;<a href="/freelinking/CurLine">CurLine</a>+2&#39; = .Here&#39; </p> <p> &#39;Del .Here .ZLast&#39; </p> <p> End </p> <p>/* Build a string of all options used to compile the program */</p> <p> &#39;Find &quot;Options &quot; First&#39; /* always start of parms */</p> <p> &#39;(<a href="/freelinking/CurLine">CurLine</a>) = <a href="/freelinking/LineNum">LineNum</a> .ZCsr&#39; </p> <p> <a href="/freelinking/LineFrst">LineFrst</a> = <a href="/freelinking/CurLine">CurLine</a> + 1 </p> <p> &#39;Find &quot;ZWB&quot; &#39; /* always last parm */</p> <p> &#39;(<a href="/freelinking/LineLast">LineLast</a>) = <a href="/freelinking/LineNum">LineNum</a> .ZCsr&#39; </p> <p> Do i = <a href="/freelinking/LineFrst">LineFrst</a> to <a href="/freelinking/LineLast">LineLast</a> </p> <p> &#39;(<a href="/freelinking/DataLine">DataLine</a>) = Line &#39;i /* dot (.) is used as a delimiter */</p> <p> If Pos(&#39;5655-G53&#39;,<a href="/freelinking/DataLine">DataLine</a>) &gt; 0 Then /* Enterprise COBOL */</p> <p> Iterate </p> <p> If Left(<a href="/freelinking/DataLine">DataLine</a>,1) = 0 Then </p> <p> <a href="/freelinking/DataLine">DataLine</a> = Word(<a href="/freelinking/DataLine">DataLine</a>,2) </p> <p> strCobOp = strCobOp || &#39;.&#39; || Strip(Left(<a href="/freelinking/DataLine">DataLine</a>,25)) </p> <p> End </p> <p> strCobOp = strCobOp || &#39;.&#39; /* here&#39;s where we get the last .*/</p> <p>/* Determine if there are any options that will not work... */</p> <p> Do i = 1 to strOpt.0 </p> <p> If Pos(strOpt.i,strCobOp) = 0 Then Do </p> <p> strEFlag = &#39;Yes&#39; </p> <p> j = j + 1 </p> <p> Notify.j = strEMsg4 Strip(strOpt.i,&#39;B&#39;,&#39;.&#39;) </p> <p> End </p> <p> End </p> <p> If Pos(&#39;.LIST.&#39;,strCobOp) = 0 Then Do </p> <p> If Pos(&#39;.OFFSET.&#39;,strCobOp) = 0 Then Do </p> <p> strEFlag = &#39;Yes&#39; </p> <p> j = j + 1 </p> <p> Notify.j = strEMsg5 </p> <p> End </p> <p> End </p> <p>&nbsp;</p> <p>Figure 4: Abridged REXX ISPF Edit macro that processes the expanded Endevor compressed listing</p>Let&#39;s review what is going on in this Edit macro: <ul><li>All of the compressed listing data surrounding the COBOL compiler listing is removed.</li><li>Because this is designed for COBOL programs, all of the compile-time options are placed into a single &quot;dot-delimited&quot; variable (as opposed to an array), for easy searching.</li><li>The known list of required Fault Analyzer options is compared to this variable. If any of the required options is not found, an error message is issued. However, all of the variables are still checked.</li><li>The file is saved.</li></ul> <p>If an error message is generated by this routine, the output is placed in the ddname, MESSAGES. A note in the SYSPRINT (and emphasized in the ISPF dialog&#39;s tutorial) directs application programmers to review this file.</p> <p>After the batch job completes, the application programmer can launch Fault Analyzer and establish the appropriate set of options to analyze the abend. He or she can immediately begin problem determination by reviewing the exact line of code at which the program abended.</p> <h2>Conclusion</h2> <p>By incorporating the features of one product with the features of another, a higher degree of consistency has been achieved. I was able to take the existing, unused Endevor output file and turn it into a constructive input file for application programmers to use with Fault Analyzer.</p> <p>This ISPF dialog lets application programmers focus on problem resolution, not on the need to recreate a program listing. By using this solution, application programmers are assured that they are working with a compile listing that matches the load module executing in the production (or development) environment. This results in a better use of programmer time - especially during a middle of the night production abend - and particularly if it affects the batch stream&#39;s critical path.</p> <p>Application programmers who use this facility appreciate that they have a compile listing that matches their program. They do not have to worry that their compile deck is using invalid compile options, back-level system data sets, or outdated copy books. They can be more productive in a matter of a few minutes, using the program products that are available.</p> <p><em>NaSPA member Larry Kahm is president of Heliotropic Systems, Inc., an IBM Business Partner located in Fort Lee, NJ. He has 20 years of experience working with systems and application programmers, vendors, and management to ensure that business applications are developed, maintained, and enhanced with the appropriate set of tools. When not training to run in the ING NYC Marathon, he&#39;s busy helping clients with their office networks and home computers.</em></p> <p>&nbsp;</p> <p>&nbsp;</p> <p>&nbsp;</p> <p>&nbsp;</p> <p>&nbsp;</p> <br class="clear" />

teaser

<p>To mark my sixth anniversary of writing for NaSPA, I decided to revisit my first article and revamp it for a new audience. This article examines how one site incorporated one of the features of their change management system with the features of their dump analysis tool to help applications programmers determine the cause of development and production abends.</p>

log

Copy of the revision from <em>Tue, 01/29/2008 - 2:10pm</em>.

format

7

uid

2184

name

jkasza

picture

data

a:27:{s:5:"roles";a:1:{i:0;s:1:"2";}s:13:"AMISDB_MBRPFX";s:1:" ";s:13:"AMISDB_MBRFNM";s:5:"Jenny";s:12:"AMISDB_MBRMI";s:1:" ";s:13:"AMISDB_MBRLNM";s:5:"Kasza";s:13:"AMISDB_MBRSFX";s:1:" ";s:12:"AMISDB_EMAIL";s:16:"editor@naspa.com";s:12:"AMISDB_mtype";s:5:"STAFF";s:15:"AMISDB_orgmbrdt";s:10:"08/08/2006";s:15:"AMISDB_trmstart";s:10:"08/08/2006";s:13:"AMISDB_trmend";s:10:"07/31/2010";s:15:"AMISDB_COMPBILL";s:3:"TEI";s:15:"AMISDB_ADDRBILL";s:18:"7044 S 13TH STREET";s:15:"AMISDB_CITYBILL";s:9:"OAK CREEK";s:16:"AMISDB_STATEBILL";s:2:"WI";s:15:"AMISDB_CTRYBILL";s:3:"USA";s:15:"AMISDB_COMPMAIL";s:3:"TEI";s:15:"AMISDB_ADDRMAIL";s:18:"7044 S 13TH STREET";s:15:"AMISDB_CITYMAIL";s:9:"OAK CREEK";s:16:"AMISDB_STATEMAIL";s:2:"WI";s:15:"AMISDB_CTRYMAIL";s:3:"USA";s:8:"og_email";s:1:"1";s:14:"tinymce_status";s:4:"true";s:14:"picture_delete";s:0:"";s:14:"picture_upload";s:0:"";s:7:"contact";i:1;s:5:"block";a:5:{s:4:"book";a:1:{i:0;i:1;}s:4:"menu";a:1:{i:2560;i:1;}s:15:"taxonomy_ticker";a:1:{i:0;i:1;}s:4:"user";a:1:{i:3;i:1;}s:10:"statistics";a:1:{i:0;i:0;}}}

tags

Array
(
    [5] => Array
        (
            [76] => stdClass Object
                (
                    [tid] => 76
                    [vid] => 5
                    [name] => COBOL
                    [description] => 
                    [weight] => 0
                )

            [41] => stdClass Object
                (
                    [tid] => 41
                    [vid] => 5
                    [name] => ISPF
                    [description] => 
                    [weight] => 0
                )

            [1302] => stdClass Object
                (
                    [tid] => 1302
                    [vid] => 5
                    [name] => Legacy
                    [description] => 
                    [weight] => 0
                )

        )

)

primary_term

last_comment_timestamp

1201118306

last_comment_name

comment_count

0

taxonomy

Array
(
    [76] => stdClass Object
        (
            [tid] => 76
            [vid] => 5
            [name] => COBOL
            [description] => 
            [weight] => 0
        )

    [41] => stdClass Object
        (
            [tid] => 41
            [vid] => 5
            [name] => ISPF
            [description] => 
            [weight] => 0
        )

    [1302] => stdClass Object
        (
            [tid] => 1302
            [vid] => 5
            [name] => Legacy
            [description] => 
            [weight] => 0
        )

    [332] => stdClass Object
        (
            [tid] => 332
            [vid] => 18
            [name] => Kahm, Larry
            [description] => 
            [weight] => 0
        )

    [558] => stdClass Object
        (
            [tid] => 558
            [vid] => 14
            [name] => Network Support - April-May, 2006
            [description] => 
            [weight] => 0
        )

)

files

Array
(
)

field_author

Array
(
    [0] => Array
        (
            [value] => Larry Kahm
            [view] => Larry Kahm
        )

)

field_description

Array
(
    [0] => Array
        (
            [value] => This article takes a look at how one site incorporated some of the features of their change management system with the features of their dump analysis tool with the goal of helping application programmers determine the cause of development and production abends. 
            [format] => 1
        )

)

field_article_pdf

Array
(
)

field_item_type

Array
(
    [0] => Array
        (
            [value] => Article
        )

)

field_article_cost

Array
(
    [0] => Array
        (
            [value] => 250
        )

)

field_temppdf

Array
(
    [0] => Array
        (
            [value] => 
        )

)

iid

links_related

Array
(
)

moderate

0

readmore

1

content

Array
(
    [body] => Array
        (
            [#value] => <p>To mark my sixth
anniversary of writing for NaSPA, I decided to revisit my first article and
revamp it for a new audience.  This
article examines how one site incorporated one of the features of their change
management system with the features of their dump analysis tool to help
applications programmers determine the cause of development and production
abends.</p>

<h2>Introduction</h2>

<p>When an abend
occurs during a production batch run, an application programmer can determine
the offending instruction by using a variety of actions and tools.  Some application programmers try to determine
what went wrong by recompiling a program to obtain a listing that contains the
offset of the code in error.  Usually the
compile is done in a test environment (possibly with &quot;home grown&quot; JCL
and compile options), but pointing to the production source and copy libraries.  Sometimes application programmers, having
attended a vendor training session for a product, continue to use the sample
compile deck long after the class is over. 
Unfortunately, copy members may have been modified between the time the
program was put into production and the time the abend occurs.  This leads to ambiguous results in tracking
down the offending instruction, which is not desirable when a production batch
cycle is waiting to be restarted.</p>



<p>This article
describes how I provided one method of handling these abend situations by using
one product to support another.  The
application programmers at this site now have a &quot;fast path&quot; to obtain
the compile listing and begin their program analysis.  Consequently, any down-time from production
abends can be substantially reduced. 
Similarly, development time is improved with faster problem resolution.</p>

<h2>Background</h2>



<p>I recently
worked with a major insurance company in the New York City metropolitan area on a significant
enterprise-wide project.  A significant
portion of the application programming staff was provided by offshore-based
consulting firms, and the majority of the staff was located in India. 
It was my belief that the application programmers could have used the
site&#39;s existing software tools more effectively to reduce, and then eliminate,
the error-prone possibilities inherent in program development and subsequent
recompilations. </p>



<p>This site had
been using CA&#39;s Endevor for many years as its mainframe change management
system.  Endevor, by default, keeps the
last compile listing (in a proprietary compressed form) before a program is
installed in production.  My goal was to
use the Endevor compressed listing to provide as much information as possible
and to drive the abend detection process.</p>



<p>The site was also
using IBM&#39;s Fault Analyzer to perform dump analysis; this product had replaced
Compuware&#39;s Abend-AID several years ago. 
However, few application programmers, if any, were aware of the
product.  None of them, to my knowledge,
realized they needed a side file to help them; nor did they understand how easy
it was to create one.</p>



<p>While the IBM
product literature describes a step that can be used to create a side file when
a program is compiled, this was not part of the Endevor process.  I was not about to try to convince anyone in
the Change Management group to modify the compile process to include an extra
step for a &quot;third-party product.&quot; 
However, there was nothing to prevent the use of this utility after the
compile was completed.  Just the same,
this utility requires specific compile-time options.  The obvious factor was to ensure all of the
required Fault Analyzer compile options were included with the Endevor
compile.  That way, the post-processor
could write the appropriate records to the side file. </p>



<p>Tangential to my
overall project responsibilities, I developed an ISPF dialog to assist the
application programmers.  The design of
the data entry panel is very straightforward. 
Using as few fields as possible, application programmers enter the name
of the program, indicate their Endevor system and subsystem (which identifies
the compressed listing data set), and specify whether the program is batch or
online.  A batch job is submitted to
process the files.</p>

<h2>The ISPF Dialog</h2>



<p>The ISPF dialog helps
application programmers to perform a key, and potentially time-consuming,
function with greater ease; that is, detect errors in program abends,
irrespective of whether the program is in development or production.  It is accomplished by using the Endevor
compressed listing that is saved at the completion of a successful compile.</p>



<p>The dialog
submits a batch job that extracts the compressed listing from the production
library (or, for development, from the current Endevor compile) and uses an IBM
utility to create the appropriate side file for diagnosing the cause of an
abend.</p>



<p>To access the
dialog, application programmers navigate through a series of ISPF options.  A panel, similar to the one shown in Figure
1, is displayed.  Almost all of the
fields on the panel are required.  After
the Enter key is pressed, a batch job is submitted to process the information.  A message is displayed that indicates the
name of the side file into which the records are placed, and reminds the
application programmer of the specific Fault Analyzer option to use.</p>



<p><span class="inline left"><img src="http://www.naspa.com/system/files/images/NDVRDBUG.img_assist_custom.jpg" alt="Figure 1" title="Figure 1"  class="image img_assist_custom" width="399" height="299" /><span class="caption" style="width: 397px;"><strong>Figure 1</strong></span></span> </p><p>Figure 1:
Endevor - Fault Analyzer data entry panel</p>



<h2>An Overview of the Batch Processing</h2>



<p>Here&#39;s a brief
overview of what takes place within the batch job.</p>



<p>The preliminary
steps delete and then allocate the working partitioned data sets required in
the job.  Because the batch stream only
processes one member at a time, there was no design requirement to use the
features of a PDS/E.  One file contains
the output from the compressed listing, while the other contains the output of
the Fault Analyzer utility (the side file).</p>



<p>Another step
takes the Endevor compressed listing and expands it, as shown in Figure 2.  This is done using a standard CA-supplied
Endevor utility program.  It simply uses
SCL to identify the input file name (the compressed listing data set), the
output file name (the temporary partitioned data set), both of which are coded
in the JCL, and the program name to be expanded.</p>

<p>&nbsp;</p>

<div class="codeblock"><code>//*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />//JS030&nbsp;&nbsp;&nbsp; EXEC PGM=NDVRC1,PARM=&#039;BC1PNCPY&#039;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />//CONLIB&nbsp;&nbsp; DD DISP=SHR,DSN=SYSPROD.ENDEVOR.LOADLIB&nbsp;&nbsp;&nbsp; <br />//COMPLIST DD&nbsp; DISP=SHR,DSN=&amp;amp;NDVRCLST&nbsp;&nbsp;&nbsp; <br />//PDSLIST&nbsp; DD DISP=OLD,DSN=&amp;amp;MYNDVRDS&nbsp; <br />//SYSPRINT DD&nbsp; SYSOUT=*&nbsp; <br />//BTSERR&nbsp;&nbsp; DD SYSOUT=*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />//SYSUDUMP DD&nbsp; SYSOUT=D<br />//SYSIN&nbsp;&nbsp;&nbsp; DD *&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp; COPY INPUT DDNAME=COMPLIST <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; OUTPUT DDNAME=PDSLIST<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; UNPACKED<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; UPDATE IF PRESENT&nbsp; MEMBER=&amp;NDFAPPGM<br />/*</code></div>
<p>Figure 2:
Abridged batch routine that expands Endevor compressed listing</p>



<p>The next step
invokes an ISPF Edit macro to edit the expanded listing file and reformat it.</p>



<p>Another step
invokes the Fault Analyzer utility to read the listing, parse the contents, and
place the output into the appropriate side file.</p>



<p>After the batch
job completes, the programmer can view the source within Fault Analyzer by
using the appropriate IDIOPTS statements.</p>

<h2>The Batch Job Details</h2>



<p>Now that you
know what goes on in the job, we can take a closer look at the details.</p>



<p>The abridged JCL
to execute this job is shown in Figure 3. 
This example depicts the processing for a batch COBOL program.  Let&#39;s look at what is going on in each of
these steps.</p>

<p>&nbsp;</p>
<div class="codeblock"><code>//JS050&nbsp;&nbsp;&nbsp; EXEC PGM=IKJEFT01&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />//SYSPROC&nbsp; DD DISP=SHR,DSN=SYSUSER.ISPF.ISPCLIB&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DD DISP=SHR,DSN=SYSPROD.OEM.ISPCLIB&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />//ISPPLIB&nbsp; DD DISP=SHR,DSN=SYSPROD.IBM.ISPPLIB&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />//ISPMLIB&nbsp; DD DISP=SHR,DSN=SYSPROD.IBM.ISPMLIB&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />//ISPSLIB&nbsp; DD DISP=SHR,DSN=SYSPROD.IBM.ISPSLIB<br />//ISPTLIB&nbsp; DD&nbsp; DISP=(OLD,PASS),DSN=*.JS040.CPYOUT2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DD DISP=SHR,DSN=SYS1PROD.IBM.ISPTLIB&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />//ISPTABL&nbsp; DD DUMMY&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />//ISPLOG&nbsp;&nbsp; DD DUMMY&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />//ISPPROF&nbsp; DD DISP=(OLD,PASS),DSN=*.JS040.CPYOUT1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />//SYSTSPRT DD&nbsp; SYSOUT=*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />//SYSUDUMP DD&nbsp; SYSOUT=D&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />//SYSPRINT DD&nbsp; DUMMY&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />//MESSAGES DD&nbsp; SYSOUT=*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />//SYSIN&nbsp;&nbsp;&nbsp; DD&nbsp; DUMMY<br />//SYSTSIN&nbsp; DD&nbsp; *<br /> ISPSTART CMD(%EMACASEQ &amp;MYNDVRDS(&amp;NDFAPPGM) NDVRDBG1 &amp;DEBUG)&lt;/p&gt;<br />//*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />//JS060&nbsp;&nbsp;&nbsp; EXEC PGM=IDILANGX,PARM=&#039;&amp;NDFAPPGM (COBOL ERROR &#039;<br />//LISTING&nbsp; DD&nbsp; DISP=SHR,DSN=&amp;amp;MYNDVRDS&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />//IDILANGX DD&nbsp; DISP=SHR,DSN=&amp;amp;NDFAPSDS&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />//SYSUDUMP DD&nbsp; SYSOUT=D&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />//*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />//*--------------------------------------------------------<br />//* CHECK TO SEE IF MEMBER NAME MATCHES PROGRAM-ID&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />//*--------------------------------------------------------<br />//*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />//JS070&nbsp;&nbsp;&nbsp; EXEC PGM=IKJEFT1A,PARM=&#039;NDVRDBG2&amp;DEBUG&amp;&#039;<br />//SYSPROC&nbsp; DD DISP=SHR,DSN=SYSUSER.ISPF.ISPCLIB&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DD&nbsp; DISP=SHR,DSN=SYSPROD.OEM.ISPCLIB&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />//SYSTSPRT DD&nbsp; SYSOUT=*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />//MESSAGES DD&nbsp; SYSOUT=*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />//SYSTSIN&nbsp; DD DUMMY&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />//NDVRINFI DD&nbsp; *&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />)TBA 10&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />&amp;NDFAPPGM!&amp;MYNDVRDS&amp;NDFAPSDS&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />/*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />//*</code></div>
<p>Figure 3:
Abridged batch job to process compressed listing and create side file</p>





<p>The job&#39;s fifth
step invokes ISPF in batch mode.  The
REXX ISPF Edit macro NDVRDBG1 is invoked to edit the expanded compressed
listing of the program.  I will discuss
the details of this processing in the following section.</p>



<p>The sixth step
invokes the IBM utility, IDILANGX, which reads the COBOL listing file and
writes the appropriate records to the Fault Analyzer side file.</p>



<p>The seventh step
invokes another ISPF Edit macro to verify that the member name matches the
PROGRAM-ID in the COBOL program.  This is
to ensure that Fault Analyzer can process the side file correctly.  If the names do not match, the Edit macro
renames the side file member name to the PROGRAM-ID.</p>

<h2>The REXX Exec</h2>



<p>The abridged
code from the Edit macro, shown in Figure 4, performs validations on the data
in the listing, and creates a file that is capable of being read by the
post-processor.</p>



<p>/* Get rid of
everything before the start of the compile listing      */</p>

<p>          &#39;Find &quot;Invocation
parameters&quot; &#39;                              
</p>

<p>          &#39;(<a href="/freelinking/CurLine">CurLine</a>) = <a href="/freelinking/LineNum">LineNum</a> .ZCsr&#39;                                   </p>

<p>          If <a href="/freelinking/CurLine">CurLine</a> &gt; 2 Then Do                                        </p>

<p>             &#39;Label &#39;<a href="/freelinking/CurLine">CurLine</a>-2&#39; = .Here&#39;                                </p>

<p>             &#39;Del .ZFirst .Here&#39;                                        </p>

<p>          End                                                          
</p>

<p>/* Get rid of
everything after the end of the compile listing         */</p>

<p>          &#39;Find &quot;End of compilation&quot;
&#39;                                  </p>

<p>          &#39;(<a href="/freelinking/CurLine">CurLine</a>) = <a href="/freelinking/LineNum">LineNum</a> .ZCsr&#39;                                   </p>

<p>          &#39;(<a href="/freelinking/LineLast">LineLast</a>) = <a href="/freelinking/LineNum">LineNum</a> .ZLast&#39;                                 </p>

<p>          If <a href="/freelinking/LastLine">LastLine</a> -2 &gt; <a href="/freelinking/CurLine">CurLine</a> Then
Do                              </p>

<p>             &#39;Label &#39;<a href="/freelinking/CurLine">CurLine</a>+2&#39; = .Here&#39;                                </p>

<p>             &#39;Del .Here .ZLast&#39;                                         </p>

<p>          End                                                          
</p>

<p>/* Build a
string of all options used to compile the program          */</p>

<p>          &#39;Find &quot;Options &quot;
First&#39;            /* always start of parms */</p>

<p>          &#39;(<a href="/freelinking/CurLine">CurLine</a>) = <a href="/freelinking/LineNum">LineNum</a> .ZCsr&#39;                                   </p>

<p>          <a href="/freelinking/LineFrst">LineFrst</a> = <a href="/freelinking/CurLine">CurLine</a> + 1                                        </p>

<p>          &#39;Find &quot;ZWB&quot; &#39;                           /* always last parm
*/</p>

<p>          &#39;(<a href="/freelinking/LineLast">LineLast</a>) = <a href="/freelinking/LineNum">LineNum</a> .ZCsr&#39;                                  </p>

<p>          Do i = <a href="/freelinking/LineFrst">LineFrst</a> to <a href="/freelinking/LineLast">LineLast</a>                                   </p>

<p>             &#39;(<a href="/freelinking/DataLine">DataLine</a>) = Line &#39;i  /* dot (.) is used as a delimiter */</p>

<p>             If Pos(&#39;5655-G53&#39;,<a href="/freelinking/DataLine">DataLine</a>) &gt; 0
Then /* Enterprise COBOL */</p>

<p>                Iterate                                                
</p>

<p>             If Left(<a href="/freelinking/DataLine">DataLine</a>,1) = 0 Then                               </p>

<p>                <a href="/freelinking/DataLine">DataLine</a> =
Word(<a href="/freelinking/DataLine">DataLine</a>,2)                            
</p>

<p>             strCobOp = strCobOp || &#39;.&#39; ||
Strip(Left(<a href="/freelinking/DataLine">DataLine</a>,25))     </p>

<p>          End                                                          
</p>

<p>          strCobOp = strCobOp || &#39;.&#39; /* here&#39;s
where we get the last .*/</p>

<p>/* Determine if
there are any options that will not work...           */</p>

<p>          Do i = 1 to strOpt.0                                          </p>

<p>             If Pos(strOpt.i,strCobOp) = 0 Then
Do                      </p>

<p>                strEFlag = &#39;Yes&#39;                                        </p>

<p>               
j = j + 1                                               </p>

<p>                Notify.j = strEMsg4
Strip(strOpt.i,&#39;B&#39;,&#39;.&#39;)             </p>

<p>             End                                                       
</p>

<p>          End                                                           </p>

<p>          If Pos(&#39;.LIST.&#39;,strCobOp) = 0 Then
Do                         </p>

<p>             If Pos(&#39;.OFFSET.&#39;,strCobOp) = 0
Then Do                    </p>

<p>                strEFlag = &#39;Yes&#39;                                        </p>

<p>                j = j + 1                                               </p>

<p>                Notify.j = strEMsg5                                     </p>

<p>             End                                                       
</p>

<p>          End           </p>

<p>&nbsp;</p>

<p>Figure 4: Abridged
REXX ISPF Edit macro that processes the expanded Endevor compressed listing</p>Let&#39;s review
what is going on in this Edit macro:



<ul><li>All of the compressed listing data
     surrounding the COBOL compiler listing is removed.</li><li>Because this is designed for COBOL
     programs, all of the compile-time options are placed into a single
     &quot;dot-delimited&quot; variable (as opposed to an array), for easy
     searching.</li><li>The known list of required Fault
     Analyzer options is compared to this variable.  If any of the required options is not
     found, an error message is issued.  However,
     all of the variables are still checked.</li><li>The file is saved.</li></ul>



<p>If an error
message is generated by this routine, the output is placed in the ddname,
MESSAGES.  A note in the SYSPRINT (and
emphasized in the ISPF dialog&#39;s tutorial) directs application programmers to
review this file.</p>



<p>After the batch
job completes, the application programmer can launch Fault Analyzer and
establish the appropriate set of options to analyze the abend.  He or she can immediately begin problem
determination by reviewing the exact line of code at which the program abended.</p>

<h2>Conclusion</h2>



<p>By incorporating
the features of one product with the features of another, a higher degree of
consistency has been achieved.  I was
able to take the existing, unused Endevor output file and turn it into a
constructive input file for application programmers to use with Fault Analyzer.</p>



<p>This ISPF dialog
lets application programmers focus on problem resolution, not on the need to
recreate a program listing.  By using
this solution, application programmers are assured that they are working with a
compile listing that matches the load module executing in the production (or
development) environment.  This results
in a better use of programmer time - especially during a middle of the night
production abend - and particularly if it affects the batch stream&#39;s critical
path.</p>



<p>Application
programmers who use this facility appreciate that they have a compile listing
that matches their program.  They do not
have to worry that their compile deck is using invalid compile options,
back-level system data sets, or outdated copy books.  They can be more productive in a matter of a
few minutes, using the program products that are available.</p>

<p><em>NaSPA member Larry Kahm is president of Heliotropic Systems, Inc., an
IBM Business Partner located in Fort Lee, NJ. He has 20 years of experience
working with systems and application programmers, vendors, and management to
ensure that business applications are developed, maintained, and enhanced with
the appropriate set of tools. When not training to run in the ING NYC Marathon,
he&#39;s busy helping clients with their office networks and home computers.</em></p>

<p>&nbsp;</p>

<p>&nbsp;</p>

<p>&nbsp;</p>

<p>&nbsp;</p>

<p>&nbsp;</p>



<br class="clear" />
            [#weight] => 0
        )

    [adsense_start] => Array
        (
            [#value] => <!-- google_ad_section_start -->
            [#weight] => -1
        )

    [adsense_end] => Array
        (
            [#value] => <!-- google_ad_section_end -->
            [#weight] => 1
        )

    [field_author] => Array
        (
            [#weight] => -4
            [#value] => <div class="field field-type-text field-field-author"><div class="field-items"><div class="field-item"><div class="field-label-inline-first">Author:&nbsp;</div>Larry Kahm</div></div></div>
            [#access] => 1
        )

    [field_description] => Array
        (
            [#weight] => -2
            [#value] => 
            [#access] => 
        )

    [field_article_pdf] => Array
        (
            [#weight] => -1
            [#value] => 
            [#access] => 
        )

    [field_item_type] => Array
        (
            [#weight] => 9
            [#value] => 
            [#access] => 
        )

    [field_article_cost] => Array
        (
            [#weight] => 10
            [#value] => 
            [#access] => 
        )

    [field_temppdf] => Array
        (
            [#weight] => 10
            [#value] => 
            [#access] => 
        )

    [fivestar_widget] => Array
        (
            [#value] => <form action="/node/4333/render"  accept-charset="UTF-8" method="post" id="fivestar-form-node-4333" class="fivestar-widget">
<div><input type="hidden" name="content_type" id="edit-content-type" value="node"  />
<input type="hidden" name="content_id" id="edit-content-id" value="4333"  />
<div class="form-item">
 <label>Your vote: </label>
 <div class="fivestar-widget container-inline  fivestar-average-text fivestar-user-stars"><input type="hidden" name="auto_submit_path" id="edit-auto-submit-path" value="/fivestar/vote/node/4333"  class="fivestar-path" />
<div class="form-item">
 <label class="option"><input type="radio" name="vote" value="20"   class="form-radio  fivestar-average-text fivestar-user-stars" /> 1</label>
</div>
<div class="form-item">
 <label class="option"><input type="radio" name="vote" value="40"   class="form-radio  fivestar-average-text fivestar-user-stars" /> 2</label>
</div>
<div class="form-item">
 <label class="option"><input type="radio" name="vote" value="60"   class="form-radio  fivestar-average-text fivestar-user-stars" /> 3</label>
</div>
<div class="form-item">
 <label class="option"><input type="radio" name="vote" value="80"   class="form-radio  fivestar-average-text fivestar-user-stars" /> 4</label>
</div>
<div class="form-item">
 <label class="option"><input type="radio" name="vote" value="100"   class="form-radio  fivestar-average-text fivestar-user-stars" /> 5</label>
</div>
</div><div id="fivestar-summary-4333" class="description"><div class="fivestar-summary-empty">No votes yet</div></div>
</div>
<input type="submit" name="op" id="edit-submit" value="Submit rating"  class="form-submit fivestar-submit" />
<input type="hidden" name="form_id" id="edit-fivestar-form-node-4333" value="fivestar_form_node_4333"  />

</div></form>

            [#weight] => 50
        )

    [forward] => Array
        (
            [#value] => <form action="/node/4333/render"  accept-charset="UTF-8" method="post" id="forward-form">
<div><fieldset class=" collapsible collapsed"><legend>Forward this page to a friend</legend><div class="form-item">
 <label for="edit-yemail">Your Email: <span class="form-required" title="This field is required.">*</span></label>
 <input type="text" maxlength="256" name="yemail" id="edit-yemail"  size="58" value="" class="form-text required" />
</div>
<div class="form-item">
 <label for="edit-yname">Your Name: <span class="form-required" title="This field is required.">*</span></label>
 <input type="text" maxlength="256" name="yname" id="edit-yname"  size="58" value="" class="form-text required" />
</div>
<div class="form-item">
 <label for="edit-recipients">Send To: <span class="form-required" title="This field is required.">*</span></label>
 <textarea cols="50" rows="5" name="recipients" id="edit-recipients"  class="form-textarea resizable required"></textarea>
 <div class="description">Enter multiple addresses on separate lines or separate them with commas.</div>
</div>
<div class="form-item">
 <label>Message Subject: </label>
 (Your Name) has forwarded a page to you from NaSPA.com
</div>
<div class="form-item">
 <label>Message Body: </label>
 (Your Name) thought you would like to see this page from the NaSPA web site.
</div>
<div class="form-item">
 <label for="edit-message">Your Personal Message: <span class="form-required" title="This field is required.">*</span></label>
 <textarea cols="50" rows="10" name="message" id="edit-message"  class="form-textarea resizable required"></textarea>
</div>
<input type="hidden" name="nid" id="edit-nid" value="4333"  />
<input type="hidden" name="forward_footer" id="edit-forward-footer" value=" "  />
<input type="submit" name="op" id="edit-submit" value="Send Message"  class="form-submit" />
</fieldset>
<input type="hidden" name="form_id" id="edit-forward-form" value="forward_form"  />

</div></form>

            [#weight] => 10
        )

    [links_related] => Array
        (
            [#value] => 
            [#weight] => 1
        )

    [vote_up_down] => Array
        (
            [#value] => <div class="vote-up-down-widget"><span class="up-inact" title="You must login to vote."></span><span class="down-inact" title="You must login to vote."></span></div>
            [#weight] => -10
        )

)
Syndicate content