giovedì 27 dicembre 2012

Memory Leak - Debug

Di seguito trovate un breve esempio di debug memoria in uso dalla sessione progress.
Vengono esaminati i principali oggetti che un'applicativo può utilizzare durante il suo ciclo di vita.


DEFINE VARIABLE hProcedure AS HANDLE      NO-UNDO.
DEFINE VARIABLE idataset AS INTEGER    NO-UNDO.
DEFINE VARIABLE iDsource AS INTEGER    NO-UNDO.
DEFINE VARIABLE iBuffer AS INTEGER    NO-UNDO.
DEFINE VARIABLE iQuery AS INTEGER    NO-UNDO.
DEFINE VARIABLE iProc AS INTEGER    NO-UNDO.
DEFINE VARIABLE cFile AS CHARACTER   NO-UNDO.

DEFINE STREAM stmem.


/* ***************************  Main Block  *************************** */
DEFINE VARIABLE iBuffers AS INTEGER    NO-UNDO.
DEFINE VARIABLE hBuff AS HANDLE     NO-UNDO.

cFile = SESSION:TEMP-DIR + "memory.log".
OUTPUT STREAM stmem TO VALUE(cFile).
MAIN:
DO:
    PUT STREAM stmem UNFORMATTED
        "** Memory Debug 1.0 **" SKIP
        "--------------------------" SKIP.

    hProcedure = SESSION:FIRST-PROCEDURE. /* Procedure */
    DO WHILE VALID-HANDLE(hProcedure):
        iProc = iProc + 1.
        PUT STREAM stmem UNFORMATTED "PROCEDURE; "
            " Handle=" hProcedure:HANDLE
            "; Procedure.NAME=" hProcedure:FILE-NAME
            "; Name=" hprocedure:NAME
            "; Transaction=" hProcedure:TRANSACTION:IS-OPEN SKIP.
       
        hProcedure = hProcedure:NEXT-SIBLING.
    END.

    IF VALID-HANDLE(hProcedure) THEN
        DELETE OBJECT hProcedure.

    hProcedure = SESSION:FIRST-QUERY. /* Dynamic Query */
    DO WHILE VALID-HANDLE(hProcedure):
        iQuery = iQuery + 1.
        PUT STREAM stmem UNFORMATTED "Query ; "
            " Handle=" hProcedure:HANDLE
            "; Name=" hProcedure:NAME
            "; Dynamic=" hProcedure:DYNAMIC
            "; is-Open=" hProcedure:IS-OPEN
            "; Num Buffers=" hProcedure:NUM-BUFFERS
            "; Prepare-string=" hProcedure:PREPARE-STRING
            "; INSTANTIATING-PROCEDURE=" hProcedure:INSTANTIATING-PROCEDURE " ".
        IF hProcedure:INSTANTIATING-PROCEDURE <> ? THEN
            PUT STREAM stmem UNFORMATTED hProcedure:INSTANTIATING-PROCEDURE:NAME SKIP.
        ELSE
            PUT STREAM stmem UNFORMATTED "" SKIP.

        hProcedure = hProcedure:NEXT-SIBLING.
    END.

    IF VALID-HANDLE(hProcedure) THEN
        DELETE OBJECT hProcedure.

    hProcedure = SESSION:FIRST-BUFFER. /* Dynamic Buffers / temp-table */
    DO WHILE VALID-HANDLE(hProcedure):
        ibuffer = ibuffer + 1.
        PUT STREAM stmem UNFORMATTED "Buffer ; "
            " Handle=" hProcedure:HANDLE
            "; Name=" hProcedure:NAME
            "; Dynamic=" hProcedure:DYNAMIC
            "; Table=" hProcedure:TABLE
            "; TableHandle=" hProcedure:TABLE-HANDLE
            "; TABLE Record=" (IF VALID-HANDLE(hProcedure:TABLE-HANDLE) THEN STRING(hProcedure:TABLE-HANDLE:HAS-RECORDS) ELSE "")
            "; Dataset=" hProcedure:DATASET
            "; INSTANTIATING-PROCEDURE=" hProcedure:INSTANTIATING-PROCEDURE " ".

        IF hProcedure:INSTANTIATING-PROCEDURE <> ? THEN
            PUT STREAM stmem UNFORMATTED hProcedure:INSTANTIATING-PROCEDURE:NAME SKIP.
        ELSE
            PUT STREAM stmem UNFORMATTED "" SKIP.

        hProcedure = hProcedure:NEXT-SIBLING.
       
    END.
   
    IF VALID-HANDLE(hProcedure) THEN
        DELETE OBJECT hProcedure.
    hProcedure = SESSION:FIRST-DATASET. /* datasets */
    DO WHILE VALID-HANDLE(hProcedure):
        iDataset = iDataset + 1.
        PUT STREAM stmem UNFORMATTED "Dataset ; "
            " Handle=" hProcedure:HANDLE
            "; Name=" hProcedure:NAME
            "; Dynamic= " hProcedure:DYNAMIC
            "; N.Buffers=" hProcedure:NUM-BUFFERS
            "; INSTANTIATING-PROCEDURE=" hProcedure:INSTANTIATING-PROCEDURE.
        IF hProcedure:INSTANTIATING-PROCEDURE <> ? THEN
            PUT STREAM stmem UNFORMATTED hProcedure:INSTANTIATING-PROCEDURE:NAME .
        IF hProcedure:NUM-BUFFERS > 0 THEN DO:
            PUT STREAM stmem UNFORMATTED "; Buffers : ".
            DO iBuffers = 1 TO hProcedure:NUM-BUFFERS:
                hBuff = hProcedure:GET-BUFFER-HANDLE(iBuffers) NO-ERROR.
                IF VALID-HANDLE(hBuff) THEN
                    PUT STREAM stmem UNFORMATTED hBuff:TABLE ", ".
                ELSE
                    PUT STREAM stmem UNFORMATTED "not available" ", ".
            END.
        END.

        PUT STREAM stmem SKIP.

        hProcedure = hProcedure:NEXT-SIBLING.
       
    END.
       
    IF VALID-HANDLE(hProcedure) THEN
        DELETE OBJECT hProcedure.
    hProcedure = SESSION:FIRST-DATA-SOURCE. /* data-source */
    DO WHILE VALID-HANDLE(hProcedure):
        iDsource = idsource + 1.
        PUT STREAM stmem UNFORMATTED "Datasource ; "
            " Handle=" hProcedure:HANDLE
            "; Name=" hProcedure:NAME
            "; Type=" hProcedure:TYPE
            "; INSTANTIATING-PROCEDURE=" hProcedure:INSTANTIATING-PROCEDURE.
        IF hProcedure:INSTANTIATING-PROCEDURE <> ? THEN
            PUT STREAM stmem UNFORMATTED hProcedure:INSTANTIATING-PROCEDURE:NAME SKIP.
        ELSE
            PUT STREAM stmem UNFORMATTED "" SKIP.

        hProcedure = hProcedure:NEXT-SIBLING.
        IF VALID-HANDLE(hProcedure) THEN
            DELETE OBJECT hProcedure.
        hBuff = ?.
    END.
END.



PUT STREAM stmem UNFORMATTED SKIP(1)
    "hProcedure VALID-HANDLE = " VALID-HANDLE(hProcedure) " - " SKIP
    "DATASET = " idataset " datasource = " idsource
    " Buffers = " iBuffer " PROCEDURE = " iProc
    " QUERY = " iQuery SKIP
    "--------------------------".
OUTPUT STREAM stmem CLOSE.


0 commenti: