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 '
Obrigado a todos.