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.
giovedì 27 dicembre 2012
Iscriviti a:
Commenti sul post (Atom)
0 commenti:
Posta un commento