some lua fixes, some more conversions, and added step-over to the tracer

This commit is contained in:
cheatengine@gmail.com 2012-12-31 00:34:21 +00:00
parent d8b763a18c
commit a7a914ba4a
14 changed files with 424 additions and 448 deletions

View File

@ -21,7 +21,7 @@ procedure luaclass_addArrayPropertyToTable(L: PLua_State; metatable: integer; us
procedure luaclass_canAutoDestroy(L: PLua_State; metatable: integer; state: boolean);
function luaclass_getClassObject(L: PLua_state): pointer; inline;
function luaclass_getClassObject(L: PLua_state): pointer; //inline;
procedure luaclass_newClass(L: PLua_State; o: TObject); overload;
procedure luaclass_newClass(L: PLua_State; o: TObject; InitialAddMetaDataFunction: TAddMetaDataFunction); overload;
@ -138,10 +138,31 @@ begin
end;
function luaclass_getClassObject(L: PLua_state): pointer; inline;
function luaclass_getClassObject(L: PLua_state): pointer;// inline;
//called by class functions. This is in case a 6.2 code executed the function manually
var t: integer;
u: pointer;
begin
result:=pointer(lua_touserdata(L, ifthen(lua_type(L, lua_upvalueindex(1))=LUA_TUSERDATA, lua_upvalueindex(1), 1))^);
result:=nil;
if lua_type(L, lua_upvalueindex(1))=LUA_TUSERDATA then
begin
u:=lua_touserdata(L, 1);
result:=ppointer(u)^;
end
else
if lua_gettop(L)>=1 then
begin
t:=lua_type(L, 1);
if t in [LUA_TUSERDATA, LUA_TLIGHTUSERDATA] then
begin
u:=lua_touserdata(L, 1);
if t=LUA_TUSERDATA then
result:=ppointer(u)^
else
result:=u;
end;
end;
if result=nil then
begin

View File

@ -307,6 +307,7 @@ end;
function control_getPopupMenu(L: PLua_State): integer; cdecl;
var
c: TControl;
i: integer;
begin
c:=luaclass_getClassObject(L);
luaclass_newClass(L, c.PopupMenu);

View File

@ -11,41 +11,33 @@ procedure initializeLuaMenu;
implementation
uses LuaCaller;
uses LuaCaller, LuaClass, LuaComponent;
function menu_getItems(L: PLua_State): integer; cdecl;
var
parameters: integer;
menu: TMenu;
begin
result:=0;
parameters:=lua_gettop(L);
if parameters=1 then
begin
menu:=lua_touserdata(L,-1);
lua_pop(L, parameters);
lua_pushlightuserdata(L, menu.Items);
result:=1;
end else lua_pop(L, parameters);
menu:=luaclass_getClassObject(L);
luaclass_newClass(L, menu.Items);
result:=1;
end;
function createMainMenu(L: Plua_State): integer; cdecl;
var parameters: integer;
f: TComponent;
m: TMainMenu;
begin
result:=0;
parameters:=lua_gettop(L);
if parameters=1 then
begin
f:=lua_touserdata(L, -1);
lua_pop(L, lua_gettop(L));
f:=lua_ToCEUserData(L, 1);
m:=TMainMenu.Create(f);
lua_pushlightuserdata(L, m);
luaclass_newClass(L, m);
result:=1;
end else lua_pop(L, lua_gettop(L));
end;
@ -59,11 +51,11 @@ begin
parameters:=lua_gettop(L);
if parameters=1 then
begin
f:=lua_touserdata(L, -1);
f:=lua_ToCEUserData(L, -1);
lua_pop(L, lua_gettop(L));
m:=TPopupMenu.Create(f);
lua_pushlightuserdata(L, m);
luaclass_newClass(L, m);
result:=1;
end else lua_pop(L, lua_gettop(L));
end;
@ -77,31 +69,23 @@ begin
parameters:=lua_gettop(L);
if parameters=1 then
begin
o:=lua_touserdata(L, -1);
o:=lua_ToCEUserData(L, -1);
lua_pop(L, lua_gettop(L));
mi:=TMenuItem.Create(o);
lua_pushlightuserdata(L, mi);
luaclass_newClass(L, mi);
result:=1;
end else lua_pop(L, lua_gettop(L));
end;
function menuItem_getCaption(L: PLua_State): integer; cdecl;
var
parameters: integer;
menuItem: TmenuItem;
begin
result:=0;
parameters:=lua_gettop(L);
if parameters=1 then
begin
menuItem:=lua_touserdata(L,-1);
lua_pop(L, parameters);
lua_pushstring(L, menuItem.Caption);
result:=1;
end else lua_pop(L, parameters);
menuitem:=luaclass_getClassObject(L);
lua_pushstring(L, menuItem.Caption);
result:=1;
end;
function menuItem_setCaption(L: PLua_State): integer; cdecl;
@ -110,34 +94,22 @@ var
menuItem: TmenuItem;
Caption: string;
begin
result:=0;
parameters:=lua_gettop(L);
if parameters=2 then
menuitem:=luaclass_getClassObject(L);
if lua_gettop(L)>=1 then
begin
menuItem:=lua_touserdata(L,-parameters);
Caption:=Lua_ToString(L, -parameters+1);
lua_pop(L, parameters);
Caption:=Lua_ToString(L, -1);
menuItem.Caption:=Caption;
end else lua_pop(L, parameters);
end;
result:=0;
end;
function menuItem_getShortcut(L: PLua_State): integer; cdecl;
var
parameters: integer;
menuItem: TmenuItem;
begin
result:=0;
parameters:=lua_gettop(L);
if parameters=1 then
begin
menuItem:=lua_touserdata(L,-1);
lua_pop(L, parameters);
lua_pushstring(L, ShortCutToText(menuItem.Shortcut));
result:=1;
end else lua_pop(L, parameters);
menuitem:=luaclass_getClassObject(L);
lua_pushstring(L, ShortCutToText(menuItem.Shortcut));
result:=1;
end;
function menuItem_setShortcut(L: PLua_State): integer; cdecl;
@ -146,73 +118,51 @@ var
menuItem: TmenuItem;
Shortcut: string;
begin
result:=0;
parameters:=lua_gettop(L);
if parameters=2 then
menuitem:=luaclass_getClassObject(L);
if lua_gettop(L)>=1 then
begin
menuItem:=lua_touserdata(L,-parameters);
Shortcut:=Lua_ToString(L, -parameters+1);
lua_pop(L, parameters);
Shortcut:=Lua_ToString(L, -1);
menuItem.Shortcut:=TextToShortCut(shortcut);
end else lua_pop(L, parameters);
end;
result:=0;
end;
function menuItem_getCount(L: PLua_State): integer; cdecl;
var
parameters: integer;
menuItem: TmenuItem;
begin
result:=0;
parameters:=lua_gettop(L);
if parameters=1 then
begin
menuItem:=lua_touserdata(L,-1);
lua_pop(L, parameters);
lua_pushinteger(L, menuItem.Count);
result:=1;
end else lua_pop(L, parameters);
menuitem:=luaclass_getClassObject(L);
lua_pushinteger(L, menuItem.Count);
result:=1;
end;
function menuItem_getItem(L: PLua_State): integer; cdecl;
var
parameters: integer;
menuitem: TMenuItem;
index: integer;
begin
result:=0;
parameters:=lua_gettop(L);
if parameters=2 then
menuitem:=luaclass_getClassObject(L);
if lua_gettop(L)>=1 then
begin
menuitem:=lua_touserdata(L,-2);
index:=lua_toInteger(L,-1);
lua_pop(L, parameters);
lua_pushlightuserdata(L, menuitem.Items[index]);
luaclass_newClass(L, menuitem.Items[index]);
result:=1;
end else lua_pop(L, parameters);
end;
end;
function menuItem_add(L: PLua_State): integer; cdecl;
var
parameters: integer;
menuitem, menuitem2: TMenuItem;
begin
result:=0;
parameters:=lua_gettop(L);
if parameters=2 then
begin
menuitem:=lua_touserdata(L,-2);
menuitem2:=lua_touserdata(L,-1);
lua_pop(L, parameters);
menuitem:=luaclass_getClassObject(L);
if lua_gettop(L)>=1 then
begin
menuitem2:=lua_touserdata(L,-1);
menuitem.Add(menuitem2);
end else lua_pop(L, parameters);
end;
end;
function menuItem_insert(L: PLua_State): integer; cdecl;
@ -222,16 +172,13 @@ var
index: integer;
begin
result:=0;
parameters:=lua_gettop(L);
if parameters=3 then
menuitem:=luaclass_getClassObject(L);
if lua_gettop(L)>=2 then
begin
menuitem:=lua_touserdata(L,1);
index:=lua_tointeger(L, 2);
menuitem2:=lua_touserdata(L,3);
lua_pop(L, parameters);
index:=lua_tointeger(L, -2);
menuitem2:=lua_ToCEUserData(L,-1);
menuitem.Insert(index, menuitem2);
end else lua_pop(L, parameters);
end;
end;
function menuItem_delete(L: PLua_State): integer; cdecl;
@ -241,20 +188,25 @@ var
index: integer;
begin
result:=0;
parameters:=lua_gettop(L);
if parameters=2 then
menuitem:=luaclass_getClassObject(L);
if lua_gettop(L)>=1 then
begin
menuitem:=lua_touserdata(L,-2);
index:=lua_toInteger(L,-1);
lua_pop(L, parameters);
menuitem.Delete(index);
end else lua_pop(L, parameters);
end;
end;
function menuitem_onClick(L: PLua_State): integer; cdecl; //for some reason the menuitem has it's own fonclick variable
function menuitem_getOnClick(L: PLua_State): integer; cdecl;
var
c: Tmenuitem;
begin
c:=luaclass_getClassObject(L);
LuaCaller_pushMethodProperty(L, TMethod(c.OnClick), 'TNotifyEvent');
result:=1;
end;
function menuitem_setOnClick(L: PLua_State): integer; cdecl; //for some reason the menuitem has it's own fonclick variable
var
parameters: integer;
control: Tmenuitem;
f: integer;
routine: string;
@ -262,11 +214,9 @@ var
lc: TLuaCaller;
begin
result:=0;
parameters:=lua_gettop(L);
if parameters=2 then
control:=luaclass_getClassObject(L);
if lua_gettop(L)>=1 then
begin
control:=lua_touserdata(L,-2);
CleanupLuaCall(tmethod(control.onClick));
control.onClick:=nil;
@ -289,28 +239,49 @@ begin
end;
end;
lua_pop(L, parameters);
end;
function menuItem_doClick(L: PLua_State): integer; cdecl;
var
parameters: integer;
mi: TMenuItem;
Color: integer;
begin
result:=0;
parameters:=lua_gettop(L);
if parameters=1 then
begin
mi:=lua_touserdata(L,1);
if assigned(mi.onclick) then
mi.OnClick(mi);
end;
lua_pop(L, parameters);
mi:=luaclass_getClassObject(L);
if assigned(mi.onclick) then
mi.OnClick(mi);
end;
procedure menu_addMetaData(L: PLua_state; metatable: integer; userdata: integer );
begin
component_addMetaData(L, metatable, userdata);
luaclass_addClassFunctionToTable(L, metatable, userdata, 'menu_getItems', menu_getItems);
luaclass_addPropertyToTable(L, metatable, userdata, 'Items', menu_getItems, nil);
end;
procedure menuitem_addMetaData(L: PLua_state; metatable: integer; userdata: integer );
begin
component_addMetaData(L, metatable, userdata);
luaclass_addClassFunctionToTable(L, metatable, userdata, 'getCaption', menuItem_getCaption);
luaclass_addClassFunctionToTable(L, metatable, userdata, 'setCaption', menuItem_setCaption);
luaclass_addClassFunctionToTable(L, metatable, userdata, 'getShortcut', menuItem_getShortcut);
luaclass_addClassFunctionToTable(L, metatable, userdata, 'setShortcut', menuItem_setShortcut);
luaclass_addClassFunctionToTable(L, metatable, userdata, 'getCount', menuItem_getCount);
luaclass_addClassFunctionToTable(L, metatable, userdata, 'getItem', menuItem_getItem);
luaclass_addClassFunctionToTable(L, metatable, userdata, 'add', menuItem_add);
luaclass_addClassFunctionToTable(L, metatable, userdata, 'insert', menuItem_insert);
luaclass_addClassFunctionToTable(L, metatable, userdata, 'delete', menuItem_delete);
luaclass_addClassFunctionToTable(L, metatable, userdata, 'setOnClick', menuItem_setOnClick);
luaclass_addClassFunctionToTable(L, metatable, userdata, 'getOnClick', menuItem_getOnClick);
luaclass_addClassFunctionToTable(L, metatable, userdata, 'doClick', menuItem_doClick);
luaclass_addPropertyToTable(L, metatable, userdata, 'Caption', menuItem_getCaption, menuItem_setCaption);
luaclass_addPropertyToTable(L, metatable, userdata, 'Shortcut', menuItem_getShortcut, menuItem_setShortcut);
luaclass_addPropertyToTable(L, metatable, userdata, 'Count', menuItem_getCount, nil);
luaclass_addArrayPropertyToTable(L, metatable, userdata, 'Item', menuItem_getItem);
luaclass_addPropertyToTable(L, metatable, userdata, 'OnClick', menuItem_getOnClick, menuItem_setOnClick);
end;
procedure initializeLuaMenu;
begin
lua_register(LuaVM, 'menu_getItems', menu_getItems);
@ -327,9 +298,13 @@ begin
lua_register(LuaVM, 'menuItem_add', menuItem_add);
lua_register(LuaVM, 'menuItem_insert', menuItem_insert);
lua_register(LuaVM, 'menuItem_delete', menuItem_delete);
lua_register(LuaVM, 'menuItem_onClick', menuItem_onClick);
lua_register(LuaVM, 'menuItem_onClick', menuItem_setOnClick);
lua_register(LuaVM, 'menuItem_doClick', menuItem_doClick);
end;
initialization
luaclass_register(TMenu, Menu_addMetaData);
luaclass_register(TMenuItem, MenuItem_addMetaData);
end.

View File

@ -8,6 +8,7 @@ uses
Classes, SysUtils, controls, lua, lualib, lauxlib,LuaHandler, graphics;
procedure initializeLuaWinControl;
procedure wincontrol_addMetaData(L: PLua_state; metatable: integer; userdata: integer );
implementation

View File

@ -328,7 +328,7 @@ methods:
getOnClick(): Gets the onclick function
doClick(): Executes the current function under onClick
GraphicsObject :
GraphicsObject : (GraphicsObject->Object)
@ -379,7 +379,10 @@ menuItem_doClick(menuitem): Executes the onClick method if one is assigned
Menu Class: (Inheritance: Component->Object)
menu_getItems(menu) : Returns the MenuItem of this Menu
properties
Items : MenuItem - The base MenuItem class of this menu (readonly)
methods
getItems() : Returns the main MenuItem of this Menu
MainMenu Class: (Inheritance: Menu->Component->Object)
createMainMenu(form)
@ -387,7 +390,7 @@ createMainMenu(form)
PopupMenu Class: (Inheritance: Menu->Component->Object)
createPopupMenu(owner)
The popup menu is the menu that popus up when showing the (rightclick) context of an control
The popup menu is the menu that pops up when showing the (rightclick) context of an control
Strings Class: (Inheritance : Object) (Mostly an abstract class)

File diff suppressed because it is too large Load Diff

Binary file not shown.

View File

@ -39,6 +39,7 @@ type
tracecount: integer;
traceWindow: TfrmTracer;
traceQuitCondition: string;
traceStepOver: boolean; //perhaps also trace branches ?
//------------------
WaitingToContinue: boolean; //set to true when it's waiting for the user to continue
@ -273,6 +274,11 @@ BP can be nil if it's a single step breakpoint
}
var oldprotect,bw: dword;
d: TDisassembler;
nexteip: ptruint;
t: string;
b: PBreakpoint;
begin
context.EFlags:=eflags_setTF(context.EFlags,0);
@ -347,14 +353,37 @@ begin
end;
co_stepinto:
co_stepinto, co_stepover:
begin
//single step
singlestepping:=true;
if (bp=nil) or (bp.breakpointMethod=bpmDebugRegister) then
context.EFlags:=eflags_setRF(context.EFlags,1);//don't break on the current instruction
context.EFlags:=eflags_setTF(context.EFlags,1); //set the trap flag
if continueoption=co_stepinto then
context.EFlags:=eflags_setTF(context.EFlags,1) //set the trap flag
else
begin
//check if the current instruction is a call, if not, single step, else set a "run till" breakpoint (that doesn't cancel the stepping)
d:=TDisassembler.Create;
nexteip:=context.{$ifdef cpu64}rip{$else}eip{$endif};
d.disassemble(nexteip, t);
if d.LastDisassembleData.iscall then
begin
//set an execute breakpoint for this thread only at the next instruction and run till there
b:=TDebuggerthread(debuggerthread).SetOnExecuteBreakpoint(nexteip , false, ThreadId);
b.breakpointAction:=bo_BreakAndTrace;
//b.OneTimeOnly:=true;
end
else //if not, single step
context.EFlags:=eflags_setTF(context.EFlags,1);
end;
end;
//the other event types are just setting of one time breakpoints
@ -411,8 +440,10 @@ begin
end;
end;
ContinueFromBreakpoint(nil, co_stepinto);
if tracestepover then
ContinueFromBreakpoint(nil, co_stepover)
else
ContinueFromBreakpoint(nil, co_stepinto);
end
else
begin
@ -605,14 +636,15 @@ begin
isTracing:=true;
tracecount:=bpp.TraceCount;
traceWindow:=bpp.frmTracer;
traceStepOver:=bpp.tracestepOver;
if bpp.traceendcondition<>nil then
traceQuitCondition:=bpp.traceendcondition
else
traceQuitCondition:='';
TdebuggerThread(debuggerthread).RemoveBreakpoint(bpp);
end;
TdebuggerThread(debuggerthread).RemoveBreakpoint(bpp); //there can be only one
handleTrace;
end;

