// // BreakEventInfo.cs // // Author: // Lluis Sanchez Gual // // Copyright (c) 2011 Novell, Inc (http://www.novell.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. using System; namespace Mono.Debugging.Client { /// /// This class can be used to manage and get information about a breakpoint /// at debug-time. It is intended to be used by DebuggerSession subclasses. /// public class BreakEventInfo { DebuggerSession session; int adjustedColumn = -1; int adjustedLine = -1; /// /// Gets or sets the implementation specific handle of the breakpoint /// public object Handle { get; set; } /// /// Break event that this instance represents /// public BreakEvent BreakEvent { get; internal set; } /// /// Gets the status of the break event /// public BreakEventStatus Status { get; private set; } /// /// Gets a description of the status /// public string StatusMessage { get; private set; } internal void AttachSession (DebuggerSession s, BreakEvent ev) { session = s; BreakEvent = ev; session.NotifyBreakEventStatusChanged (BreakEvent); if (adjustedLine != -1 || adjustedColumn != -1) session.AdjustBreakpointLocation ((Breakpoint)BreakEvent, adjustedLine, adjustedColumn); } /// /// Adjusts the location of a breakpoint /// /// /// New line. /// /// /// This method can be used to temporarily change source code line of the breakpoint. /// This is useful, for example, when two adjacent lines are mapped to a single /// native offset. If the breakpoint is set to the first of those lines, the debugger /// might end stopping in the second line, because it has the same native offset. /// To avoid this confusion situation, the debugger implementation may decide to /// adjust the position of the breakpoint, and move it to the second line. /// This line adjustment has effect only during the debug session, and is automatically /// reset when it terminates. /// public void AdjustBreakpointLocation (int newLine, int newColumn) { if (session != null) { session.AdjustBreakpointLocation ((Breakpoint)BreakEvent, newLine, newColumn); } else { adjustedColumn = newColumn; adjustedLine = newLine; } } /// /// Increments the hit count. /// /// true if the break event should trigger, or false otherwise. public bool HitCountReached { get { switch (BreakEvent.HitCountMode) { case HitCountMode.LessThan: return BreakEvent.CurrentHitCount < BreakEvent.HitCount; case HitCountMode.LessThanOrEqualTo: return BreakEvent.CurrentHitCount <= BreakEvent.HitCount; case HitCountMode.EqualTo: return BreakEvent.CurrentHitCount == BreakEvent.HitCount; case HitCountMode.GreaterThan: return BreakEvent.CurrentHitCount > BreakEvent.HitCount; case HitCountMode.GreaterThanOrEqualTo: return BreakEvent.CurrentHitCount >= BreakEvent.HitCount; case HitCountMode.MultipleOf: return (BreakEvent.CurrentHitCount % BreakEvent.HitCount) == 0; default: return true; } } } public void IncrementHitCount () { if (BreakEvent.HitCountMode != HitCountMode.None) { BreakEvent.CurrentHitCount++; BreakEvent.NotifyUpdate (); } } public void SetStatus (BreakEventStatus s, string statusMessage) { if (s != Status) { Status = s; StatusMessage = statusMessage; if (session != null) session.NotifyBreakEventStatusChanged (BreakEvent); } } public bool RunCustomBreakpointAction (string actionId) { var h = session.CustomBreakEventHitHandler; return h != null && h (actionId, BreakEvent); } public void UpdateLastTraceValue (string value) { BreakEvent.LastTraceValue = value; BreakEvent.NotifyUpdate (); if (value != null) { if (session.BreakpointTraceHandler != null) session.BreakpointTraceHandler (BreakEvent, value); else session.OnTargetDebug (0, "", value + Environment.NewLine); } } } }