Development and Pipeline

Development and Pipeline

Development and Pipeline

Connecting mainframe application developers to discuss efficiently creating and maintaining z/OS applications

 View Only

Is it possible to debug a Metal C program using the C code and not the assembler code?

  • 1.  Is it possible to debug a Metal C program using the C code and not the assembler code?

    Posted Thu March 04, 2021 04:08 PM

    Hello,

    Is there a way to compile and run a C program compiled with the METAL option so that I could step through the C statements in the z/OS Debugger?  All I've been able to figure out so far is to step through the generated assembler code.   (I'm using METAL because it's called from a non-LE assembler program.) 

    Here is most of my compile job for the C program named CSUBPGM:

    //PREPROC EXEC PGM=CCNDRVR,REGION=0M,PARM=('/EVENTS,OPTFILE(DD:COPTS)')

    //COPTS    DD  *

      PPONLY(COMMENTS,NOLINES,,80),MAR(1,250),NOSEQUENCE

      LANGLVL(ANSI,TEXTAFTERENDIF),ARCH(5),TUNE(5)

      NOSEARCH,SEARCH(DD:LOCLIB,/usr/include/metal/,//'CBC.SCLBH.H')

    //*                                                                

    //COMPILE EXEC PGM=CCNDRVR,REGION=0M,PARM=('/EVENTS,OPTFILE(DD:COPTS)')

    //COPTS    DD  *

      ILP32,SSCOMM,METAL,MARGINS(1,250)

      CHECKOUT,NOSEQUENCE,MAR(1,250)

      INLRPT,SHOWINC,EXPMAC,SKIPS(HIDE)

      NOPPONLY(COMMENTS,NOLINES,,90),XREF

      NOENT

      AGGREGATE

      SERVICE(*** CSUBPGM was compiled %RENT %YYMMDD %HHMMSS ***)

      LANGLVL(ANSI,TEXTAFTERENDIF),ARCH(5),TUNE(5)

      NOSEARCH,SEARCH(DD:LOCLIB,/usr/include/metal/,//'CBC.SCLBH.H')

      DEBUG(FORMAT(DWARF),NOHOOK(LINE,NOBLOCK,PATH),SYMBOL)

      LIST,NOOFFSET,NOGONUMBER,NOOPTIMIZE,SOURCE,XREF

      GOFF

    //* LONGNAME (program will not link with LONGNAME - EDCXENV is missing? )

    //* GONUMBER is required by IPVLANGX to convert C listing into EQALANGX (debug) data,

    //* but it is not supported with the METAL option

    //* DEBUG(FILE(somename)) is not supported with the METAL option

    //*

    //SYSIN    DD  DISP=SHR,DSN=MACS.FAR14.PPCSRC(CSUBPGM)

    //SYSCDBG  DD  DISP=SHR,DSN=MACS.FAR14.DWARF(CSUBPGM)

    //SYSCPRT  DD  DISP=SHR,DSN=MACS.FAR14.COMPLST(CSUBPGM)

    //SYSEVENT DD  DISP=SHR,DSN=MACS.SYSEVENT(CSUBPGM)

    //SYSLIN   DD  DISP=SHR,DSN=MACS.FAR14.GENASM(CSUBPGM)

    //*

    //STEPLIB  DD  DISP=SHR,DSN=CEE.SCEERUN2

    //         DD  DISP=SHR,DSN=CBC.SCCNCMP

    //         DD  DISP=SHR,DSN=CEE.SCEERUN

    //         DD  DISP=SHR,DSN=CBC.SCCNSAM

    //         DD  DISP=SHR,DSN=HLA.SASMMOD1

    //*

    //SYSMSGS  DD  SYSOUT=%OUTCL

    //SYSLIB   DD  DUMMY

    //LOCLIB   DD  DISP=SHR,DSN=MACS.FAR14.H

    //*----------------------------------------------------------------

    //*

    //HLASM EXEC PGM=CDAHLASM,REGION=0M,COND=(4,LT,COMPILE),

    //    PARM=('LINECOUNT(999),LIST(133)',ADATA,GOFF,RENT)

    //STEPLIB  DD DISP=SHR,DSN=CEE.SCEERUN2

    //         DD DISP=SHR,DSN=CEE.SCEERUN

    //SYSIN    DD DISP=SHR,DSN=MACS.FAR14.GENASM(CSUBPGM)

    //SYSLIN   DD DISP=SHR,DSN=MACS.FAR14.OBJLIB(CSUBPGM)

    //SYSDWARF DD DISP=OLD,DSN=MACS.FAR14.DWARF(CSUBPGM)

    //SYSADATA DD DISP=SHR,DSN=MACS.FAR14.SYSADATA(CSUBPGM)

    //SYSPRINT DD DISP=SHR,DSN=MACS.FAR14.ASMLST(CSUBPGM)

    //CEEDUMP  DD DUMMY

    //*

    //SYSLIB   DD DISP=SHR,DSN=MACS.FAR14.SRCLIB

    //         DD DISP=SHR,DSN=SYS1.MACLIB

    //         DD DISP=SHR,DSN=CBC.SCCNSAM

    //CDAHOPT  DD *

      PHASEID

      VERBOSE

    //*

     

    And here is my batch job, which normally would EXEC PGM=ASMMAIN, which calls CSUBPGM:

    //* ---------------------------------------------------------

    //RUN EXEC PGM=EQANMDBG,REGION=0M

    //STEPLIB  DD DISP=SHR,DSN=MACS.FAR14.LOADLIB

    //         DD DISP=SHR,DSN=MACS.BATCH.LOADLIB

    //         DD DISP=SHR,DSN=EQAE10.SEQAMOD

    //         DD DISP=SHR,DSN=EQAE10.SEQABMOD

    //         DD DISP=SHR,DSN=CEE.SCEERUN

    //SYSPRINT DD SYSOUT=L

    //SYSOUT   DD SYSOUT=W

    //*

    //EQADEBUG DD DISP=SHR,DSN=WRL1.EQALANGX

    //EQALANGX DD DISP=SHR,DSN=WRL1.EQALANGX

    //SYSCDBG  DD DISP=SHR,DSN=MACS.FAR14.DWARF(CSUBPGM)

    //EQAADATA DD DISP=SHR,DSN=MACS.FAR14.SYSADATA(CSUBPGM)

    //ASMLST   DD DISP=SHR,DSN=MACS.FAR14.ASMLST(CSUBPGM)

    //INSPLOG  DD SYSOUT=L,DCB=(LRECL=120,RECFM=FB,BLKSIZE=0)

    //EQANMDBG DD *

    ASMMAIN,

    DBGPARMS=TEST(ALL,EQACMDS,,VTAM%WRL1:*)

    //*

    //EQACMDS  DD *

       SET WARNING ON;

       SET DEFAULT LISTINGS ('MACS.FAR14.COMPLST');

       /* SET DEFAULT DBG EQADEBUG;         <== Didn't work*/

       SET SOURCE ON ( "ASMMAIN" ) WRL1.EQALANGX(ASMMAIN);

       SET SOURCE ON ( "CSUBPGM" ) WRL1.EQALANGX(CSUBPGM);

    etc

    //* ---------------------------------------------------------

     

    I'm just guessing my way through all of this.  The DWARF file appears to be getting created, but I haven't found a combination of Debug Tool commands that will let me step through the C code as C code.  The assembler code is workable, but I think stepping through the C code would be more efficient.  It seems that some of the options I'm supposed to use for that don't work with the METAL option.  Please tell me I'm wrong about that!  

    Thanks in advance...
    Wendell 



    ------------------------------
    Wendell Lovewell
    ------------------------------