Página 1 de 1

Depurando variáveis Locais

Enviado: 15 Jul 2014 16:47
por maiconlst
Boa Tarde,
tenho um depurador para construir dentro da aplicação. Uma das funções sugeridas é de que o depurador traga as variáveis com seus tipos e respectivos valores.

No entanto não consigo trazer os nomes das variáveis locais, pois aparentemente só são referenciadas por número(Como no arquivo ErrSysW.prg).

Em pequisa pela Web li que embora as variáveis privadas são guardadas na Symbol Table no arquivo ".obj" as locais não são. O que traz economia de memória mas complica essa questão de depurar.

Apesar disso ao utilizar a função ALTD() e a opção "/b" no compilador, eu consegui trazer no depurador da própria linguagem (CLD) o nome das variáveis. INCLUSIVE as locais, com nome, tipo e etc...

A minha dúvida é: Se essa função traz o nome das variáveis pode haver alguma maneira de trazer na programação também.


Obs.: já tentei "__DBVMVARLGET" e "DBVMSTKLLIST" e não traz os nomes.

------

Utilizo xDevStudio v0.70,
xHB build1.1.0(Symplex),
BCC 5.5.1,
FW8.12.

Depurando variáveis Locais

Enviado: 15 Jul 2014 17:02
por JoséQuintas
Se não me engano isso já passou pelo harbour-users.

Talvez isso esteja vinculado a usar pelo debug.
Já tentou olhar os fontes do debug?

Se quiser tentar outras funções, separei meio que no chute, mas não tem manual.
Talvez sirva pra procurar pelo nome nos fontes do Harbour.

harbourdoc.com.br, Variable Management, API, core

Depurando variáveis Locais

Enviado: 15 Jul 2014 21:32
por fladimir
Veja se te ajuda:

Código: Selecionar todos

METHOD LoadVars() CLASS HBDebugger // updates monitored
variables

   LOCAL nCount
   LOCAL n
   LOCAL m
   LOCAL xValue
   LOCAL cName
   LOCAL aVars
   LOCAL aBVars
   LOCAL hSkip

   aBVars := {}

   IF ::lShowPublics
      nCount := __mvDbgInfo( HB_MV_PUBLIC )
      FOR n := nCount TO 1 STEP -1
         xValue := __mvDbgInfo( HB_MV_PUBLIC, n, @cName )
         AAdd( aBVars, { cName, xValue, "Public" } )
      NEXT
   ENDIF

   IF ::lShowPrivates
      /* CA-Cl*pper shows only local private variables in
monitor
       * We are marking non local private variables with "^"
character
       */
      nCount := __mvDbgInfo( HB_MV_PRIVATE )
      IF nCount > 0
         m := __mvDbgInfo( HB_MV_PRIVATE_LOCAL, ::nProcLevel
)
         hSkip := { => }
         hb_HAllocate( hSkip, nCount )
         FOR n := nCount TO 1 STEP -1
            xValue := __mvDbgInfo( HB_MV_PRIVATE, n, @cName
)
            IF ! cName $ hSkip
               AAdd( aBVars, { cName, xValue,  iif( m > 0,
"Private", "Private^" ) } )
               hSkip[ cName ] := NIL
            ENDIF
            --m
         NEXT
      ENDIF
   ENDIF

   IF ::aProcStack[ ::oBrwStack:Cargo ][ CSTACK_LINE ] !=
