mirror of
https://gitlab.com/freepascal.org/lazarus/lazarus.git
synced 2025-09-22 13:59:16 +02:00
FpGdbmiDebugger: fixes for nested proc / tests
git-svn-id: trunk@44709 -
This commit is contained in:
parent
78869bf7b8
commit
99beb437a1
@ -89,6 +89,7 @@ type
|
|||||||
property ThreadId: Integer read FThreadId write FThreadId;
|
property ThreadId: Integer read FThreadId write FThreadId;
|
||||||
property StackFrame: Integer read FStackFrame write FStackFrame;
|
property StackFrame: Integer read FStackFrame write FStackFrame;
|
||||||
|
|
||||||
|
function ApplyContext(AVal: TFpDbgValue): TFpDbgValue; inline;
|
||||||
function SymbolToValue(ASym: TFpDbgSymbol): TFpDbgValue; inline;
|
function SymbolToValue(ASym: TFpDbgSymbol): TFpDbgValue; inline;
|
||||||
procedure AddRefToVal(AVal: TFpDbgValue); inline;
|
procedure AddRefToVal(AVal: TFpDbgValue); inline;
|
||||||
function GetSelfParameter: TFpDbgValue; virtual;
|
function GetSelfParameter: TFpDbgValue; virtual;
|
||||||
@ -966,6 +967,12 @@ begin
|
|||||||
Result := FDwarf.MemManager;
|
Result := FDwarf.MemManager;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
function TFpDwarfInfoAddressContext.ApplyContext(AVal: TFpDbgValue): TFpDbgValue;
|
||||||
|
begin
|
||||||
|
if (AVal <> nil) and (TFpDwarfValueBase(AVal).FContext = nil) then
|
||||||
|
TFpDwarfValueBase(AVal).FContext := Self;
|
||||||
|
end;
|
||||||
|
|
||||||
function TFpDwarfInfoAddressContext.SymbolToValue(ASym: TFpDbgSymbol): TFpDbgValue;
|
function TFpDwarfInfoAddressContext.SymbolToValue(ASym: TFpDbgSymbol): TFpDbgValue;
|
||||||
begin
|
begin
|
||||||
if ASym = nil then begin
|
if ASym = nil then begin
|
||||||
@ -992,7 +999,7 @@ end;
|
|||||||
function TFpDwarfInfoAddressContext.GetSelfParameter: TFpDbgValue;
|
function TFpDwarfInfoAddressContext.GetSelfParameter: TFpDbgValue;
|
||||||
begin
|
begin
|
||||||
Result := TFpDwarfSymbolValueProc(FSymbol).GetSelfParameter(FAddress);
|
Result := TFpDwarfSymbolValueProc(FSymbol).GetSelfParameter(FAddress);
|
||||||
if TFpDwarfValueBase(Result).FContext = nil then
|
if (Result <> nil) and (TFpDwarfValueBase(Result).FContext = nil) then
|
||||||
TFpDwarfValueBase(Result).FContext := Self;
|
TFpDwarfValueBase(Result).FContext := Self;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
@ -1235,8 +1242,7 @@ begin
|
|||||||
FlastResult := Result;
|
FlastResult := Result;
|
||||||
|
|
||||||
assert((Result = nil) or (Result is TFpDwarfValueBase), 'TDbgDwarfInfoAddressContext.FindSymbol: (Result = nil) or (Result is TFpDwarfValueBase)');
|
assert((Result = nil) or (Result is TFpDwarfValueBase), 'TDbgDwarfInfoAddressContext.FindSymbol: (Result = nil) or (Result is TFpDwarfValueBase)');
|
||||||
if (Result <> nil) and (TFpDwarfValueBase(Result).FContext = nil) then
|
ApplyContext(Result);
|
||||||
TFpDwarfValueBase(Result).FContext := Self;
|
|
||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
@ -112,6 +112,7 @@ begin
|
|||||||
|
|
||||||
ParentFpSym := TFpDwarfSymbol.CreateSubClass(AName, InfoEntry);
|
ParentFpSym := TFpDwarfSymbol.CreateSubClass(AName, InfoEntry);
|
||||||
ParentFpVal := ParentFpSym.Value;
|
ParentFpVal := ParentFpSym.Value;
|
||||||
|
ApplyContext(ParentFpVal);
|
||||||
//TFpDwarfSymbol(ADbgValue.DbgSymbol).ParentTypeInfo := TFpDwarfSymbolValueProc(FSymbol);
|
//TFpDwarfSymbol(ADbgValue.DbgSymbol).ParentTypeInfo := TFpDwarfSymbolValueProc(FSymbol);
|
||||||
if not (svfOrdinal in ParentFpVal.FieldFlags) then begin
|
if not (svfOrdinal in ParentFpVal.FieldFlags) then begin
|
||||||
DebugLn('no ordinal for parentfp');
|
DebugLn('no ordinal for parentfp');
|
||||||
|
@ -115,10 +115,11 @@ type
|
|||||||
Result: Array [TSymbolType] of TWatchExpectationResult;
|
Result: Array [TSymbolType] of TWatchExpectationResult;
|
||||||
|
|
||||||
TheWatch: TTestWatch;
|
TheWatch: TTestWatch;
|
||||||
UserData: Pointer;
|
UserData, UserData2: Pointer;
|
||||||
OnBeforeTest: TWatchExpectOnBeforeTest;
|
OnBeforeTest: TWatchExpectOnBeforeTest;
|
||||||
end;
|
end;
|
||||||
TWatchExpectationArray = array of TWatchExpectation;
|
TWatchExpectationArray = array of TWatchExpectation;
|
||||||
|
PWatchExpectationArray = ^TWatchExpectationArray;
|
||||||
|
|
||||||
{ TTestWatchesBase }
|
{ TTestWatchesBase }
|
||||||
|
|
||||||
@ -418,9 +419,9 @@ begin
|
|||||||
|
|
||||||
// Get Value
|
// Get Value
|
||||||
n := Data.TestName;
|
n := Data.TestName;
|
||||||
LogToFile('###### ' + n + '######' +LineEnding);
|
LogToFile('###### ' + n + '###### '+adbg.GetLocation.SrcFile+' '+IntToStr(ADbg.GetLocation.SrcLine) +LineEnding);
|
||||||
if n = '' then n := Data.Expression + ' (' + TWatchDisplayFormatNames[Data.DspFormat] + ', ' + dbgs(Data.EvaluateFlags) + ')';
|
if n = '' then n := Data.Expression + ' (' + TWatchDisplayFormatNames[Data.DspFormat] + ', ' + dbgs(Data.EvaluateFlags) + ')';
|
||||||
Name := Name + ' ' + n;
|
Name := Name + ' ' + n + ' ::: '+adbg.GetLocation.SrcFile+' '+IntToStr(ADbg.GetLocation.SrcLine);
|
||||||
flag := AWatch <> nil; // test for typeinfo/kind // Awatch=nil > direct gdb command
|
flag := AWatch <> nil; // test for typeinfo/kind // Awatch=nil > direct gdb command
|
||||||
IsValid := True;
|
IsValid := True;
|
||||||
HasTpInfo := True;
|
HasTpInfo := True;
|
||||||
|
@ -19,10 +19,18 @@ type
|
|||||||
PSimpleEnum1 = ^TSimpleEnum1;
|
PSimpleEnum1 = ^TSimpleEnum1;
|
||||||
PSimpleSet1 = ^TSimpleSet1;
|
PSimpleSet1 = ^TSimpleSet1;
|
||||||
|
|
||||||
|
{ TSimpleClass0 }
|
||||||
|
|
||||||
|
TSimpleClass0 = class
|
||||||
|
// NO fields // NO param
|
||||||
|
procedure Test0Method;
|
||||||
|
end;
|
||||||
|
|
||||||
{ TSimpleClass1 }
|
{ TSimpleClass1 }
|
||||||
|
|
||||||
TSimpleClass1 = class
|
TSimpleClass1 = class(TSimpleClass0)
|
||||||
public
|
public
|
||||||
|
{%region Fields}
|
||||||
Field_Short1: ShortInt;
|
Field_Short1: ShortInt;
|
||||||
Field_Small1: Smallint;
|
Field_Small1: Smallint;
|
||||||
Field_Int1: LongInt;
|
Field_Int1: LongInt;
|
||||||
@ -61,9 +69,11 @@ type
|
|||||||
Field_PBool1, Field_PBool2: PBoolean;
|
Field_PBool1, Field_PBool2: PBoolean;
|
||||||
Field_PEnum1, Field_PEnum2: PSimpleEnum1;
|
Field_PEnum1, Field_PEnum2: PSimpleEnum1;
|
||||||
Field_PSet1, Field_PSet2: PSimpleSet1;
|
Field_PSet1, Field_PSet2: PSimpleSet1;
|
||||||
|
{%endregion Fields}
|
||||||
|
|
||||||
procedure InitFields;
|
procedure InitFields;
|
||||||
procedure Test1Method(
|
procedure Test1Method(
|
||||||
|
{%region Param}
|
||||||
Arg_Short1: ShortInt;
|
Arg_Short1: ShortInt;
|
||||||
Arg_Small1: Smallint;
|
Arg_Small1: Smallint;
|
||||||
Arg_Int1: LongInt;
|
Arg_Int1: LongInt;
|
||||||
@ -142,6 +152,7 @@ type
|
|||||||
var VArg_PBool1, VArg_PBool2: PBoolean;
|
var VArg_PBool1, VArg_PBool2: PBoolean;
|
||||||
var VArg_PEnum1, VArg_PEnum2: PSimpleEnum1;
|
var VArg_PEnum1, VArg_PEnum2: PSimpleEnum1;
|
||||||
var VArg_PSet1, VArg_PSet2: PSimpleSet1
|
var VArg_PSet1, VArg_PSet2: PSimpleSet1
|
||||||
|
{%endregion Param}
|
||||||
);
|
);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
@ -152,6 +163,7 @@ type
|
|||||||
end;
|
end;
|
||||||
|
|
||||||
var
|
var
|
||||||
|
{%region Global}
|
||||||
SimpleGlob_Short1: ShortInt;
|
SimpleGlob_Short1: ShortInt;
|
||||||
SimpleGlob_Small1: Smallint;
|
SimpleGlob_Small1: Smallint;
|
||||||
SimpleGlob_Int1: LongInt;
|
SimpleGlob_Int1: LongInt;
|
||||||
@ -210,6 +222,7 @@ var
|
|||||||
SimpleGlob_P2Bool1, SimpleGlob_P2Bool2: PBoolean;
|
SimpleGlob_P2Bool1, SimpleGlob_P2Bool2: PBoolean;
|
||||||
SimpleGlob_P2Enum1, SimpleGlob_P2Enum2: PSimpleEnum1;
|
SimpleGlob_P2Enum1, SimpleGlob_P2Enum2: PSimpleEnum1;
|
||||||
SimpleGlob_P2Set1, SimpleGlob_P2Set2: PSimpleSet1;
|
SimpleGlob_P2Set1, SimpleGlob_P2Set2: PSimpleSet1;
|
||||||
|
{%endregion Global}
|
||||||
|
|
||||||
|
|
||||||
// Additional Globals
|
// Additional Globals
|
||||||
@ -229,10 +242,14 @@ var
|
|||||||
|
|
||||||
SimpleGlob_Comp2, SimpleGlob_Comp3: Comp;
|
SimpleGlob_Comp2, SimpleGlob_Comp3: Comp;
|
||||||
|
|
||||||
|
SimpleGlob_Class0: TSimpleClass0;
|
||||||
SimpleGlob_Class1: TSimpleClass1;
|
SimpleGlob_Class1: TSimpleClass1;
|
||||||
SimpleGlob_Class2: TSimpleClass2;
|
SimpleGlob_Class2: TSimpleClass2;
|
||||||
|
|
||||||
|
SimpleGlob_Dummy: Integer;
|
||||||
|
|
||||||
procedure Test1Sub(
|
procedure Test1Sub(
|
||||||
|
{%region Param}
|
||||||
SimpleArg_Short1: ShortInt;
|
SimpleArg_Short1: ShortInt;
|
||||||
SimpleArg_Small1: Smallint;
|
SimpleArg_Small1: Smallint;
|
||||||
SimpleArg_Int1: LongInt;
|
SimpleArg_Int1: LongInt;
|
||||||
@ -265,9 +282,10 @@ procedure Test1Sub(
|
|||||||
SimpleArg_Class2: TSimpleClass2;
|
SimpleArg_Class2: TSimpleClass2;
|
||||||
var SimpleVArg_Class1: TSimpleClass1;
|
var SimpleVArg_Class1: TSimpleClass1;
|
||||||
var SimpleVArg_Class2: TSimpleClass2
|
var SimpleVArg_Class2: TSimpleClass2
|
||||||
|
{%endregion Param}
|
||||||
);
|
);
|
||||||
var
|
var
|
||||||
|
{%region Local}
|
||||||
Local_Short1: ShortInt;
|
Local_Short1: ShortInt;
|
||||||
Local_Small1: Smallint;
|
Local_Small1: Smallint;
|
||||||
Local_Int1 : LongInt;
|
Local_Int1 : LongInt;
|
||||||
@ -283,7 +301,7 @@ var
|
|||||||
Local_Ext1: Extended;
|
Local_Ext1: Extended;
|
||||||
|
|
||||||
SimplePArg_Int1, SimplePVArg_Int1, SimplePLocal_Int1, SimplePGlob_Int1: PLongInt;
|
SimplePArg_Int1, SimplePVArg_Int1, SimplePLocal_Int1, SimplePGlob_Int1: PLongInt;
|
||||||
|
{%endregion Local}
|
||||||
begin
|
begin
|
||||||
Local_Short1 := 39;
|
Local_Short1 := 39;
|
||||||
SimpleGlob_Short1 := 29;
|
SimpleGlob_Short1 := 29;
|
||||||
@ -352,7 +370,24 @@ begin
|
|||||||
SimplePLocal_Int1 := @Local_Int1;
|
SimplePLocal_Int1 := @Local_Int1;
|
||||||
SimplePGlob_Int1 := @SimpleGlob_Int1;
|
SimplePGlob_Int1 := @SimpleGlob_Int1;
|
||||||
|
|
||||||
inc(SimpleVArg_Int1); // BREAK Single 1
|
inc(SimpleGlob_Dummy); // BREAK Single 1
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure Simple_NoneNested;
|
||||||
|
begin
|
||||||
|
inc(SimpleGlob_Dummy); // BREAK Single 2
|
||||||
|
end;
|
||||||
|
|
||||||
|
{ TSimpleClass0 }
|
||||||
|
|
||||||
|
procedure TSimpleClass0.Test0Method;
|
||||||
|
procedure Nested0;
|
||||||
|
begin
|
||||||
|
inc(SimpleGlob_Dummy); // BREAK Single 10
|
||||||
|
end;
|
||||||
|
begin
|
||||||
|
inc(SimpleGlob_Dummy); // BREAK Single 9
|
||||||
|
Nested0;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
{ TSimpleClass1 }
|
{ TSimpleClass1 }
|
||||||
@ -466,6 +501,12 @@ var
|
|||||||
Local_PBool1, Local_PBool2: PBoolean;
|
Local_PBool1, Local_PBool2: PBoolean;
|
||||||
Local_PEnum1, Local_PEnum2: PSimpleEnum1;
|
Local_PEnum1, Local_PEnum2: PSimpleEnum1;
|
||||||
Local_PSet1, Local_PSet2: PSimpleSet1;
|
Local_PSet1, Local_PSet2: PSimpleSet1;
|
||||||
|
|
||||||
|
procedure Nested1;
|
||||||
|
begin
|
||||||
|
inc(SimpleGlob_Dummy); // BREAK Single 4
|
||||||
|
Simple_NoneNested;
|
||||||
|
end;
|
||||||
begin
|
begin
|
||||||
InitFields;
|
InitFields;
|
||||||
|
|
||||||
@ -567,15 +608,39 @@ begin
|
|||||||
{%endregion VARG}
|
{%endregion VARG}
|
||||||
|
|
||||||
|
|
||||||
inc(SimpleGlob_Byte2); // BREAK Single 2
|
inc(SimpleGlob_Dummy); // BREAK Single 3
|
||||||
|
Nested1;
|
||||||
|
Simple_NoneNested;
|
||||||
|
Test0Method;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
{ TSimpleClass2 }
|
{ TSimpleClass2 }
|
||||||
|
|
||||||
procedure TSimpleClass2.Test2Method;
|
procedure TSimpleClass2.Test2Method;
|
||||||
|
procedure Nested2a;
|
||||||
|
begin
|
||||||
|
inc(SimpleGlob_Dummy); // BREAK Single 6
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure Nested2b(x: Boolean = False);
|
||||||
|
procedure Nested2c;
|
||||||
|
begin
|
||||||
|
inc(SimpleGlob_Dummy); // BREAK Single 7
|
||||||
|
Nested2a;
|
||||||
|
end;
|
||||||
|
begin
|
||||||
|
inc(SimpleGlob_Dummy); // BREAK Single 8
|
||||||
|
if x then
|
||||||
|
Nested2c
|
||||||
|
else
|
||||||
|
Nested2b(True);
|
||||||
|
end;
|
||||||
|
|
||||||
begin
|
begin
|
||||||
InitFields;
|
InitFields;
|
||||||
inc(SimpleGlob_Byte1); // BREAK Single 3
|
inc(SimpleGlob_Dummy); // BREAK Single 5
|
||||||
|
Nested2a;
|
||||||
|
Nested2b;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure Test1;
|
procedure Test1;
|
||||||
@ -604,6 +669,7 @@ begin
|
|||||||
d2 := -2345;
|
d2 := -2345;
|
||||||
d3 := -3456;
|
d3 := -3456;
|
||||||
|
|
||||||
|
SimpleGlob_Class0 := TSimpleClass0.Create;
|
||||||
SimpleGlob_Class1 := TSimpleClass1.Create;
|
SimpleGlob_Class1 := TSimpleClass1.Create;
|
||||||
SimpleGlob_Class2 := TSimpleClass2.Create;
|
SimpleGlob_Class2 := TSimpleClass2.Create;
|
||||||
|
|
||||||
@ -649,7 +715,6 @@ begin
|
|||||||
SimpleGlob_Class1, SimpleGlob_Class2, SimpleGlob_Class1, SimpleGlob_Class2
|
SimpleGlob_Class1, SimpleGlob_Class2, SimpleGlob_Class1, SimpleGlob_Class2
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
||||||
{%region global }
|
{%region global }
|
||||||
SimpleGlob_Short1 := 11;
|
SimpleGlob_Short1 := 11;
|
||||||
SimpleGlob_Small1 := 112;
|
SimpleGlob_Small1 := 112;
|
||||||
@ -720,9 +785,6 @@ begin
|
|||||||
SimpleGlob_P2Set1 := @SimpleGlob_Set1;
|
SimpleGlob_P2Set1 := @SimpleGlob_Set1;
|
||||||
SimpleGlob_P2Set2 := @SimpleGlob_Set2;
|
SimpleGlob_P2Set2 := @SimpleGlob_Set2;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
SimpleGlob_Class1.Test1Method(
|
SimpleGlob_Class1.Test1Method(
|
||||||
SimpleGlob_Short1,
|
SimpleGlob_Short1,
|
||||||
SimpleGlob_Small1,
|
SimpleGlob_Small1,
|
||||||
@ -804,7 +866,12 @@ begin
|
|||||||
SimpleGlob_P2Set1, SimpleGlob_P2Set2
|
SimpleGlob_P2Set1, SimpleGlob_P2Set2
|
||||||
|
|
||||||
);
|
);
|
||||||
|
|
||||||
SimpleGlob_Class2.Test2Method;
|
SimpleGlob_Class2.Test2Method;
|
||||||
|
SimpleGlob_Class2.Test0Method;
|
||||||
|
|
||||||
|
SimpleGlob_Class0.Test0Method;
|
||||||
|
|
||||||
end;
|
end;
|
||||||
|
|
||||||
end.
|
end.
|
||||||
|
@ -10,9 +10,37 @@ uses
|
|||||||
TestWatchUtils, GDBMIDebugger;
|
TestWatchUtils, GDBMIDebugger;
|
||||||
|
|
||||||
const
|
const
|
||||||
BREAK_LINE_TestWatchesUnitSimple_1 = 355;
|
BREAK_COUNT_TestWatchesUnitSimple = 17;
|
||||||
BREAK_LINE_TestWatchesUnitSimple_2 = 570;
|
BL_TW1 = 373; // Test1Sub
|
||||||
BREAK_LINE_TestWatchesUnitSimple_3 = 578;
|
BL_TW2 = 378; // Simple_NoneNested
|
||||||
|
BL_TW3 = 611; // Test1Method
|
||||||
|
BL_TW4 = 507; // Test1Method Nested1
|
||||||
|
BL_TW5 = 641; // Test2Method
|
||||||
|
BL_TW6 = 622; // Test2Method Nested2a
|
||||||
|
BL_TW7 = 628; // Test2Method Nested2b
|
||||||
|
BL_TW8 = 632; // Test2Method Nested2c
|
||||||
|
BL_TW9 = 389; // Test0Method
|
||||||
|
BL_TW10 = 386; // Test0Method Nested0
|
||||||
|
BREAK_LINE_TestWatchesUnitSimple: array [1..BREAK_COUNT_TestWatchesUnitSimple] of Integer =
|
||||||
|
( BL_TW1, // 1: Test1Sub
|
||||||
|
BL_TW3, // 2: Class1.Test1Method
|
||||||
|
BL_TW4, // 3: Class1.Test1Method > Nested1
|
||||||
|
BL_TW2, // 4: Class1.Test1Method > Nested1 > Simple_NoneNested
|
||||||
|
BL_TW2, // 5: Class1.Test1Method > Simple_NoneNested
|
||||||
|
BL_TW9, // 6: Class1.Test1Method > Test0Method
|
||||||
|
BL_TW10, // 7: Class1.Test1Method > Test0Method > Nested0
|
||||||
|
BL_TW5, // 8: Class2.Test2Method
|
||||||
|
BL_TW6, // 9: Class2.Test2Method > Nested2a
|
||||||
|
BL_TW7, // 10: Class2.Test2Method > Nested2b
|
||||||
|
BL_TW7, // 11: Class2.Test2Method > Nested2b > Nested2b
|
||||||
|
BL_TW8, // 12: Class2.Test2Method > Nested2b > Nested2b > Nested2c
|
||||||
|
BL_TW6, // 13: Class2.Test2Method > Nested2b > Nested2b > Nested2c > Nested2a
|
||||||
|
BL_TW9, // 14: Class2.Test0Method
|
||||||
|
|
||||||
|
BL_TW10, // 15: Class2.Test0Method > Nested0
|
||||||
|
BL_TW9, // 16: Class0.Test0Method
|
||||||
|
BL_TW10 // 17: Class0.Test0Method > Nested0
|
||||||
|
);
|
||||||
|
|
||||||
BREAK_LINE_TestWatchesUnitArray = 842;
|
BREAK_LINE_TestWatchesUnitArray = 842;
|
||||||
|
|
||||||
@ -24,13 +52,11 @@ type
|
|||||||
private
|
private
|
||||||
FWatches: TWatches;
|
FWatches: TWatches;
|
||||||
|
|
||||||
ExpectBreakSimple_1: TWatchExpectationArray;
|
ExpectBreakSimple: array [1..BREAK_COUNT_TestWatchesUnitSimple] of TWatchExpectationArray;
|
||||||
ExpectBreakSimple_2: TWatchExpectationArray;
|
|
||||||
ExpectBreakSimple_3: TWatchExpectationArray;
|
|
||||||
|
|
||||||
ExpectBreakArray_1: TWatchExpectationArray;
|
ExpectBreakArray_1: TWatchExpectationArray;
|
||||||
|
|
||||||
FCurrentExpect: ^TWatchExpectationArray; // currently added to
|
FCurrentExpect: PWatchExpectationArray; // currently added to
|
||||||
|
|
||||||
FDbgOutPut: String;
|
FDbgOutPut: String;
|
||||||
FDbgOutPutEnable: Boolean;
|
FDbgOutPutEnable: Boolean;
|
||||||
@ -52,9 +78,7 @@ type
|
|||||||
procedure AdjustExpectToAddress(AWatchExp: PWatchExpectation); // only ExpectBreakSimple_1
|
procedure AdjustExpectToAddress(AWatchExp: PWatchExpectation); // only ExpectBreakSimple_1
|
||||||
procedure AdjustArrayExpectToAddress(AWatchExp: PWatchExpectation); // only ExpectBreakSimple_1
|
procedure AdjustArrayExpectToAddress(AWatchExp: PWatchExpectation); // only ExpectBreakSimple_1
|
||||||
|
|
||||||
procedure AddExpectSimple_1;
|
procedure AddExpectSimple;
|
||||||
procedure AddExpectSimple_2(DoAddExp_3: Boolean = False);
|
|
||||||
procedure AddExpectSimple_3;
|
|
||||||
procedure AddExpectArray_1;
|
procedure AddExpectArray_1;
|
||||||
procedure RunTestWatches(NamePreFix: String;
|
procedure RunTestWatches(NamePreFix: String;
|
||||||
TestExeName, ExtraOpts: String;
|
TestExeName, ExtraOpts: String;
|
||||||
@ -114,8 +138,10 @@ var
|
|||||||
OtherWatchExp: TWatchExpectation;
|
OtherWatchExp: TWatchExpectation;
|
||||||
s: String;
|
s: String;
|
||||||
st: TSymbolType;
|
st: TSymbolType;
|
||||||
|
OtherList: PWatchExpectationArray;
|
||||||
begin
|
begin
|
||||||
OtherWatchExp := ExpectBreakSimple_1[PtrUInt(AWatchExp^.UserData)];
|
OtherList := PWatchExpectationArray(AWatchExp^.UserData2);
|
||||||
|
OtherWatchExp := OtherList^[PtrUInt(AWatchExp^.UserData)];
|
||||||
if OtherWatchExp.TheWatch = nil then begin
|
if OtherWatchExp.TheWatch = nil then begin
|
||||||
debugln(['SKIPPING watch update']);
|
debugln(['SKIPPING watch update']);
|
||||||
exit;
|
exit;
|
||||||
@ -131,7 +157,10 @@ var
|
|||||||
OtherWatchExp: TWatchExpectation;
|
OtherWatchExp: TWatchExpectation;
|
||||||
s: String;
|
s: String;
|
||||||
st: TSymbolType;
|
st: TSymbolType;
|
||||||
|
OtherList: PWatchExpectationArray;
|
||||||
begin
|
begin
|
||||||
|
OtherList := PWatchExpectationArray(AWatchExp^.UserData2);
|
||||||
|
//OtherWatchExp := OtherList^[PtrUInt(AWatchExp^.UserData)];
|
||||||
OtherWatchExp := ExpectBreakArray_1[PtrUInt(AWatchExp^.UserData)];
|
OtherWatchExp := ExpectBreakArray_1[PtrUInt(AWatchExp^.UserData)];
|
||||||
if OtherWatchExp.TheWatch = nil then begin
|
if OtherWatchExp.TheWatch = nil then begin
|
||||||
debugln(['SKIPPING watch update']);
|
debugln(['SKIPPING watch update']);
|
||||||
@ -155,18 +184,22 @@ begin
|
|||||||
end;
|
end;
|
||||||
|
|
||||||
procedure TTestWatches.ClearAllTestArrays;
|
procedure TTestWatches.ClearAllTestArrays;
|
||||||
|
var
|
||||||
|
i: Integer;
|
||||||
begin
|
begin
|
||||||
//SetLength(ExpectBreakFooGdb, 0);
|
for i := 1 to BREAK_COUNT_TestWatchesUnitSimple do
|
||||||
//SetLength(ExpectBreakSubFoo, 0);
|
SetLength(ExpectBreakSimple[i], 0);
|
||||||
|
SetLength(ExpectBreakArray_1, 0);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
function TTestWatches.HasTestArraysData: Boolean;
|
function TTestWatches.HasTestArraysData: Boolean;
|
||||||
|
var
|
||||||
|
i: Integer;
|
||||||
begin
|
begin
|
||||||
Result :=
|
Result :=
|
||||||
(Length(ExpectBreakSimple_1) > 0) or
|
|
||||||
(Length(ExpectBreakSimple_2) > 0) or
|
|
||||||
(Length(ExpectBreakSimple_3) > 0) or
|
|
||||||
(Length(ExpectBreakArray_1) > 0);
|
(Length(ExpectBreakArray_1) > 0);
|
||||||
|
for i := 1 to BREAK_COUNT_TestWatchesUnitSimple do
|
||||||
|
Result := Result or (Length(ExpectBreakSimple[i]) > 0);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
function TTestWatches.Add(AnExpr: string; AFmt: TWatchDisplayFormat; AMtch: string;
|
function TTestWatches.Add(AnExpr: string; AFmt: TWatchDisplayFormat; AMtch: string;
|
||||||
@ -206,16 +239,14 @@ begin
|
|||||||
Result := AddFmtDef(AnExpr, '^'+IntToStr(AMtch), skSimple, ATpNm, [fTpMtch]);
|
Result := AddFmtDef(AnExpr, '^'+IntToStr(AMtch), skSimple, ATpNm, [fTpMtch]);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure TTestWatches.AddExpectSimple_1;
|
procedure TTestWatches.AddExpectSimple;
|
||||||
|
procedure AddExpectSimple_Test1Sub;
|
||||||
var
|
var
|
||||||
i: Integer;
|
i, j: Integer;
|
||||||
s, s2, s2def: String;
|
s, s2, s2def: String;
|
||||||
j: Integer;
|
|
||||||
r: PWatchExpectation;
|
r: PWatchExpectation;
|
||||||
begin
|
begin
|
||||||
FCurrentExpect := @ExpectBreakSimple_1;
|
{%region Int/Cardinal types}
|
||||||
|
|
||||||
{%region Int?Cardinal types}
|
|
||||||
for i := 0 to 3 do begin
|
for i := 0 to 3 do begin
|
||||||
s2def := '';
|
s2def := '';
|
||||||
case i of
|
case i of
|
||||||
@ -374,7 +405,7 @@ begin
|
|||||||
AddSimpleInt(Format(s, ['Field_DWord1']), j+17, 'LongWord');
|
AddSimpleInt(Format(s, ['Field_DWord1']), j+17, 'LongWord');
|
||||||
AddSimpleInt(Format(s, ['Field_QWord1']), j+18, 'QWord');
|
AddSimpleInt(Format(s, ['Field_QWord1']), j+18, 'QWord');
|
||||||
end;
|
end;
|
||||||
{%region}
|
{%endregion}
|
||||||
|
|
||||||
s := '%s';
|
s := '%s';
|
||||||
AddFmtDef(Format(s, ['SimpleGlob_Single1']), '^99\.(2|19)', skSimple, '', [fTpMtch]);
|
AddFmtDef(Format(s, ['SimpleGlob_Single1']), '^99\.(2|19)', skSimple, '', [fTpMtch]);
|
||||||
@ -387,41 +418,56 @@ begin
|
|||||||
r := AddFmtDef('@SimpleArg_Int1', 'replaceme', skPointer, '');
|
r := AddFmtDef('@SimpleArg_Int1', 'replaceme', skPointer, '');
|
||||||
r^.OnBeforeTest := @AdjustExpectToAddress;
|
r^.OnBeforeTest := @AdjustExpectToAddress;
|
||||||
r^.UserData := pointer(ptruint(Length(FCurrentExpect^)));
|
r^.UserData := pointer(ptruint(Length(FCurrentExpect^)));
|
||||||
|
r^.UserData2 := FCurrentExpect;
|
||||||
AddFmtDef('SimplePArg_Int1', '\$[0-9A-F]', skPointer, '');
|
AddFmtDef('SimplePArg_Int1', '\$[0-9A-F]', skPointer, '');
|
||||||
|
|
||||||
r := AddFmtDef('@SimpleVArg_Int1', 'replaceme', skPointer, '');
|
r := AddFmtDef('@SimpleVArg_Int1', 'replaceme', skPointer, '');
|
||||||
UpdResMinFpc(r, stSymAll, 020600);
|
UpdResMinFpc(r, stSymAll, 020600);
|
||||||
r^.OnBeforeTest := @AdjustExpectToAddress;
|
r^.OnBeforeTest := @AdjustExpectToAddress;
|
||||||
r^.UserData := pointer(PtrUInt(Length(FCurrentExpect^)));
|
r^.UserData := pointer(PtrUInt(Length(FCurrentExpect^)));
|
||||||
|
r^.UserData2 := FCurrentExpect;
|
||||||
AddFmtDef('SimplePVArg_Int1', '\$[0-9A-F]', skPointer, '');
|
AddFmtDef('SimplePVArg_Int1', '\$[0-9A-F]', skPointer, '');
|
||||||
|
|
||||||
r := AddFmtDef('@Local_Int1', 'replaceme', skPointer, '');
|
r := AddFmtDef('@Local_Int1', 'replaceme', skPointer, '');
|
||||||
r^.OnBeforeTest := @AdjustExpectToAddress;
|
r^.OnBeforeTest := @AdjustExpectToAddress;
|
||||||
r^.UserData := pointer(PtrUInt(Length(FCurrentExpect^)));
|
r^.UserData := pointer(PtrUInt(Length(FCurrentExpect^)));
|
||||||
|
r^.UserData2 := FCurrentExpect;
|
||||||
AddFmtDef('SimplePLocal_Int1', '\$[0-9A-F]', skPointer, '');
|
AddFmtDef('SimplePLocal_Int1', '\$[0-9A-F]', skPointer, '');
|
||||||
|
|
||||||
r := AddFmtDef('@SimpleGlob_Int1', 'replaceme', skPointer, '');
|
r := AddFmtDef('@SimpleGlob_Int1', 'replaceme', skPointer, '');
|
||||||
r^.OnBeforeTest := @AdjustExpectToAddress;
|
r^.OnBeforeTest := @AdjustExpectToAddress;
|
||||||
r^.UserData := pointer(PtrUInt(Length(FCurrentExpect^)));
|
r^.UserData := pointer(PtrUInt(Length(FCurrentExpect^)));
|
||||||
|
r^.UserData2 := FCurrentExpect;
|
||||||
AddFmtDef('SimplePGlob_Int1', '\$[0-9A-F]', skPointer, '');
|
AddFmtDef('SimplePGlob_Int1', '\$[0-9A-F]', skPointer, '');
|
||||||
|
|
||||||
{%region}
|
{%endregion}
|
||||||
|
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure TTestWatches.AddExpectSimple_2(DoAddExp_3: Boolean);
|
|
||||||
var
|
var
|
||||||
i, i2: Integer;
|
BrkIdx, i, i2, j: Integer;
|
||||||
s,s2: String;
|
s, s2, s2def: String;
|
||||||
r: PWatchExpectation;
|
r: PWatchExpectation;
|
||||||
begin
|
begin
|
||||||
FCurrentExpect := @ExpectBreakSimple_2;
|
for BrkIdx := 1 to BREAK_COUNT_TestWatchesUnitSimple do begin
|
||||||
if DoAddExp_3 then
|
FCurrentExpect := @ExpectBreakSimple[BrkIdx];
|
||||||
FCurrentExpect := @ExpectBreakSimple_3;
|
|
||||||
|
if BrkIdx in [1] then begin // Test1Sub
|
||||||
|
AddExpectSimple_Test1Sub;
|
||||||
|
continue;
|
||||||
|
end;
|
||||||
|
|
||||||
{%region Fields / Glob / ... }
|
{%region Fields / Glob / ... }
|
||||||
for i := 0 to 5 do begin
|
for i := 0 to 5 do begin
|
||||||
if DoAddExp_3 and not(i in [1,5]) then continue;
|
case BrkIdx of
|
||||||
|
// Simple_NoneNested
|
||||||
|
4, 5: if not (i in [1]) then continue; // Only Global /// TODO: test for error
|
||||||
|
// Test2Method
|
||||||
|
8..13: if not (i in [0, 1, 5, 6]) then continue;
|
||||||
|
// Class[12].Test0Method
|
||||||
|
6..7, 14..15: if not (i in [1]) then continue; // Only Global /// TODO: test for error
|
||||||
|
// Class0.Test0Method
|
||||||
|
16..17: if not (i in [1]) then continue; // Only Global /// TODO: test for error
|
||||||
|
end;
|
||||||
|
|
||||||
case i of
|
case i of
|
||||||
0: s := 'Field_';
|
0: s := 'Field_';
|
||||||
1: s := 'SimpleGlob_';
|
1: s := 'SimpleGlob_';
|
||||||
@ -429,6 +475,9 @@ begin
|
|||||||
3: s := 'VArg_';
|
3: s := 'VArg_';
|
||||||
4: s := 'Local_';
|
4: s := 'Local_';
|
||||||
5: s := 'self.Field_';
|
5: s := 'self.Field_';
|
||||||
|
//6: s := 'TSimpleClass1(self).Field_';
|
||||||
|
//7: s := 'TSimpleClass2(self).Field_';
|
||||||
|
//8: s := 'TSimpleClass0(self).Field_';
|
||||||
// 6: passed in object / var arg object
|
// 6: passed in object / var arg object
|
||||||
// unit.glob
|
// unit.glob
|
||||||
end;
|
end;
|
||||||
@ -438,6 +487,7 @@ begin
|
|||||||
//if i = 3 then UpdResMinFpc(r, stSymAll, 020600);
|
//if i = 3 then UpdResMinFpc(r, stSymAll, 020600);
|
||||||
//r^.OnBeforeTest := @AdjustArrayExpectToAddress;
|
//r^.OnBeforeTest := @AdjustArrayExpectToAddress;
|
||||||
//r^.UserData := pointer(ptruint(Length(FCurrentExpect^)));
|
//r^.UserData := pointer(ptruint(Length(FCurrentExpect^)));
|
||||||
|
//r^.UserData2 := FCurrentExpect;
|
||||||
//AddFmtDef(Format('%sPDynInt1', [s]), '\$[0-9A-F]', skPointer, '', [fTpMtch]);
|
//AddFmtDef(Format('%sPDynInt1', [s]), '\$[0-9A-F]', skPointer, '', [fTpMtch]);
|
||||||
|
|
||||||
{%endregion address of }
|
{%endregion address of }
|
||||||
@ -478,14 +528,9 @@ begin
|
|||||||
|
|
||||||
end; // i
|
end; // i
|
||||||
{%endregion Fields }
|
{%endregion Fields }
|
||||||
end;
|
|
||||||
|
|
||||||
procedure TTestWatches.AddExpectSimple_3;
|
|
||||||
var
|
end;
|
||||||
s: String;
|
|
||||||
begin
|
|
||||||
FCurrentExpect := @ExpectBreakSimple_3;
|
|
||||||
AddExpectSimple_2(True);
|
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure TTestWatches.AddExpectArray_1;
|
procedure TTestWatches.AddExpectArray_1;
|
||||||
@ -514,12 +559,14 @@ begin
|
|||||||
if i = 3 then UpdResMinFpc(r, stSymAll, 020600);
|
if i = 3 then UpdResMinFpc(r, stSymAll, 020600);
|
||||||
r^.OnBeforeTest := @AdjustArrayExpectToAddress;
|
r^.OnBeforeTest := @AdjustArrayExpectToAddress;
|
||||||
r^.UserData := pointer(ptruint(Length(FCurrentExpect^)));
|
r^.UserData := pointer(ptruint(Length(FCurrentExpect^)));
|
||||||
|
r^.UserData2 := FCurrentExpect;
|
||||||
AddFmtDef(Format('%sPDynInt1', [s]), '\$[0-9A-F]', skPointer, '', [fTpMtch]);
|
AddFmtDef(Format('%sPDynInt1', [s]), '\$[0-9A-F]', skPointer, '', [fTpMtch]);
|
||||||
|
|
||||||
r := AddFmtDef(Format('@%sStatInt1', [s]), '\REPLACEME', skPointer, '', [fTpMtch]);
|
r := AddFmtDef(Format('@%sStatInt1', [s]), '\REPLACEME', skPointer, '', [fTpMtch]);
|
||||||
if i = 3 then UpdResMinFpc(r, stSymAll, 020600);
|
if i = 3 then UpdResMinFpc(r, stSymAll, 020600);
|
||||||
r^.OnBeforeTest := @AdjustArrayExpectToAddress;
|
r^.OnBeforeTest := @AdjustArrayExpectToAddress;
|
||||||
r^.UserData := pointer(ptruint(Length(FCurrentExpect^)));
|
r^.UserData := pointer(ptruint(Length(FCurrentExpect^)));
|
||||||
|
r^.UserData2 := FCurrentExpect;
|
||||||
AddFmtDef(Format('%sPStatInt1', [s]), '\$[0-9A-F]', skPointer, '', [fTpMtch]);
|
AddFmtDef(Format('%sPStatInt1', [s]), '\$[0-9A-F]', skPointer, '', [fTpMtch]);
|
||||||
{%endregion address of }
|
{%endregion address of }
|
||||||
|
|
||||||
@ -584,11 +631,13 @@ end;
|
|||||||
// if i in [3] then UpdResMinFpc(r, stSymAll, 020600);
|
// if i in [3] then UpdResMinFpc(r, stSymAll, 020600);
|
||||||
r^.OnBeforeTest := @AdjustArrayExpectToAddress;
|
r^.OnBeforeTest := @AdjustArrayExpectToAddress;
|
||||||
r^.UserData := pointer(ptruint(Length(FCurrentExpect^)));
|
r^.UserData := pointer(ptruint(Length(FCurrentExpect^)));
|
||||||
|
r^.UserData2 := FCurrentExpect;
|
||||||
AddFmtDef(Format('Pointer(%sDynInt1%1:s)', [s,s2]), '\$[0-9A-F]', skPointer, '', [fTpMtch]);
|
AddFmtDef(Format('Pointer(%sDynInt1%1:s)', [s,s2]), '\$[0-9A-F]', skPointer, '', [fTpMtch]);
|
||||||
r := AddSimpleInt(Format('TArrayDynInt(REPLACEME)[0]', [s,s2]), 5511, M_Int);
|
r := AddSimpleInt(Format('TArrayDynInt(REPLACEME)[0]', [s,s2]), 5511, M_Int);
|
||||||
//if i in [3] then UpdResMinFpc(r, stSymAll, 020600);
|
//if i in [3] then UpdResMinFpc(r, stSymAll, 020600);
|
||||||
r^.OnBeforeTest := @AdjustArrayExpectToAddress;
|
r^.OnBeforeTest := @AdjustArrayExpectToAddress;
|
||||||
r^.UserData := pointer(ptruint(Length(FCurrentExpect^)));
|
r^.UserData := pointer(ptruint(Length(FCurrentExpect^)));
|
||||||
|
r^.UserData2 := FCurrentExpect;
|
||||||
AddFmtDef(Format('Pointer(%sDynInt1%1:s)', [s,s2]), '\$[0-9A-F]', skPointer, '', [fTpMtch]);
|
AddFmtDef(Format('Pointer(%sDynInt1%1:s)', [s,s2]), '\$[0-9A-F]', skPointer, '', [fTpMtch]);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
@ -723,62 +772,48 @@ begin
|
|||||||
dbg := StartGDB(AppDir, TestExeName);
|
dbg := StartGDB(AppDir, TestExeName);
|
||||||
FWatches := Watches.Watches;
|
FWatches := Watches.Watches;
|
||||||
|
|
||||||
SetBreak('TestWatchesUnitSimple.pas', BREAK_LINE_TestWatchesUnitSimple_1);
|
for i := 1 to BREAK_COUNT_TestWatchesUnitSimple do
|
||||||
SetBreak('TestWatchesUnitSimple.pas', BREAK_LINE_TestWatchesUnitSimple_2);
|
SetBreak('TestWatchesUnitSimple.pas', BREAK_LINE_TestWatchesUnitSimple[i]);
|
||||||
SetBreak('TestWatchesUnitSimple.pas', BREAK_LINE_TestWatchesUnitSimple_3);
|
|
||||||
SetBreak('TestWatchesUnitArray.pas', BREAK_LINE_TestWatchesUnitArray);
|
SetBreak('TestWatchesUnitArray.pas', BREAK_LINE_TestWatchesUnitArray);
|
||||||
|
|
||||||
if dbg.State = dsError then
|
if dbg.State = dsError then
|
||||||
Fail(' Failed Init');
|
Fail(' Failed Init');
|
||||||
|
|
||||||
AddWatches(ExpectBreakSimple_1, FWatches, Only, OnlyName, OnlyNamePart);
|
for i := 1 to BREAK_COUNT_TestWatchesUnitSimple do
|
||||||
AddWatches(ExpectBreakSimple_2, FWatches, Only, OnlyName, OnlyNamePart);
|
AddWatches(ExpectBreakSimple[i], FWatches, Only, OnlyName, OnlyNamePart);
|
||||||
AddWatches(ExpectBreakSimple_3, FWatches, Only, OnlyName, OnlyNamePart);
|
|
||||||
AddWatches(ExpectBreakArray_1, FWatches, Only, OnlyName, OnlyNamePart);
|
AddWatches(ExpectBreakArray_1, FWatches, Only, OnlyName, OnlyNamePart);
|
||||||
|
|
||||||
(* Start debugging *)
|
(* Start debugging *)
|
||||||
dbg.ShowConsole := True;
|
dbg.ShowConsole := True;
|
||||||
|
|
||||||
|
|
||||||
dbg.Run;
|
dbg.Run;
|
||||||
|
|
||||||
|
|
||||||
|
for i := 1 to BREAK_COUNT_TestWatchesUnitSimple do begin
|
||||||
if not TestTrue('State=Pause', dbg.State = dsPause) then begin
|
if not TestTrue('State=Pause', dbg.State = dsPause) then begin
|
||||||
TestTrue('Hit BREAK_LINE_TestWatchesUnitSimple_1', False);
|
TestTrue('Hit BREAK_LINE_TestWatchesUnitSimple_'+IntToStr(i), False);
|
||||||
exit;
|
exit;
|
||||||
end;
|
end;
|
||||||
|
AssertTrue('in simple', pos('simple', LowerCase(dbg.GetLocation.SrcFile)) > 0);
|
||||||
(* Hit first breakpoint: *)
|
(* Hit first breakpoint: *)
|
||||||
TestWatchList('Simple1',ExpectBreakSimple_1, dbg, Only, OnlyName, OnlyNamePart);
|
TestWatchList('Simple'+IntToStr(i), ExpectBreakSimple[i], dbg, Only, OnlyName, OnlyNamePart);
|
||||||
|
|
||||||
|
|
||||||
dbg.Run;
|
dbg.Run;
|
||||||
if not TestTrue('State=Pause', dbg.State = dsPause) then begin
|
|
||||||
TestTrue('Hit BREAK_LINE_TestWatchesUnitSimple', False);
|
|
||||||
exit;
|
|
||||||
end;
|
end;
|
||||||
(* Hit 2nd Simple breakpoint: *)
|
|
||||||
TestWatchList('Simple2',ExpectBreakSimple_2, dbg, Only, OnlyName, OnlyNamePart);
|
|
||||||
|
|
||||||
dbg.Run;
|
|
||||||
if not TestTrue('State=Pause', dbg.State = dsPause) then begin
|
|
||||||
TestTrue('Hit BREAK_LINE_TestWatchesUnitSimple', False);
|
|
||||||
exit;
|
|
||||||
end;
|
|
||||||
(* Hit 3rd Simlpe breakpoint: *)
|
|
||||||
TestWatchList('Simple3',ExpectBreakSimple_3, dbg, Only, OnlyName, OnlyNamePart);
|
|
||||||
|
|
||||||
|
|
||||||
// array
|
// array
|
||||||
|
|
||||||
|
|
||||||
dbg.Run;
|
|
||||||
if not TestTrue('State=Pause', dbg.State = dsPause) then begin
|
if not TestTrue('State=Pause', dbg.State = dsPause) then begin
|
||||||
TestTrue('Hit BREAK_LINE_TestWatchesUnitArray', False);
|
TestTrue('Hit BREAK_LINE_TestWatchesUnitArray', False);
|
||||||
exit;
|
exit;
|
||||||
end;
|
end;
|
||||||
|
AssertTrue('reached array', pos('array', LowerCase(dbg.GetLocation.SrcFile)) > 0);
|
||||||
|
|
||||||
(* Hit 11st Array breakpoint: *)
|
(* Hit 11st Array breakpoint: *)
|
||||||
TestWatchList('Array1',ExpectBreakArray_1, dbg, Only, OnlyName, OnlyNamePart);
|
TestWatchList('Array1',ExpectBreakArray_1, dbg, Only, OnlyName, OnlyNamePart);
|
||||||
|
|
||||||
dbg.Run;
|
// dbg.Run;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@ -806,9 +841,7 @@ begin
|
|||||||
ClearTestErrors;
|
ClearTestErrors;
|
||||||
|
|
||||||
ClearAllTestArrays;
|
ClearAllTestArrays;
|
||||||
AddExpectSimple_1;
|
AddExpectSimple;
|
||||||
AddExpectSimple_2;
|
|
||||||
AddExpectSimple_3;
|
|
||||||
AddExpectArray_1;
|
AddExpectArray_1;
|
||||||
|
|
||||||
RunTestWatches('', TestExeName, '', []);
|
RunTestWatches('', TestExeName, '', []);
|
||||||
|
Loading…
Reference in New Issue
Block a user