View File

@ -179,6 +179,7 @@ type
frmTracer: TfrmTracer;
tracecount: integer;
traceendcondition: pchar;
tracestepOver: boolean; //when set the tracer will step over instead of single step
//set if it's a bpaFetchRegistersandcontinue set on memory access
//ChangedAddresses: TfrmChangedAddresses; //set if it's a bpaFetchRegistersandcontinue set on execute

View File

@ -78,7 +78,7 @@ type
function isBreakpoint(address: uint_ptr; address2: uint_ptr=0; includeinactive: boolean=false): PBreakpoint;
function CodeFinderStop(codefinder: TFoundCodeDialog): boolean;
function setChangeRegBreakpoint(regmod: PRegisterModificationBP): PBreakpoint;
procedure setBreakAndTraceBreakpoint(frmTracer: TFrmTracer; address: ptrUint; BreakpointTrigger: TBreakpointTrigger; bpsize: integer; count: integer; condition:string='');
procedure setBreakAndTraceBreakpoint(frmTracer: TFrmTracer; address: ptrUint; BreakpointTrigger: TBreakpointTrigger; bpsize: integer; count: integer; condition:string=''; stepover: boolean=false);
function stopBreakAndTrace(frmTracer: TFrmTracer): boolean;
procedure FindWhatCodeAccesses(address: uint_ptr);
function FindWhatCodeAccessesStop(frmchangedaddresses: Tfrmchangedaddresses): boolean;
@ -1331,7 +1331,7 @@ begin
end;
procedure TDebuggerthread.setBreakAndTraceBreakpoint(frmTracer: TFrmTracer; address: ptrUint; BreakpointTrigger: TBreakpointTrigger; bpsize: integer; count: integer; condition:string='');
procedure TDebuggerthread.setBreakAndTraceBreakpoint(frmTracer: TFrmTracer; address: ptrUint; BreakpointTrigger: TBreakpointTrigger; bpsize: integer; count: integer; condition:string=''; stepover: boolean=false);
var
method: TBreakpointMethod;
useddebugregister: integer;
@ -1375,7 +1375,10 @@ begin
bp:=AddBreakpoint(nil, address, bpsize, BreakpointTrigger, method, bo_BreakAndTrace, usedDebugRegister, nil, 0, nil,frmTracer,count);
if bp<>nil then
begin
bp.traceendcondition:=strnew(pchar(condition));
bp.traceStepOver:=stepover;
end;
for i:=1 to length(bplist)-1 do
@ -1385,6 +1388,7 @@ begin
bpsecondary:=AddBreakpoint(bp, bplist[i].address, bplist[i].size, BreakpointTrigger, method, bo_BreakAndTrace, usedDebugregister, nil, 0, nil,frmTracer,count);
bpsecondary.traceendcondition:=strnew(pchar(condition));
bpsecondary.traceStepOver:=stepover;
end;