NIL
      IF ::lShowGlobals
         cName := ::aProcStack[ ::oBrwStack:Cargo ][
CSTACK_MODULE ]
         FOR n := 1 TO Len( ::aModules )
            IF ! ::lShowAllGlobals
               IF ! hb_FileMatch( ::aModules[ n ][
MODULE_NAME ], cName )
                  LOOP
               ENDIF
            ENDIF
            aVars := ::aModules[ n ][ MODULE_GLOBALS ]
            FOR m := 1 TO Len( aVars )
               AAdd( aBVars, aVars[ m ] )
            NEXT
            IF ! ::lShowAllGlobals
               aVars := ::aModules[ n ][
MODULE_EXTERNGLOBALS ]
               FOR m := 1 TO Len( aVars )
                  AAdd( aBVars, aVars[ m ] )
               NEXT
            ENDIF
         NEXT
      ENDIF

      IF ::lShowStatics
         cName := ::aProcStack[ ::oBrwStack:Cargo ][
CSTACK_MODULE ]
         n := AScan( ::aModules, {| a | hb_FileMatch( a[
MODULE_NAME ], cName ) } )
         IF n > 0
            aVars := ::aModules[ n ][ MODULE_STATICS ]
            FOR m := 1 TO Len( aVars )
               AAdd( aBVars, aVars[ m ] )
            NEXT
         ENDIF
         aVars := ::aProcStack[ ::oBrwStack:Cargo ][
CSTACK_STATICS ]
         FOR n := 1 TO Len( aVars )
            AAdd( aBVars, aVars[ n ] )
         NEXT
      ENDIF

      IF ::lShowLocals
         aVars := ::aProcStack[ ::oBrwStack:Cargo ][
CSTACK_LOCALS ]
         FOR n := 1 TO Len( aVars )
            cName := aVars[ n ][ VAR_NAME ]
            m := AScan( aBVars, ; // Is there another var
with this name ?
            {| aVar | aVar[ VAR_NAME ] == cName .AND. Left(
aVar[ VAR_TYPE ], 1 ) == "S" } )
            IF m > 0
               aBVars[ m ] := aVars[ n ]
            ELSE
               AAdd( aBVars, aVars[ n ] )
            ENDIF
         NEXT
      ENDIF
   ENDIF

   IF ::oBrwVars != NIL .AND. ::oBrwVars:cargo[ 1 ] > Len(
aBVars )
      ::oBrwVars:GoTop()
   ENDIF
   ::aVars := aBVars
   IF ::lSortVars .AND. ! Empty( ::aVars )
      ::Sort()
   ENDIF

   RETURN NIL

[]´s

Depurando variáveis Locais

Enviado: 16 Jul 2014 14:02
por maiconlst
Então. Utilizando esse trecho de código procurei a versão para o Xharbour. Após isso criei uma função com o código e a adaptei à meu próprio código.

Ficou da seguinte forma

Código: Selecionar todos

function LoadVars()   
   LOCAL nCount
   LOCAL n  
   LOCAL m
   LOCAL xValue
   LOCAL cName 
   LOCAL aBVars 
   aBVars := {}  
   msginfo(__DBGENTRY())
    nProcLevel := hb_dbg_procLevel() - aVar[ VAR_LEVEL ]    
   ::aProcStack := Array( ::nProcLevel )      
   IF (Condição)
         aVars := ::aProcStack[ ::oBrwStack:Cargo ][ CSTACK_LOCALS  ]
         FOR n := 1 TO Len( aVars )
            cName := aVars[ n ][ VAR_NAME ]
            m := AScan( aBVars,; // Is there another var with this name ?
                        { | aVar | aVar[ VAR_NAME ] == cName .AND. Left( aVar[ VAR_TYPE ], 1 ) == "S" } )
            IF m > 0
               aBVars[ m ] := aVars[ n ]
            ELSE
               AAdd( aBVars, aVars[ n ] )
            ENDIF
         NEXT
      ENDIF

No entanto ao rodar o compilador diz que a variável 'aVar' não existe. Procurei nos fontes do Harbor e do xHarbour mas não deu pra entender exatamente como esse vetor é preenchido.

Depurando variáveis Locais

Enviado: 16 Jul 2014 17:49
por maiconlst
Neste link
http://www.hmgforum.com/viewtopic.php?p=26068

dizem no forum que o array "aProcStack" contem informações para depuração.
No entanto mesmo vasculhando o codigo não consigo encontrar a fonte da informação.. o compilador apenas diz que a variavel "aProcStack" nao existe.

Depurando variáveis Locais

Enviado: 18 Jul 2014 11:37
por maiconlst
A propósito, essa função "__mvDbgInfo" traz as variáveis públicas e Privadas na ordem que são criadas.. será que tem como separar por procedimento, quero dizer separar as variáveis por cada função ou procedure nas quais elas são criadas, mais ou menos igual quando se usa o paramentro "nproclevel" nas locais.???

Depurando variáveis Locais

Enviado: 22 Jul 2014 09:45
por maiconlst
Após muito tentar parece que a fonte do problema é o arquivo dbgentry.c... aparentemente ele não é compatível com xHarbour. Estou realizando testes para ter certeza.

Vocês sabem se isso é verdade, se esse arquivo não é mesmo compatível?

Depurando variáveis Locais

Enviado: 24 Jul 2014 14:20
por maiconlst
Consegui fazer rodar a função "__dbgEntry" no Harbour, no entanto o primeiro Parâmetro retorna o valor '6' e os outros retornam "Nil"...
será que eu estou esquecendo de alguma lib em particular??

Depurando variáveis Locais

Enviado: 25 Jul 2014 11:42
por maiconlst
Consegui fazer funcionar..mesmo marcando a opção /b no compilador é necessário acrescentar no início do cógico "#pragma -b-"
assim consegui comunicar com a função 'dbgentry ' :D

Obrigado a todos.