2004-02-11 13:40 UTC+0100 Ryszard Glab <rglab@imid.med.pl>

+ source/debug/dbgbrwsr.prg
      + The new file with TDbgBrowser class which inherits
      from TBrowse

   * hrbdll.bc
   * hrbdll.vc
   * makefile.bc
   * makefile.nt
   * makefile.vc
   * source/debug/Makefile
      + added the reference to dbgbrwsr.prg

   * source/debug/dbgmenu.prg
      + added "Run at Startup' option

   * source/debug/dbgtwin.prg
   * source/debug/debugger.prg
   * source/debug/tbrwtext.prg
      + added "Run at Startup' option - if it is enabled then
      the debugged application runs until ALTD() is called or
      Alt+D keys pressed (Clipper compatibility - the default
      option). If it is disabled the the debugger shows up at
      the first code line with the debug info.
        This setting is stored in the initialization file
      (init.cld) as 'Options NoRunAtStartup'.
      * fixed more display/refreshing issues
      * fixed quiting the debugger

   * source/rtl/alert.prg
      * fixed bug with messages longer then 60 bytes

   * source/vm/hvm.c
      * hb_vmDebugEndProc() is called before the eval stack
      is cleaned - this allows to handle INIT/EXIT procedures
      correctly
This commit is contained in:
Ryszard Glab
2004-02-11 12:43:59 +00:00
parent e2d9db659b
commit 3e6e0c0bc1
14 changed files with 354 additions and 202 deletions

View File

@@ -8,6 +8,43 @@
2002-12-01 23:12 UTC+0100 Foo Bar <foo.bar@foobar.org>
*/
2004-02-11 13:40 UTC+0100 Ryszard Glab <rglab@imid.med.pl>
+ source/debug/dbgbrwsr.prg
+ The new file with TDbgBrowser class which inherits
from TBrowse
* hrbdll.bc
* hrbdll.vc
* makefile.bc
* makefile.nt
* makefile.vc
* source/debug/Makefile
+ added the reference to dbgbrwsr.prg
* source/debug/dbgmenu.prg
+ added "Run at Startup' option
* source/debug/dbgtwin.prg
* source/debug/debugger.prg
* source/debug/tbrwtext.prg
+ added "Run at Startup' option - if it is enabled then
the debugged application runs until ALTD() is called or
Alt+D keys pressed (Clipper compatibility - the default
option). If it is disabled the the debugger shows up at
the first code line with the debug info.
This setting is stored in the initialization file
(init.cld) as 'Options NoRunAtStartup'.
* fixed more display/refreshing issues
* fixed quiting the debugger
* source/rtl/alert.prg
* fixed bug with messages longer then 60 bytes
* source/vm/hvm.c
* hb_vmDebugEndProc() is called before the eval stack
is cleaned - this allows to handle INIT/EXIT procedures
correctly
2004-02-05 18:49 UTC-0800 Luis Krause Mantilla <lkrausem /*at*/ shaw /*dot*/ ca>
* source/vm/debug.c
+ add wrappers (some 3rd-party-libs still use these ones) for:

View File

@@ -2153,6 +2153,12 @@ $(OBJ_DIR)\debugger.c : $(DEBUG_DIR)\debugger.prg
$(OBJ_DIR)\debugger.obj : $(OBJ_DIR)\debugger.c
$(CC) $(CLIBFLAGS) -o$@ $**
$(OBJ_DIR)\dbgbrwsr.c : $(DEBUG_DIR)\dbgbrwsr.prg
$(HARBOUR_EXE) $(HARBOURFLAGS) $** -o$@
$(OBJ_DIR)\dbgbrwsr.obj : $(OBJ_DIR)\dbgbrwsr.c
$(CC) $(CLIBFLAGS) -o$@ $**
$(OBJ_DIR)\tbrwtext.c : $(DEBUG_DIR)\tbrwtext.prg
$(HARBOUR_EXE) $(HARBOURFLAGS) $** -o$@

View File

@@ -1654,6 +1654,12 @@ $(OBJ_DIR)\debugger.c : $(DEBUG_DIR)\debugger.prg
$(OBJ_DIR)\debugger.obj : $(OBJ_DIR)\debugger.c
$(CC) $(CLIBFLAGS) /Fo$@ $**
$(OBJ_DIR)\dbgbrwsr.c : $(DEBUG_DIR)\dbgbrwsr.prg
$(HARBOUR_EXE) $(HARBOURFLAGS) $** -o$@
$(OBJ_DIR)\dbgbrwsr.obj : $(OBJ_DIR)\dbgbrwsr.c
$(CC) $(CLIBFLAGS) /Fo$@ $**
$(OBJ_DIR)\tbrwtext.c : $(DEBUG_DIR)\tbrwtext.prg
$(HARBOUR_EXE) $(HARBOURFLAGS) $** -o$@

View File