View File

@ -1,15 +1,15 @@
object frmTracerConfig: TfrmTracerConfig
Left = 555
Height = 206
Height = 220
Top = 113
Width = 231
BorderStyle = bsSingle
Caption = 'Break and Trace config'
ClientHeight = 206
ClientHeight = 220
ClientWidth = 231
OnShow = FormShow
Position = poScreenCenter
LCLVersion = '0.9.31'
LCLVersion = '1.1'
object edtMaxTrace: TEdit
Left = 16
Height = 23
@ -20,17 +20,17 @@ object frmTracerConfig: TfrmTracerConfig
end
object Label1: TLabel
Left = 16
Height = 16
Height = 15
Top = 8
Width = 112
Width = 111
Caption = 'Maximal trace count:'
ParentColor = False
end
object Label2: TLabel
Left = 16
Height = 16
Height = 15
Top = 56
Width = 203
Width = 202
Caption = 'Stop condition (Optional, LUA format)'
ParentColor = False
end
@ -44,7 +44,7 @@ object frmTracerConfig: TfrmTracerConfig
object btnOK: TButton
Left = 40
Height = 25
Top = 176
Top = 192
Width = 75
Caption = 'OK'
Default = True
@ -54,7 +54,7 @@ object frmTracerConfig: TfrmTracerConfig
object btnCancel: TButton
Left = 132
Height = 25
Top = 176
Top = 192
Width = 75
Cancel = True
Caption = 'Cancel'
@ -82,7 +82,7 @@ object frmTracerConfig: TfrmTracerConfig
object rbBreakOnAccess: TRadioButton
Left = 16
Height = 19
Top = 152
Top = 168
Width = 105
Caption = 'Break on Access'
TabOrder = 6
@ -91,7 +91,7 @@ object frmTracerConfig: TfrmTracerConfig
object rbBreakOnWrite: TRadioButton
Left = 128
Height = 19
Top = 152
Top = 168
Width = 97
Caption = 'Break on Write'
Checked = True
@ -99,4 +99,12 @@ object frmTracerConfig: TfrmTracerConfig
TabStop = True
Visible = False
end
object cbStepOver: TCheckBox
Left = 17
Height = 19
Top = 149
Width = 183
Caption = 'Step over instead of single step'
TabOrder = 8
end
end

