Depurando variáveis Locais
Moderador: Moderadores
Depurando variáveis Locais
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.
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.
- JoséQuintas
- Administrador

- Mensagens: 20267
- Registrado em: 26 Fev 2007 11:59
- Localização: São Paulo-SP
Depurando variáveis Locais
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
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/
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/
Depurando variáveis Locais
Veja se te ajuda:
[]´s
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.
“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.
Depurando variáveis Locais
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
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.
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
ENDIFNo 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
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.
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
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
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?
Vocês sabem se isso é verdade, se esse arquivo não é mesmo compatível?
Depurando variáveis Locais
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??
será que eu estou esquecendo de alguma lib em particular??
Depurando variáveis Locais
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.
assim consegui comunicar com a função 'dbgentry '
Obrigado a todos.