@@ -2486,6 +2486,13 @@ $(OBJ_DIR)\debugger.obj : $(OBJ_DIR)\debugger.c
$(CC) $(CLIBFLAGS) -o$@ $**
tlib $(DEBUG_LIB) $(ARFLAGS) -+$@,,
$(OBJ_DIR)\dbgbrwsr.c : $(DEBUG_DIR)\dbgbrwsr.prg
$(HARBOUR_EXE) $(HARBOURFLAGS) $** -o$@
$(OBJ_DIR)\dbgbrwsr.obj : $(OBJ_DIR)\dbgbrwsr.c
$(CC) $(CLIBFLAGS) -o$@ $**
tlib $(DEBUG_LIB) $(ARFLAGS) -+$@,,
$(OBJ_DIR)\tbrwtext.c : $(DEBUG_DIR)\tbrwtext.prg
$(HARBOUR_EXE) $(HARBOURFLAGS) $** -o$@

View File

@@ -681,6 +681,7 @@ DEBUG_LIB_OBJS = \
$(OBJ_DIR)\dbgtmitm.obj \
$(OBJ_DIR)\dbgtwin.obj \
$(OBJ_DIR)\debugger.obj \
$(OBJ_DIR)\dbgbrwsr.obj \
$(OBJ_DIR)\dbgtarr.obj \
$(OBJ_DIR)\dbgtobj.obj \
$(OBJ_DIR)\dbghelp.obj \

View File

@@ -645,6 +645,7 @@ DEBUG_LIB_OBJS = \
$(OBJ_DIR)\dbgtmitm.obj \
$(OBJ_DIR)\dbgtwin.obj \
$(OBJ_DIR)\debugger.obj \
$(OBJ_DIR)\dbgbrwsr.obj \
$(OBJ_DIR)\dbgtarr.obj \
$(OBJ_DIR)\dbgtobj.obj \
$(OBJ_DIR)\dbghelp.obj \

View File

@@ -14,7 +14,8 @@ PRG_SOURCES=\
dbgtobj.prg \
tbrwtext.prg \
dbgwa.prg \
dbghelp.prg
dbghelp.prg \
dbgbrwsr.prg
LIBNAME=debug

View File

@@ -0,0 +1,94 @@
/*
* $Id$
*/
/*
* Harbour Project source code:
* The Debugger Browser
*
* Copyright 2004 Ryszard Glab <rglab@imid.med.pl>
* www - http://www.harbour-project.org
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2, or (at your option)
* any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this software; see the file COPYING. If not, write to
* the Free Software Foundation, Inc., 59 Temple Place, Suite 330,
* Boston, MA 02111-1307 USA (or visit the web site http://www.gnu.org/).
*
* As a special exception, the Harbour Project gives permission for
* additional uses of the text contained in its release of Harbour.
*
* The exception is that, if you link the Harbour libraries with other
* files to produce an executable, this does not by itself cause the
* resulting executable to be covered by the GNU General Public License.
* Your use of that executable is in no way restricted on account of
* linking the Harbour library code into it.
*
* This exception does not however invalidate any other reasons why
* the executable file might be covered by the GNU General Public License.
*
* This exception applies only to the code released by the Harbour
* Project under the name Harbour. If you copy code from other
* Harbour Project or Free Software Foundation releases into a copy of
* Harbour, as the General Public License permits, the exception does
* not apply to the code that you add in this way. To avoid misleading
* anyone as to the status of such modified files, you must delete
* this exception notice from them.
*
* If you write modifications of your own for Harbour, it is your choice
* whether to permit this exception to apply to your modifications.
* If you do not wish that, delete this exception notice.
*
*/
#include "hbclass.ch"
CLASS TDbgBrowser FROM TBrowse // Debugger browser
DATA Window
METHOD New( nTop, nLeft, nBottom, nRight, oParentWindow )
METHOD Resize( nTop, nLeft, nBottom, nRight )
ENDCLASS
METHOD New( nTop, nLeft, nBottom, nRight, oParentWindow ) CLASS TDbgBrowser
::Window := oParentWindow
::super:New( nTop, nLeft, nBottom, nRight )
RETURN Self
METHOD Resize( nTop, nLeft, nBottom, nRight )
LOCAL lResize:=.F.
IF( nTop != ::nTop )
::nTop := nTop
lResize := .T.
ENDIF
IF( nLeft != ::nLeft )
::nLeft := nLeft
lResize := .T.
ENDIF
IF( nBottom != ::nBottom )
::nBottom := nBottom
lResize := .T.
ENDIF
IF( nRight != ::nRight )
::nRight := nRight
lResize := .T.
ENDIF
IF( lResize )
::configure()
ENDIF
RETURN self

View File

@@ -71,6 +71,7 @@ function __dbgBuildMenu( oDebugger ) // Builds the debugger pulldown menu
local oCallStack
local oCBTrace
local oPPo
local oRunAtStartup
MENU oMenu
MENUITEM " ~File "
@@ -79,7 +80,7 @@ function __dbgBuildMenu( oDebugger ) // Builds the debugger pulldown menu
MENUITEM " ~Resume" ACTION oDebugger:Resume()
MENUITEM " O~S Shell" ACTION oDebugger:OSShell()
SEPARATOR
MENUITEM " e~Xit Alt-X " ACTION oDebugger:Exit(), oDebugger:Hide(), __Quit()
MENUITEM " e~Xit Alt-X " ACTION oDebugger:Quit()
ENDMENU
MENUITEM " ~Locate "
@@ -163,6 +164,8 @@ function __dbgBuildMenu( oDebugger ) // Builds the debugger pulldown menu
MENUITEM " ~Colors..." ACTION oDebugger:Colors()
MENUITEM " ~Tab Width..." ACTION oDebugger:TabWidth()
MENUITEM " path for ~Files..." ACTION oDebugger:PathForFiles()
MENUITEM oRunAtStartup PROMPT " R~un at startup" IDENT "ALTD";
ACTION ( oDebugger:RunAtStartup(), oRunAtStartup:Toggle() ) CHECKED
SEPARATOR
MENUITEM " ~Save Settings..." ACTION oDebugger:SaveSettings()
MENUITEM " ~Restore Settings... " ACTION oDebugger:RestoreSettings()

