From c396dbcd23082f8cbc11679d7fbb4b41fe61ecab Mon Sep 17 00:00:00 2001 From: martin Date: Wed, 12 Mar 2014 17:49:22 +0000 Subject: [PATCH] GDBMIDebugger: fix watchpoints. git-svn-id: trunk@44411 - --- components/lazdebuggergdbmi/gdbmidebugger.pp | 61 ++++++++++++++++---- 1 file changed, 50 insertions(+), 11 deletions(-) diff --git a/components/lazdebuggergdbmi/gdbmidebugger.pp b/components/lazdebuggergdbmi/gdbmidebugger.pp index 3edf02051d..ad61d04d58 100644 --- a/components/lazdebuggergdbmi/gdbmidebugger.pp +++ b/components/lazdebuggergdbmi/gdbmidebugger.pp @@ -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);