View File

@ -8,3 +8,4 @@ TFRMTRACERCONFIG.CBDEREFERENCEADDRESSES.CAPTION=Dereference Addresses (Slows dow
TFRMTRACERCONFIG.CBSAVESTACK.CAPTION=Save stack snapshots (Eats memory)
TFRMTRACERCONFIG.RBBREAKONACCESS.CAPTION=Break on Access
TFRMTRACERCONFIG.RBBREAKONWRITE.CAPTION=Break on Write
TFRMTRACERCONFIG.CBSTEPOVER.CAPTION=Step over instead of single step

View File

@ -17,6 +17,7 @@ type
btnCancel: TButton;
cbDereferenceAddresses: TCheckBox;
cbSaveStack: TCheckBox;
cbStepOver: TCheckBox;
edtMaxTrace: TEdit;
edtCondition: TEdit;
Label1: TLabel;

View File

@ -128,6 +128,8 @@ type
fDataTrace: boolean;
stepover: boolean;
procedure configuredisplay;
procedure setSavestack(x: boolean);
procedure updatestackview;
@ -298,7 +300,7 @@ begin
else
thisnode:=lvTracer.Items.AddObject(nil,s,d);
if defaultDisassembler.LastDisassembleData.iscall then
if not stepover and defaultDisassembler.LastDisassembleData.iscall then
currentAppendage:=thisnode;
if defaultDisassembler.LastDisassembleData.isret then
@ -380,6 +382,7 @@ begin
tcount:=strtoint(edtMaxTrace.text);
condition:=edtCondition.text;
stepover:=cbStepOver.checked;
if startdebuggerifneeded then
begin
@ -398,14 +401,14 @@ begin
memorybrowser.hexview.GetSelectionRange(fromaddress,toaddress);
//set the breakpoint
debuggerthread.setBreakAndTraceBreakpoint(self, fromaddress, bpTrigger, 1+(toaddress-fromaddress), tcount, condition);
debuggerthread.setBreakAndTraceBreakpoint(self, fromaddress, bpTrigger, 1+(toaddress-fromaddress), tcount, condition, stepover);
end
else
begin
if (owner is TMemoryBrowser) then
debuggerthread.setBreakAndTraceBreakpoint(self, (owner as TMemoryBrowser).disassemblerview.SelectedAddress, bptExecute, 1, tcount, condition)
debuggerthread.setBreakAndTraceBreakpoint(self, (owner as TMemoryBrowser).disassemblerview.SelectedAddress, bptExecute, 1, tcount, condition, StepOver)
else
debuggerthread.setBreakAndTraceBreakpoint(self, memorybrowser.disassemblerview.SelectedAddress, bptExecute,1, tcount, condition);
debuggerthread.setBreakAndTraceBreakpoint(self, memorybrowser.disassemblerview.SelectedAddress, bptExecute,1, tcount, condition, StepOver);
end;
end;