View File

@@ -89,6 +89,7 @@ CLASS TDbWindow // Debugger windows and dialogs
METHOD Move()
METHOD KeyPressed( nKey )
METHOD Refresh()
METHOD Resize()
ENDCLASS
@@ -104,6 +105,7 @@ METHOD New( nTop, nLeft, nBottom, nRight, cCaption, cColor ) CLASS TDbWindow
::cColor := cColor
::lShadow := .f.
::lVisible := .f.
::lFocused := .f.
return Self
@@ -166,10 +168,6 @@ METHOD SetFocus( lOnOff ) CLASS TDbWindow
if ::bPainted != nil
Eval( ::bPainted, Self )
endif
IF( ::Browser != NIL )
::Browser:RefreshAll()
ENDIF
DispEnd()
@@ -196,17 +194,13 @@ METHOD Refresh() CLASS TDbWindow
Eval( ::bPainted, Self )
endif
IF( ::Browser != NIL )
::Browser:RefreshAll()
ENDIF
DispEnd()
return nil
METHOD Show( lFocused ) CLASS TDbWindow
DEFAULT lFocused TO .f.
DEFAULT lFocused TO ::lFocused
::cBackImage := SaveScreen( ::nTop, ::nLeft, ::nBottom + iif( ::lShadow, 1, 0 ),;
::nRight + iif( ::lShadow, 2, 0 ) )
@@ -347,3 +341,31 @@ LOCAL aClr:=__DbgColors()
RETURN nil
METHOD Resize( nTop, nLeft, nBottom, nRight ) CLASS TDbWindow
LOCAL lShow
IF( lShow:=::lVisible )
::Hide()
ENDIF
IF( nTop != NIL )
::nTop := nTop
ENDIF
IF( nBottom != NIL )
::nBottom := nBottom
ENDIF
IF( nLeft != NIL )
::nLeft := nLeft
ENDIF
IF( nRight != NIL )
::nRight := nRight
ENDIF
IF( ::Browser != NIL )
::Browser:Resize( ::nTop+1, ::nLeft+1, ::nBottom-1, ::nRight-1 )
ENDIF
IF( lShow )
::Show( ::lFocused )
ENDIF
RETURN self

View File

