mirror of
https://gitlab.com/freepascal.org/lazarus/lazarus.git
synced 2025-08-12 12:16:18 +02:00
GDBMIDebugger: fix watchpoints.
git-svn-id: trunk@44411 -
This commit is contained in:
parent
0663d233e9
commit
c396dbcd23
@ -5793,6 +5793,8 @@ var
|
||||
Reason: String;
|
||||
BreakID: Integer;
|
||||
CanContinue: Boolean;
|
||||
i: Integer;
|
||||
s: String;
|
||||
begin
|
||||
(* The Queue is not locked / This code can be interupted
|
||||
Therefore all calls to ExecuteCommand (gdb cmd) must be wrapped in QueueExecuteLock
|
||||
@ -5852,14 +5854,24 @@ begin
|
||||
Exit;
|
||||
end;
|
||||
|
||||
if Reason = 'watchpoint-trigger'
|
||||
if (Reason = 'watchpoint-trigger') or (Reason = 'access-watchpoint-trigger') or
|
||||
(Reason = 'read-watchpoint-trigger')
|
||||
then begin
|
||||
List2 := TGDBMINameValueList.Create(List.Values['wpt']);
|
||||
BreakID := StrToIntDef(List2.Values['number'], -1);
|
||||
// Use List2.Values['exp'] ? It may contain globalized expression
|
||||
List2.Init(List.Values['value']);
|
||||
ProcessBreakPoint(BreakID, List, gbrWatchTrigger, List2.Values['old'], List2.Values['new']);
|
||||
exit;
|
||||
i := 0;
|
||||
List2 := nil;
|
||||
while i < List.Count do begin
|
||||
s := PCLenToString(List.Items[i]^.Name);
|
||||
if copy(s, Length(s) - 2, 3) = 'wpt' then
|
||||
List2 := TGDBMINameValueList.Create(List.Values[s]);
|
||||
inc(i);
|
||||
end;
|
||||
if List2 <> nil then begin
|
||||
BreakID := StrToIntDef(List2.Values['number'], -1);
|
||||
// Use List2.Values['exp'] ? It may contain globalized expression
|
||||
List2.Init(List.Values['value']);
|
||||
ProcessBreakPoint(BreakID, List, gbrWatchTrigger, List2.Values['old'], List2.Values['new']);
|
||||
exit;
|
||||
end;
|
||||
end;
|
||||
|
||||
if Reason = 'watchpoint-scope'
|
||||
@ -8881,13 +8893,11 @@ var
|
||||
R: TGDBMIExecResult;
|
||||
ResultList: TGDBMINameValueList;
|
||||
WatchExpr, WatchDecl, WatchAddr: String;
|
||||
GdbRes: String;
|
||||
begin
|
||||
Result := False;
|
||||
ABreakId := 0;
|
||||
AHitCnt := 0;
|
||||
AnAddr := 0;
|
||||
GdbRes := 'bkpt';
|
||||
case FKind of
|
||||
bpkSource:
|
||||
begin
|
||||
@ -8927,11 +8937,40 @@ begin
|
||||
wpkReadWrite: Result := ExecuteCommand('-break-watch -a %s', [WatchExpr], R);
|
||||
end;
|
||||
Result := Result and (R.State <> dsError);
|
||||
GdbRes := 'wpt';
|
||||
end;
|
||||
end;
|
||||
|
||||
ResultList := TGDBMINameValueList.Create(R, [GdbRes]);
|
||||
ResultList := TGDBMINameValueList.Create(R);
|
||||
case FKind of
|
||||
bpkSource, bpkAddress:
|
||||
ResultList.SetPath('bkpt');
|
||||
bpkData:
|
||||
case FWatchKind of
|
||||
wpkWrite: begin
|
||||
if ResultList.IndexOf('hw-wpt') >= 0 then ResultList.SetPath('hw-wpt')
|
||||
else
|
||||
if ResultList.IndexOf('wpt') >= 0 then ResultList.SetPath('wpt');
|
||||
end;
|
||||
wpkRead: begin
|
||||
if ResultList.IndexOf('hw-rwpt') >= 0 then ResultList.SetPath('hw-rwpt')
|
||||
else
|
||||
if ResultList.IndexOf('rwpt') >= 0 then ResultList.SetPath('rwpt')
|
||||
else
|
||||
if ResultList.IndexOf('hw-wpt') >= 0 then ResultList.SetPath('hw-wpt')
|
||||
else
|
||||
if ResultList.IndexOf('wpt') >= 0 then ResultList.SetPath('wpt');
|
||||
end;
|
||||
wpkReadWrite: begin
|
||||
if ResultList.IndexOf('hw-awpt') >= 0 then ResultList.SetPath('hw-awpt')
|
||||
else
|
||||
if ResultList.IndexOf('awpt') >= 0 then ResultList.SetPath('awpt')
|
||||
else
|
||||
if ResultList.IndexOf('hw-wpt') >= 0 then ResultList.SetPath('hw-wpt')
|
||||
else
|
||||
if ResultList.IndexOf('wpt') >= 0 then ResultList.SetPath('wpt');
|
||||
end;
|
||||
end;
|
||||
end;
|
||||
ABreakID := StrToIntDef(ResultList.Values['number'], 0);
|
||||
AHitCnt := StrToIntDef(ResultList.Values['times'], 0);
|
||||
AnAddr := StrToQWordDef(ResultList.Values['addr'], 0);
|
||||
|
Loading…
Reference in New Issue
Block a user