Depurando variáveis Locais

Projeto [x]Harbour - Compilador de código aberto compatível com o Clipper.

Moderador: Moderadores

maiconlst
Usuário Nível 1
Usuário Nível 1
Mensagens: 13
Registrado em: 15 Jul 2014 16:36
Localização: Paracatu/MG

Depurando variáveis Locais

Mensagem 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.
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Depurando variáveis Locais

Mensagem 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
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
fladimir
Colaborador
Colaborador
Mensagens: 2445
Registrado em: 15 Nov 2006 20:21

Depurando variáveis Locais

Mensagem 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
Sun Tzu há mais de três mil anos cita nas epígrafes de seu livro “A Arte da Guerra“:

“Concentre-se nos pontos fortes, reconheça as fraquezas, agarre as oportunidades e proteja-se contra as ameaças”.
“Se não é vantajoso, nunca envie suas tropas; se não lhe rende ganhos, nunca utilize seus homens; se não é uma situação perigosa, nunca lute uma batalha precipitada”
.


Até 2017    Desktop Console [ Legado ] Harbour | MinGW | DBF | CDX | FastReport | MySQL


Novos Projetos:

   Desktop Visual           Windev Desktop
   Celular Android/iOS   Windev Mobile
   WEB                            Windev Web


Sejamos gratos a Deus.
maiconlst
Usuário Nível 1
Usuário Nível 1
Mensagens: 13
Registrado em: 15 Jul 2014 16:36
Localização: Paracatu/MG

Depurando variáveis Locais

Mensagem 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.
maiconlst
Usuário Nível 1
Usuário Nível 1
Mensagens: 13
Registrado em: 15 Jul 2014 16:36
Localização: Paracatu/MG

Depurando variáveis Locais

Mensagem 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.
maiconlst
Usuário Nível 1
Usuário Nível 1
Mensagens: 13
Registrado em: 15 Jul 2014 16:36
Localização: Paracatu/MG

Depurando variáveis Locais

Mensagem 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.???
maiconlst
Usuário Nível 1
Usuário Nível 1
Mensagens: 13
Registrado em: 15 Jul 2014 16:36
Localização: Paracatu/MG

Depurando variáveis Locais

Mensagem 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?
maiconlst
Usuário Nível 1
Usuário Nível 1
Mensagens: 13
Registrado em: 15 Jul 2014 16:36
Localização: Paracatu/MG

Depurando variáveis Locais

Mensagem 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??
maiconlst
Usuário Nível 1
Usuário Nível 1
Mensagens: 13
Registrado em: 15 Jul 2014 16:36
Localização: Paracatu/MG

Depurando variáveis Locais

Mensagem 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.
Responder