@@ -106,7 +106,6 @@
static s_oDebugger
static s_lExit := .F.
Static nDump
memvar __DbgStatics
procedure AltD( nAction )
@@ -234,6 +233,10 @@ procedure __dbgEntry( nMode, uParam1, uParam2, uParam3 ) // debugger entry poin
return // We can not use s_oDebugger yet, so we return
endif
IF( s_lExit )
RETURN
ENDIF
IF( s_oDebugger == NIL )
s_oDebugger := TDebugger():New()
ENDIF
@@ -246,7 +249,22 @@ procedure __dbgEntry( nMode, uParam1, uParam2, uParam3 ) // debugger entry poin
endif
s_oDebugger:StackProc( uParam1, hb_dbg_ProcLevel()-1 )
case nMode == HB_DBG_ENDPROC
if ProcName( 1 ) == "(_INITSTATICS)"
return
endif
IF( s_lExit )
RETURN
ENDIF
if s_oDebugger:lCodeblock
s_oDebugger:lCodeblock := .F.
endif
s_oDebugger:EndProc()
case nMode == HB_DBG_LOCALNAME
IF( s_lExit )
RETURN
ENDIF
cProcName := IIF(s_oDebugger:lCodeblock, s_oDebugger:aCallStack[1][CSTACK_FUNCTION], ProcName( 1 ))
nVarIndex := uParam1
cVarName := IIF(valtype(uParam2)=='C',uParam2,'NIL')
@@ -273,6 +291,10 @@ procedure __dbgEntry( nMode, uParam1, uParam2, uParam3 ) // debugger entry poin
return // We can not use s_oDebugger yet, so we return
endif
IF( s_lExit )
RETURN
ENDIF
AAdd( s_oDebugger:aCallStack[ 1 ][ CSTACK_STATICS ], { cVarName, nVarIndex, "Static",, nSFrame } )
if s_oDebugger:lShowStatics
@@ -284,15 +306,6 @@ procedure __dbgEntry( nMode, uParam1, uParam2, uParam3 ) // debugger entry poin
endif
endif
case nMode == HB_DBG_ENDPROC // called from hvm.c hb_vmDebuggerEndProc()
if Empty( ProcName( 1 ) ) // ending (_INITSTATICS)
return
endif
if s_oDebugger:lCodeblock
s_oDebugger:lCodeblock := .F.
endif
s_oDebugger:EndProc()
endcase
return
@@ -324,6 +337,7 @@ CLASS TDebugger
DATA lNextRoutine INIT .F.
DATA oBrwPnt, oWndPnt
DATA lppo INIT .F. //view preprocessed output
DATA lRunAtStartup
METHOD New()
METHOD Activate()
@@ -373,8 +387,10 @@ CLASS TDebugger
METHOD PrevWindow()
METHOD Private()
METHOD Public()
METHOD Quit() INLINE ::Exit(), ::Hide(), s_lExit:=.T., s_oDebugger:=NIL, __QUIT()
METHOD RestoreAppStatus()
METHOD RestoreSettings()
METHOD RunAtStartup() INLINE ::lRunAtStartup:=!::lRunAtStartup
METHOD SaveAppStatus()
METHOD SaveSettings()
METHOD Show()
@@ -435,6 +451,7 @@ CLASS TDebugger
METHOD VarGetValue( aVar )
METHOD VarSetValue( aVar, uValue )
METHOD ResizeWindows( oWindow )
METHOD NotSupported() INLINE Alert( "Not implemented yet!" )
ENDCLASS
@@ -456,7 +473,6 @@ METHOD New() CLASS TDebugger
::aTrace := {}
::lTracepoints := .F.
::aCallStack := {}
::lGo := .T. //Clipper compatible
::aVars := {}
::lCaseSensitive := .f.
::cSearchString := ""
@@ -475,12 +491,15 @@ METHOD New() CLASS TDebugger
::lAll := .f.
::lSortVars := .f.
::cSettingsFileName := "init.cld"
::lRunAtStartup := .t. //Clipper compatible
if File( ::cSettingsFileName )
::LoadSettings()
endif
::lGo := ::lRunAtStartup
::oPullDown := __dbgBuildMenu( Self )
::oPulldown:GetItemByIdent( "ALTD" ):Checked := ::lRunAtStartup
::oWndCode := TDbWindow():New( 1, 0, MaxRow() - 6, MaxCol() )
::oWndCode:Cargo := { ::oWndCode:nTop, ::oWndCode:nLeft }
@@ -846,9 +865,7 @@ METHOD CommandWindowProcessKey( nKey ) CLASS TDebugger
lDisplay = .f.
case Upper( SubStr( LTrim( cCommand ), 1, 4 ) ) == "QUIT"
::Exit()
::Hide()
__Quit()
::Quit()
case Upper( SubStr( LTrim( cCommand ), 1, 6 ) ) == "OUTPUT"
SetCursor( SC_NONE )
@@ -1044,7 +1061,7 @@ return nil
METHOD EndProc() CLASS TDebugger
if Len( ::aCallStack ) > 1
if Len( ::aCallStack ) > 0
ADel( ::aCallStack, 1 )
ASize( ::aCallStack, Len( ::aCallStack ) - 1 )
if ::oBrwStack != nil .and. ! ::lTrace
@@ -1078,9 +1095,7 @@ METHOD HandleEvent() CLASS TDebugger
do case
case nKey == K_ALT_X
s_oDebugger:Exit()
s_oDebugger:Hide()
__Quit()
s_oDebugger:Quit()
case ::oPullDown:IsOpen()
::oPullDown:ProcessKey( nKey )
@@ -1330,30 +1345,16 @@ METHOD ShowCallStack() CLASS TDebugger
SetCursor( SC_NONE )
// Resize code window
DispBegin()
::oWndCode:Hide()
::oWndCode:nRight -= 16
::oWndCode:Show( .f. )
::oBrwText:Resize(,,, ::oBrwText:nRight - 16 )
::oBrwText:GotoLine( ::oBrwText:nActiveLine )
Eval( ::oWndCode:bLostFocus )
// Resize code window
::oWndCode:Resize(,,,::oWndCode:nRight-16)
// Resize vars window
if ::oWndVars != nil
::oWndVars:Hide()
::oWndVars:nRight -= 16
::oBrwVars:nRight -= 16
::oBrwVars:configure()
::oWndVars:Show( .f. )
::oWndVars:Resize(,,, ::oWndVars:nRight - 16 )
endif
// Resize watchpoints window
if ::oWndPnt != nil
::oWndPnt:Hide()
::oWndPnt:nRight -= 16
::oBrwPnt:nRight -= 16
::oBrwPnt:configure()
::oWndPnt:Show( .f. )
::oWndPnt:Resize(,,, ::oWndPnt:nRight - 16 )
endif
DispEnd()
@@ -1367,7 +1368,7 @@ METHOD ShowCallStack() CLASS TDebugger
::oWndStack:bLButtonDown := { | nKey | ::CallStackProcessKey( K_LBUTTONDOWN ) }
AAdd( ::aWindows, ::oWndStack )
::nCurrentWindow = Len( ::aWindows )
// ::nCurrentWindow = Len( ::aWindows )
if ::oBrwStack == nil
::BuildBrowseStack()
@@ -1378,7 +1379,7 @@ METHOD ShowCallStack() CLASS TDebugger
::oBrwStack:RefreshAll(), ::oBrwStack:ForceStable() }
::oWndStack:bGotFocus = { || SetCursor( SC_NONE ) }
::oWndStack:Show( .t. )
::oWndStack:Show( .f. )
endif
return nil
@@ -1386,9 +1387,10 @@ return nil
METHOD LoadSettings() CLASS TDebugger
local cInfo := MemoRead( ::cSettingsFileName )
local n, cLine, nColor
local n, cLine, nColor, nLen
for n := 1 to MLCount( cInfo )
nLen := MLCount( cInfo )
for n := 1 to nLen
cLine := MemoLine( cInfo, 120, n )
do case
case Upper( SubStr( cLine, 1, 14 ) ) == "OPTIONS COLORS"
@@ -1414,6 +1416,9 @@ METHOD LoadSettings() CLASS TDebugger
cLine = SubStr( cLine, 13, 120 )
::cPathForFiles = AllTrim( cLine )
case Upper( SubStr( cLine, 1, 22 ) ) == "OPTIONS NORUNATSTARTUP"
::lRunAtStartup := .F.
case Upper( SubStr( cLine, 1, 14 ) ) == "MONITOR STATIC"
::lShowStatics = .t.
@@ -1525,7 +1530,6 @@ METHOD ShowVars() CLASS TDebugger
Local oCol
local lRepaint := .f.
local nTop
LOCAL lFocused
if ::lGo
return nil
@@ -1546,17 +1550,10 @@ METHOD ShowVars() CLASS TDebugger
iif( ::lShowStatics, " Static", "" ) + iif( ::lShowPrivates, " Private", "" ) + ;
iif( ::lShowPublics, " Public", "" ) )
::oWndCode:nTop := ::oWndVars:nBottom + 1
::oBrwText:Resize( ::oWndCode:nTop + 1 )
::oBrwText:RefreshAll()
::oWndCode:SetFocus( .t. )
::oWndVars:Show( .f. )
AAdd( ::aWindows, ::oWndVars )
::oWndVars:bLButtonDown := { | nMRow, nMCol | ::WndVarsLButtonDown( nMRow, nMCol ) }
::oWndVars:bLDblClick := { | nMRow, nMCol | ::EditVar( ::oBrwVars:Cargo[ 1 ] ) }
::oBrwVars := TBrowseNew( nTop+1, 1, ::oWndVars:nBottom - 1, MaxCol() - iif( ::oWndStack != nil,;
::oBrwVars := TDbgBrowser():New( nTop+1, 1, ::oWndVars:nBottom - 1, MaxCol() - iif( ::oWndStack != nil,;
::oWndStack:nWidth(), 0 ) - 1 )
::oWndVars:Browser := ::oBrwVars
@@ -1564,7 +1561,7 @@ METHOD ShowVars() CLASS TDebugger
::oBrwVars:Cargo :={ 1,{}} // Actual highligthed row
::oBrwVars:ColorSpec := ::aColors[ 2 ] + "," + ::aColors[ 5 ] + "," + ::aColors[ 3 ]
::oBrwVars:GOTOPBLOCK := { || ::oBrwVars:cargo[ 1 ] := Min( 1, Len( ::aVars ) ) }
::oBrwVars:GoBottomBlock := { || ::oBrwVars:cargo[ 1 ] := Len( ::aVars ) }
::oBrwVars:GoBottomBlock := { || ::oBrwVars:cargo[ 1 ] := MAX(1,Len( ::aVars )) }
::oBrwVars:SkipBlock = { | nSkip, nOld | nOld := ::oBrwVars:Cargo[ 1 ],;
::oBrwVars:Cargo[ 1 ] += nSkip,;
::oBrwVars:Cargo[ 1 ] := Min( Max( ::oBrwVars:Cargo[ 1 ], 1 ),;
@@ -1579,13 +1576,13 @@ METHOD ShowVars() CLASS TDebugger
" " ), ;
::oWndVars:nWidth() - 2 ) } )
::oBrwVars:AddColumn( oCol )
AAdd(::oBrwVars:Cargo[2],::avars)
AAdd(::oBrwVars:Cargo[2],::aVars)
oCol:DefColor:={1,2}
if Len( ::aVars ) > 0
::oBrwVars:ForceStable()
endif
::oWndVars:bPainted := { || if(Len( ::aVars ) > 0, ( ::obrwVars:ForceStable(),RefreshVarsS(::oBrwVars) ),) }
::oWndVars:bPainted := { || if(Len( ::aVars ) > 0, ( ::obrwVars:refreshAll():ForceStable(),RefreshVarsS(::oBrwVars) ),) }
::oWndVars:bKeyPressed := { | nKey | ( iif( nKey == K_DOWN ;
, ::oBrwVars:Down(), nil ), iif( nKey == K_UP, ::oBrwVars:Up(), nil ) ;
@@ -1593,7 +1590,12 @@ METHOD ShowVars() CLASS TDebugger
, iif( nKey == K_PGUP, ::oBrwVars:PageUp(), nil ) ;
, iif( nKey == K_HOME, ::oBrwVars:GoTop(), nil ) ;
, iif( nKey == K_END, ::oBrwVars:GoBottom(), nil ) ;
, iif( nKey == K_ENTER, ::EditVar( ::oBrwVars:Cargo[1] ), nil ), ::oBrwVars:ForceStable() ) }
, iif( nKey == K_ENTER, ::EditVar( ::oBrwVars:Cargo[1] ), nil ), IIF(LEN(::aVars)>0,::oBrwVars:ForceStable(),nil) ) }
AAdd( ::aWindows, ::oWndVars )
::oWndVars:Show()
::ResizeWindows( ::oWndVars )
else
::oWndVars:cCaption := "Monitor:" + ;
iif( ::lShowLocals, " Local", "" ) + ;
@@ -1601,44 +1603,26 @@ METHOD ShowVars() CLASS TDebugger
iif( ::lShowPrivates, " Private", "" ) + ;
iif( ::lShowPublics, " Public", "" )
lFocused := ::aWindows[ ::nCurrentWindow ] == ::oWndVars
DispBegin()
if( ::oBrwVars:cargo[1] <= 0 )
::oBrwVars:cargo[1] := 1
endif
if Len( ::aVars ) == 0
if ::oWndVars:nBottom - ::oWndVars:nTop > 1
::oWndVars:Hide()
::oWndVars:nBottom := ::oWndVars:nTop + 1
::oWndVars:Resize( ,, ::oWndVars:nTop + 1 )
lRepaint := .t.
endif
endif
if Len( ::aVars ) > ::oWndVars:nBottom - ::oWndVars:nTop - 1
::oWndVars:Hide()
::oWndVars:nBottom := ::oWndVars:nTop + Min( Len( ::aVars ) + 1, 7 )
::oBrwVars:nBottom := ::oWndVars:nBottom - 1
::oBrwVars:Configure()
elseif Len( ::aVars ) > ::oWndVars:nBottom - ::oWndVars:nTop - 1
::oWndVars:Resize( ,, ::oWndVars:nTop + Min( Len( ::aVars ) + 1, 7 ) )
lRepaint := .t.
elseif Len( ::aVars ) < ::oWndVars:nBottom - ::oWndVars:nTop - 1
::oWndVars:Resize( ,, ::oWndVars:nTop + Len( ::aVars ) + 1 )
lRepaint := .t.
endif
if Len( ::aVars ) < ::oWndVars:nBottom - ::oWndVars:nTop - 1
::oWndVars:Hide()
::oWndVars:nBottom := ::oWndVars:nTop + Len( ::aVars ) + 1
::oBrwVars:nBottom := ::oWndVars:nBottom - 1
::oBrwVars:Configure()
lRepaint := .t.
if ! ::oWndVars:lVisible .OR. lRepaint
::ResizeWindows( ::oWndVars )
endif
if ! ::oWndVars:lVisible
::oWndCode:nTop := ::oWndVars:nBottom + 1
::oBrwText:Resize( ::oWndVars:nBottom + 2 )
::oWndCode:Refresh()
::oWndVars:Show(lFocused)
else
if lRepaint
::oWndCode:nTop := ::oWndVars:nBottom + 1
::oBrwText:Resize( ::oWndCode:nTop + 1 )
::oWndCode:Refresh()
::oWndVars:Show(lFocused)
endif
endif
::oBrwVars:RefreshAll()
::oBrwVars:ForceStable()
DispEnd()
endif
@@ -1718,6 +1702,7 @@ LOCAL nPos
__DbgColors()[ 3 ] + "," + __DbgColors()[ 6 ] )
::oWndCode:Browser := ::oBrwText
::oWndCode:bPainted :={|| ::oBrwText:refreshAll():forceStable() }
::RedisplayBreakpoints() // check for breakpoints in this file and display them
::oWndCode:SetCaption( ::cPrgName )
::oWndCode:Refresh() // to force the window caption to update
@@ -1841,42 +1826,19 @@ METHOD HideCallStack() CLASS TDebugger
if ::oWndStack != nil
DispBegin()
::oWndStack:Hide()
::RemoveWindow( ::oWndStack )
::oWndStack = nil
::oWndCode:Hide()
::oWndCode:nRight += 16
::oWndCode:Show( .t. )
::oBrwText:Resize( ,,, ::oBrwText:nRight + 16 )
::oBrwText:GotoLine( ::oBrwText:nActiveLine )
if ::oWndVars != nil
IF( ::oWndVars:lVisible )
::oWndVars:Hide()
::oWndVars:nRight += 16
::oBrwVars:nRight += 16
::oBrwVars:configure()
::oWndVars:Show( .f. )
ELSE
::oWndVars:nRight += 16
::oBrwVars:nRight += 16
::oBrwVars:configure()
ENDIF
endif
if ::oWndPnt != nil
IF( ::oWndPnt:lVisible )
::oWndPnt:Hide()
::oWndPnt:nRight += 16
::oBrwPnt:nRight += 16
::oBrwPnt:configure()
::oWndPnt:Show( .f. )
ELSE
::oWndPnt:nRight += 16
::oBrwPnt:nRight += 16
::oBrwPnt:configure()
ENDIF
endif
if ::aWindows[ ::nCurrentWindow ] == ::oWndStack
::NextWindow()
ENDIF
::RemoveWindow( ::oWndStack )
::oWndStack = nil
::oWndCode:Resize(,,, ::oWndCode:nRight + 16 )
if ::oWndVars != nil
::oWndVars:Resize(,,, ::oWndVars:nRight + 16 )
endif
if ::oWndPnt != nil
::oWndPnt:Resize(,,, ::oWndPnt:nRight + 16 )
endif
DispEnd()
endif
@@ -2130,6 +2092,10 @@ METHOD SaveSettings() CLASS TDebugger
cInfo += "Options mono " + HB_OsNewLine()
endif
if !::lRunAtStartup
cInfo += "Options NoRunAtStartup " + HB_OsNewLine()
endif
if ::nSpeed != 0
cInfo += "Run Speed " + AllTrim( Str( ::nSpeed ) ) + HB_OsNewLine()
endif
@@ -2592,6 +2558,7 @@ METHOD WatchPointsShow() CLASS TDebugger
Local oCol
local lRepaint := .f.
local nTop
LOCAL lFocused
if ::lGo
return nil
@@ -2609,17 +2576,16 @@ METHOD WatchPointsShow() CLASS TDebugger
MaxCol() - iif( ::oWndStack != nil, ::oWndStack:nWidth(), 0 ),;
"Watch" )
::oWndCode:nTop := ::oWndPnt:nBottom + 1
::oBrwText:Resize( ::oWndCode:nTop + 1 )
::oBrwText:RefreshAll()
::oWndCode:SetFocus( .t. )
// ::oBrwText:Resize( ::oWndPnt:nBottom + 1 )
// ::oWndCode:nTop := ::oWndPnt:nBottom + 1
// ::oBrwText:Resize( ::oWndCode:nTop + 1 )
// ::oBrwText:RefreshAll()
// ::oWndCode:SetFocus( .t. )
::oWndPnt:Show( .f. )
AAdd( ::aWindows, ::oWndPnt )
// ::oWndPnt:bLButtonDown := { | nMRow, nMCol | ::WndVarsLButtonDown( nMRow, nMCol ) }
// ::oWndPnt:bLDblClick := { | nMRow, nMCol | ::EditVar( ::oBrwPnt:Cargo[ 1 ] ) }
::oBrwPnt := TBrowseNew( nTop+1, 1, ::oWndPnt:nBottom - 1, MaxCol() - iif( ::oWndStack != nil,;
::oBrwPnt := TDbgBrowser():New( nTop+1, 1, ::oWndPnt:nBottom - 1, MaxCol() - iif( ::oWndStack != nil,;
::oWndStack:nWidth(), 0 ) - 1 )
::oWndPnt:Browser := ::oBrwPnt
@@ -2644,11 +2610,8 @@ METHOD WatchPointsShow() CLASS TDebugger
::oBrwPnt:AddColumn( oCol )
AAdd(::oBrwPnt:Cargo[2], ::aWatch)
oCol:DefColor:={1,2}
if Len( ::aWatch ) > 0
::oBrwPnt:ForceStable()
endif
::oWndPnt:bPainted := { || if(Len(::aWatch) > 0, ( ::oBrwPnt:ForceStable(),RefreshVarsS(::oBrwPnt) ),) }
::oWndPnt:bPainted := { || if(Len(::aWatch) > 0, ( ::oBrwPnt:refreshAll():ForceStable(),RefreshVarsS(::oBrwPnt) ),) }
::oWndPnt:bKeyPressed := { | nKey | ( iif( nKey == K_DOWN ;
, ::oBrwPnt:Down(), nil ), iif( nKey == K_UP, ::oBrwPnt:Up(), nil ) ;
@@ -2659,44 +2622,26 @@ METHOD WatchPointsShow() CLASS TDebugger
, iif( nKey == K_DEL, ::WatchpointDel( ::oBrwPnt:Cargo[1] ), nil ) ;
, iif( nKey == K_ENTER, ::WatchpointEdit( ::oBrwPnt:Cargo[1] ), nil ), ::oBrwPnt:ForceStable() ) }
AAdd( ::aWindows, ::oWndPnt )
::oWndPnt:Show()
::ResizeWindows( ::oWndPnt )
else
if( ::oBrwPnt:cargo[1] <= 0 )
::oBrwPnt:cargo[1] := 1
endif
if Len( ::aWatch ) == 0
if ::oWndPnt:nBottom - ::oWndPnt:nTop > 1
::oWndPnt:nBottom := ::oWndPnt:nTop + 1
lRepaint := .t.
endif
endif
DispBegin()
if Len( ::aWatch ) > ::oWndPnt:nBottom - ::oWndPnt:nTop - 1
::oWndPnt:nBottom := ::oWndPnt:nTop + Min( Len( ::aWatch ) + 1, 4 )
::oBrwPnt:nBottom := ::oWndPnt:nBottom - 1
::oBrwPnt:Configure()
lRepaint := .t.
//Resize( top, left, bottom, right)
::oWndPnt:Resize( ,, ::oWndPnt:nTop + Min( Len( ::aWatch ) + 1, 4 ) )
lRepaint :=.T.
elseif Len( ::aWatch ) < ::oWndPnt:nBottom - ::oWndPnt:nTop - 1
::oWndPnt:Resize( ,, ::oWndPnt:nTop + Len( ::aWatch ) + 1 )
lRepaint :=.T.
endif
if Len( ::aWatch ) < ::oWndPnt:nBottom - ::oWndPnt:nTop - 1
::oWndPnt:nBottom := ::oWndPnt:nTop + Len( ::aWatch ) + 1
::oBrwPnt:nBottom := ::oWndPnt:nBottom - 1
::oBrwPnt:Configure()
lRepaint := .t.
endif
if ! ::oWndPnt:lVisible
::oWndCode:nTop := ::oWndPnt:nBottom + 1
::oBrwText:Resize( ::oWndPnt:nBottom + 2 )
::oWndPnt:Show()
else
if lRepaint
::oWndCode:nTop := ::oWndPnt:nBottom + 1
::oBrwText:Resize( ::oWndCode:nTop + 1 )
::oWndCode:Refresh()
::oWndPnt:Refresh()
endif
endif
if Len( ::aWatch ) > 0
::oBrwPnt:RefreshAll()
::oBrwPnt:ForceStable()
if ! ::oWndPnt:lVisible .OR. lRepaint
::ResizeWindows( ::oWndPnt )
endif
DispEnd()
endif
return nil
@@ -2851,6 +2796,50 @@ LOCAL lValid
RETURN aWatch[WP_EXPR]+" <"+aWatch[WP_TYPE]+", " +cType+">: " +xVal
METHOD ResizeWindows( oWindow ) CLASS TDebugger
LOCAL oWindow2, nTop, i
IF( oWindow == ::oWndVars )
oWindow2 := ::oWndPnt
ELSEIF( oWindow == ::oWndPnt )
oWindow2 := ::oWndVars
ENDIF
DispBegin()
IF( oWindow2 == NIL )
nTop := oWindow:nBottom +1
ELSE
IF( oWindow2:lVisible )
IF( oWindow:nTop < oWindow2:nTop )
nTop := oWindow2:nBottom - oWindow2:nTop + 1
oWindow2:Resize( oWindow:nBottom+1,, oWindow:nBottom+nTop)
ELSE
nTop := oWindow:nBottom - oWindow:nTop + 1
oWindow:Resize( oWindow2:nBottom+1,, oWindow2:nBottom+nTop)
ENDIF
nTop := MAX( oWindow:nBottom, oWindow2:nBottom ) + 1
ELSE
IF( oWindow:nTop > 1 )
nTop := oWindow:nBottom - oWindow:nTop + 1
oWindow:Resize( 1, , nTop )
ENDIF
nTop := oWindow:nBottom + 1
ENDIF
ENDIF
oWindow:hide()
IF( oWindow2 != NIL )
oWindow2:hide()
ENDIF
::oWndCode:Resize( nTop )
IF( oWindow2 != NIL )
oWindow2:show()
ENDIF
oWindow:show()
DispEnd()
RETURN self
STATIC FUNCTION CreateExpression( cExpr, aWatch )
LOCAL nLen

View File

@@ -87,6 +87,7 @@ CLASS TBrwText FROM HBEditor
METHOD PageDown()
METHOD RefreshAll()
METHOD RefreshCurrent()
METHOD ForceStable() INLINE NIL
METHOD GotoLine(n) // Moves active line cursor, that is it hilights last executed line of code

View File

@@ -119,36 +119,22 @@ FUNCTION Alert( xMessage, aOptions, cColorNorm, nDelay )
CASE ValType( xMessage ) == "B" ; xMessage := "{||...}"
OTHERWISE ; xMessage := "NIL"
ENDCASE
cOld:= xMessage
if Len(cOld) > 60 .AND. AT(';',cOld) == 0 //Dont do this if ; exist
cNew := ""
WHILE LEN(cOld) > 60
cTemp := SubStr( cOld, 1, 60 )
nPos := Rat(' ',cTemp)
if Len(cOld) >60
WHILE LEN(cOld) > 0
IF AT( ';' , cOld ) > 0 //Dont do this if ; exist
EXIT
ENDIF
IF LEN( cOld ) < 60
xMessage += cOld
EXIT
ENDIF
cTemp := SubStr( cOld , 1 , 60 )
nPos := Rat(' ',cTemp)
IF nPos > 0
cNew += SubStr( cTemp , 1 , nPos ) + ';'
cOld := SubStr( cOld , nPos + 1 )
ENDIF
xMessage := cNew
ENDDO
endif
IF( nPos = 0 )
nPos := 60
ENDIF
cNew += SubStr( cTemp, 1, nPos ) + ';'
cOld := SubStr( cOld, nPos + 1 )
ENDDO
xMessage := cNew + cOld
endif
DO WHILE ( nPos := At( ';', xMessage ) ) != 0

View File

@@ -3420,9 +3420,9 @@ void hb_vmDo( USHORT uiParams )
}
}
hb_stackOldFrame( &sStackState );
if( s_bDebugging )
hb_vmDebuggerEndProc();
hb_stackOldFrame( &sStackState );
s_bDebugging = bDebugPrevState;
s_ulProcLevel--;
@@ -3647,12 +3647,10 @@ void hb_vmSend( USHORT uiParams )
}
}
if( s_bDebugging )
hb_vmDebuggerEndProc();
hb_stackOldFrame( &sStackState );
if( s_bDebugging )
{
hb_vmDebuggerEndProc();
}
s_bDebugging = bDebugPrevState;
s_ulProcLevel--;