ibmi-brunch-learn

Announcement

Collapse
No announcement yet.

call stack

Collapse
X
 
  • Filter
  • Time
  • Show
Clear All
new posts

  • call stack

    Hi

    Hw to find the call tree of a program i.e. hw to find wt all programs or modules are being called and in wt sequence.

  • #2
    Re: call stack

    here is an example comes from

    PHP Code:
    Q:
    I want to get some job's call stack, but the QWVRCSTK API need the Thread 
    identifier in JIDF0100 Format. How do I get the job thread identifier ?


    A:
    Here'
    s an example using the QWVRCSTK API without a specific thread identifier
        
    The open job list API locates the most CPU consuming jobs on a system and 
        
    subsequently retrieves the program currently running in that job:


         **   
    Open list APIs are located in library QGY.
         **
         **-- 
    Control spec:  
         
    H Option( *SrcStmt: *NoDebugIo )  BndDir'QC2LE' )
         **-- 
    API error data structure:
         
    D ApiError        Ds
         D  AeBytPrv                     10i 0 Inz
    ( %SizeApiError ))
         
    D  AeBytAvl                     10i 0
         D  AeExcpId                      7a
         D                                1a
         D  AeExcpDta                   128a
         
    **-- API parameters
         
    D JlRtnRcdNbr     s             10i 0 Inz)
         
    D JlNbrFldRtn     s             10i 0 Inz( %ElemJlKeyFld ))
         
    D JlKeyFld        s             10i 0 Dim)
         **-- 
    Job information:
         
    D JlJobInf        Ds           512
         D  JbJobId                      26a
         D   JbJobUsd                    10a   Overlay
    JbJobId)
         
    D   JbUsrUsd                    10a   OverlayJbJobId: *Next )
         
    D   JbNbrUsd                     6a   OverlayJbJobId: *Next )
         
    D  JbActSts                      4a
         D  JbJobTyp                      1a
         D  JbJobSubTyp                   1a
         D  JbDtaLen                     10i 0
         D                                4a
         
    **-- Key information:
         
    D JlKeyInf        Ds
         D  KiFldNbrRtn                  10i 0
         D  KiKeyInf                     20a   Dim
    ( %ElemJlKeyFld ))
         
    D   KiFldInfLen                 10i 0 OverlayKiKeyInf :  )
         
    D   KiKeyFld                    10i 0 OverlayKiKeyInf :  )
         
    D   KiDtaTyp                     1a   OverlayKiKeyInf :  )
         
    D                                3a   OverlayKiKeyInf 10 )
         
    D   KiDtaLen                    10i 0 OverlayKiKeyInf 13 )
         
    D   KiDtaOfs                    10i 0 OverlayKiKeyInf 17 )
         **-- 
    Sort information:
         
    D JlSrtInf        Ds
         D  SiNbrKeys                    10i 0 Inz
    )
         
    D  SiSrtInf                     12a   Dim10 )
         
    D   SiKeyFldOfs                 10i 0 OverlaySiSrtInf :  )
         
    D   SiKeyFldLen                 10i 0 OverlaySiSrtInf :  )
         
    D   SiKeyFldTyp                  5i 0 OverlaySiSrtInf :  )
         
    D   SiSrtOrd                     1a   OverlaySiSrtInf 11 )
         
    D   SiRsv                        1a   OverlaySiSrtInf 12 )
         **-- List 
    information:
         
    D JlLstInf        Ds
         D  LiRcdNbrTot                  10i 0
         D  LiRcdNbrRtn                  10i 0
         D  LiHandle                      4a
         D  LiRcdLen                     10i 0
         D  LiInfSts                      1a
         D  LiDts                        13a
         D  LiLstSts                      1a
         D                                1a
         D  LiInfLen                     10i 0
         D  LiRcd1                       10i 0
         D                               40a
         
    **-- Selection information:
         
    D JlSltInf        Ds
         D  SiJobNam                     10a   Inz
    '*ALL' )
         
    D  SiUsrNam                     10a   Inz'*ALL' )
         
    D  SiJobNbr                      6a   Inz'*ALL' )
         
    D  SiJobTyp                      1a   Inz'*' )
         
    D                                1a
         D  SiOfsPriSts                  10i 0 Inz
    60 )
         
    D  SiNbrPriSts                  10i 0 Inz)
         
    D  SiOfsActSts                  10i 0 Inz70 )
         
    D  SiNbrActSts                  10i 0 Inz)
         
    D  SiOfsJbqSts                  10i 0 Inz78 )
         
    D  SiNbrJbqSts                  10i 0 Inz)
         
    D  SiOfsJbqNam                  10i 0 Inz88 )
         
    D  SiNbrJbqNam                  10i 0 Inz)
         **
         
    D  SiPriSts                     10a   Dim)
         
    D  SiActSts                      4a   Dim)
         
    D  SiJbqSts                     10a   Dim)
         
    D  SiJbqNam                     20a   Dim)
         **-- 
    Job information key fields:
         
    D JbKeyDta        Ds
         D  JbPrcUniTim                  20u 0
         D  JbPrcUniPct                  10i 0
         D  JbPrcUniTimE                 20u 0
         
    **-- General return data:
         
    D JlGenDta        Ds
         D  GdBytRtn                     10i 0
         D  GdBytAvl                     10i 0
         D  GdElpTim                     20u 0
         D                               16a
         
    **-- Global variables:  
         
    D Ix              s              5i 0
         D Msg             s            256a   Varying
         D MsgKey          s              4a
         D PgmNam_q        s             20a
         
    **-- API constants:  
         
    D JOB_RESET_STAT  c                   '1'
         
    D JOB_KEEP_STAT   c                   '0'
         
    **-- Open list of jobs
         
    D LstJobs         Pr                  ExtPgm'QGYOLJOB' )
         
    D  LjRcvVar                  65535a          Options( *VarSize )
         
    D  LjRcvVarLen                  10i 0 Const
         
    D  LjFmtNam                      8a   Const
         
    D  LjRcvVarDfn               65535a          Options( *VarSize )
         
    D  LjRcvDfnLen                  10i 0 Const
         
    D  LjLstInf                     80a
         D  LjNbrRcdRtn                  10i 0 
    Const
         
    D  LjSrtInf                   1024a   Const  Options( *VarSize )
         
    D  LjJobSltInf                1024a   Const  Options( *VarSize )
         
    D  LjJobSltLen                  10i 0 Const
         
    D  LjNbrFldRtn                  10i 0 Const
         
    D  LjKeyFldRtn                  10i 0 Const  Options( *VarSize )  
         
    D                                            Dim32 )
         
    D  LjError                    1024a          Options( *VarSize )
         **
         
    D  LjJobSltFmt                   8a   Const  Options( *NoPass )
         **
         
    D  LjResStc                      1a   Const  Options( *NoPass )
         
    D  LjGenRtnDta                  32a          Options( *NoPass:*VarSize)
         
    D  LjGenRtnDtaLn                10i 0 Const  Options( *NoPass )
         **-- 
    Get list entry:  
         
    D GetLstEnt       Pr                  ExtPgm'QGYGTLE' )
         
    D  GlRcvVar                  65535a          Options( *VarSize )
         
    D  GlRcvVarLen                  10i 0 Const
         
    D  GlHandle                      4a   Const
         
    D  GlLstInf                     80a
         D  GlNbrRcdRtn                  10i 0 
    Const
         
    D  GlRtnRcdNbr                  10i 0 Const
         
    D  GlError                    1024a          Options( *VarSize )
         **-- 
    Close list:  
         
    D CloseLst        Pr                  ExtPgm'QGYCLST' )
         
    D  ClHandle                      4a   Const
         
    D  ClError                    1024a          Options( *VarSize )
         **-- 
    Copy memory
         
    D MemCpy          Pr              *   ExtProc'_MEMMOVE' )
         
    D  pOutMem                        *   Value
         D  pInpMem                        
    *   Value
         D  iMemSiz                      10u 0 Value
         
    **-- Delay job:  
         
    D sleep           Pr            10i 0 ExtProc'sleep' )
         
    D  seconds                      10u 0 Value
         
    **-- Get job program:  
         
    D GetJobPgmX      Pr            20a
         D  PxJobId                      26a   
    Const

         **-- 
    Mainline:  
         
    C*                  Eval      SiNbrActSts SiNbrActSts 1
         C
    *                  Eval      SiActSts(SiNbrActSts) = 'HLD '
         
    **
         
    C                   Eval      JlKeyFld(1) = 312
         C                   
    Eval      JlKeyFld(2) = 314
         C                   
    Eval      JlKeyFld(3) = 315
         
    **
         
    C                   Eval      SiNbrKeys      1
         C                   
    Eval      SiKeyFldOfs(1) = 49
         C                   
    Eval      SiKeyFldLen(1) = 4
         C                   
    Eval      SiKeyFldTyp(1) = 0
         C                   
    Eval      SiSrtOrd(1)    = '2'
         
    C                   Eval      SiRsv(1)       = x'00'
         
    **
         
    C                   CallP     LstJobsJlJobInf
         C                                    
    : %SizeJlJobInf )
         
    C                                    'OLJB0300'
         
    C                                    JlKeyInf
         C                                    
    : %SizeJlKeyInf )
         
    C                                    JlLstInf
         C                                    
    0
         C                                    
    JlSrtInf
         C                                    
    JlSltInf
         C                                    
    : %SizeJlSltInf )
         
    C                                    JlNbrFldRtn
         C                                    
    JlKeyFld
         C                                    
    ApiError
         C                                    
    'OLJS0100'
         
    C                                    JOB_RESET_STAT
         C                                    
    JlGenDta
         C                                    
    : %SizeJlGenDta )
         
    C                                    )
         **
         
    C                   CallP     sleep30 )
         **
         
    C                   CallP     LstJobsJlJobInf
         C                                    
    : %SizeJlJobInf )
         
    C                                    'OLJB0300'
         
    C                                    JlKeyInf
         C                                    
    : %SizeJlKeyInf )
         
    C                                    JlLstInf
         C                                    
    1
         C                                    
    JlSrtInf
         C                                    
    JlSltInf
         C                                    
    : %SizeJlSltInf )
         
    C                                    JlNbrFldRtn
         C                                    
    JlKeyFld
         C                                    
    ApiError
         C                                    
    'OLJS0100'
         
    C                                    JOB_KEEP_STAT
         C                                    
    JlGenDta
         C                                    
    : %SizeJlGenDta )
         
    C                                    )
         **
         
    C                   If        AeBytAvl    =  *Zero
         
    **
         
    C                   DoW       LiLstSts    <> '2'           Or
         
    C                             LiRcdNbrTot >  JlRtnRcdNbr
         
    **
         
    C                   If        JbJobTyp   <> 'X'
         
    C                   ExSr      GetKeyDta
         C                   ExSr      GetJobPgm
         C                   
    EndIf
         **
         
    C                   Eval      JlRtnRcdNbr JlRtnRcdNbr 1
         
    **
         
    C                   CallP     GetLstEntJlJobInf
         C                                      
    : %SizeJlJobInf )
         
    C                                      LiHandle
         C                                      
    JlLstInf
         C                                      
    1
         C                                      
    JlRtnRcdNbr
         C                                      
    ApiError
         C                                      
    )
         **
         
    C                   If        JbPrcUniTimE <= *Zero
         C                   Leave
         C                   
    EndIf
         **
         
    C                   EndDo
         
    **
         
    C                   CallP     CloseLstLiHandle
         C                                     
    ApiError
         C                                     
    )
         **
         
    C                   EndIf
         **
         
    C                   Eval      *InLr       = *On
         
    **
         
    C                   Return
         **-- 
    Get Key Field Data:  
         
    C     GetKeyDta     BegSr
         
    **
         
    C                   Clear                   JbKeyDta
         
    **
         
    C                   For       Ix 1  To KiFldNbrRtn
         
    **
         
    C                   Select
         C                   When      KiKeyFld
    (Ix)= 312
         C                   CallP     MemCpy
    ( %AddrJbPrcUniTim )
         
    C                                   : %AddrJlJobInf ) +
         
    C                                     KiDtaOfs(Ix)
         
    C                                   KiDtaLen(Ix)
         
    C                                   )
         **
         
    C                   When      KiKeyFld(Ix)= 314
         C                   CallP     MemCpy
    ( %AddrJbPrcUniPct )
         
    C                                   : %AddrJlJobInf ) +
         
    C                                     KiDtaOfs(Ix)
         
    C                                   KiDtaLen(Ix)
         
    C                                   )
         **
         
    C                   When      KiKeyFld(Ix)= 315
         C                   CallP     MemCpy
    ( %AddrJbPrcUniTimE )
         
    C                                   : %AddrJlJobInf ) +
         
    C                                     KiDtaOfs(Ix)
         
    C                                   KiDtaLen(Ix)
         
    C                                   )
         
    C                   EndSl
         
    **
         
    C                   EndFor
         **
         
    C                   EndSr
         
    **-- Get job program:  
         
    C     GetJobPgm     BegSr
         
    **
         
    C                   Eval      PgmNam_q   =  GetJobPgmXJbJobId )
         **
         
    C                   EndSr


         
    **-- Get job program
         
    P GetJobPgmX      B                   Export
         D                 Pi            20a
         D  PxJobId                      26a   
    Const

         **-- 
    API error data structure
         
    D ApiError        Ds
         D  AeBytPrv                     10i 0 Inz
    ( %SizeApiError ))
         
    D  AeBytAvl                     10i 0
         D  AeExcpId                      7a
         D                                1a
         D  AeExcpDta                   128a
         
    **-- Retrieve call stack API parameters:  
         
    D CsRcvVar        Ds
         D  CsBytRtn                     10i 0
         D  CsBytAvl                     10i 0
         D  CsNbrStkE                    10i 0
         D  CsOfsStkE                    10i 0
         D  CsNbrEntRtn                  10i 0
         D  CsThrId                       8a
         D  CsInfSts                      1a
         D  CsCalStk                  32767a
         
    **
         
    D CsCalStkE       Ds                  BasedpCalStkE )
         
    D  CsStkEntLen                  10i 0
         D  CsOfsStmIds                  10i 0
         D  CsNbrStmIds                  10i 0
         D  CsOfsPrcNam                  10i 0
         D  CsLenPrcNam                  10i 0
         D  CsRqsLvl                     10i 0
         D  CsPgmNam                     10a
         D  CsPgmLib                     10a
         D  CsMiInst                     10i 0
         D  CsModNam                     10a
         D  CsModLib                     10a
         D  CsCtlBdy                      1a
         D  CsRsv                         3a
         D  CsActGrpNbr                  10u 0
         D  CsActGrpNam                  10a
         D  CsAddInf                   4096a
         
    **
         
    D  CsStmIds                     10a   Dim16 )
         
    D  CsPrcNam                    512a
         
    **
         
    D CsJobId         Ds
         D  JiJobId                      26a
         D   JiJobNam                    10a   Overlay
    JiJobId)
         
    D   JiUsrNam                    10a   OverlayJiJobId: *Next )
         
    D   JiJobNbr                     6a   OverlayJiJobId: *Next )
         
    D  JiIntId                      16a
         D  JiRsv                         2a   Inz
    ( *Allx'00' )
         
    D  JiThrInd                     10i 0 Inz)
         
    D  JiThrId                       8a   Inz( *Allx'00' )
         **
         
    D RtvCalStk       Pr                  ExtPgm'QWVRCSTK' )
         
    D  RcRcvVar                  32767a
         D  RcRcvVarLen                  10i 0 
    Const
         
    D  RcRcvInfFmt                   8a   Const
         
    D  RcJobId                      56a   Const
         
    D  RcJobIdFmt                    8a   Const
         
    D  RcError                   32767a          Options( *VarSize )
         **
         
    D EntNbr          s              5u 0
         
    **
         **-- 
    Mainline:  
         **
         
    C                   Eval      JiJobId     =  PxJobId
         
    **
         
    C                   CallP     RtvCalStkCsRcvVar
         C                                      
    : %SizeCsRcvVar )

         
    C                                      'CSTK0100'
         
    C                                      CsJobId
         C                                      
    'JIDF0100'
         
    C                                      ApiError
         C                                      
    )
         **
         
    C                   If        AeBytAvl    = *Zero
         C                   
    Eval      pCalStkE    = %AddrCsRcvVar ) + 
         
    C                                                  CsOfsStkE
         
    **
         
    C                   For       EntNbr 1  to CsNbrEntRtn
         
    **
         
    C                   If        EntNbr      1
         
    **
         
    C                   Eval      CsStmIds    = *Blanks
         C                   
    Eval      CsPrcNam    = *Blanks
         
    **
         
    C                   If        CsOfsStmIds > *Zero
         C                   CallP     MemCpy
    ( %AddrCsStmIds )
         
    C                                   : %AddrCsCalStkE ) +
         
    C                                     CsOfsStmIds
         C                                   
    CsNbrStmIds * %SizeCsStmIds )
         
    C                                   )
         
    C                   EndIf
         **
         
    C                   If        CsOfsPrcNam > *Zero
         C                   CallP     MemCpy
    ( %AddrCsPrcNam )
         
    C                                   : %AddrCsCalStkE ) +
         
    C                                     CsOfsPrcNam
         C                                   
    CsLenPrcNam
         C                                   
    )
         
    C                   EndIf
         **
         
    C                   Leave
         C                   
    EndIf
         **
         
    C                   If        EntNbr      CsNbrEntRtn
         C                   
    Eval      pCalStkE    PCalStkE    CsStkEntLen
         C                   
    EndIf
         **
         
    C                   EndFor
         
    C                   EndIf
         **
         
    C                   Return    CsPgmNam CsPgmLib
         
    **
         
    P GetJobPgmX      E

    Thanks to Carsten Flensburg 
    All my answers were extracted from the "Big Dummy's Guide to the As400"
    and I take no responsibility for any of them.

    www.code400.com

    Comment

    Working...
    X