namespace Mono.Debugger.Soft
{
- class VersionInfo {
+ public class VersionInfo {
public string VMVersion {
get; set;
}
SINGLE_THREADED = 0x2
}
+ enum ElementType {
+ End = 0x00,
+ Void = 0x01,
+ Boolean = 0x02,
+ Char = 0x03,
+ I1 = 0x04,
+ U1 = 0x05,
+ I2 = 0x06,
+ U2 = 0x07,
+ I4 = 0x08,
+ U4 = 0x09,
+ I8 = 0x0a,
+ U8 = 0x0b,
+ R4 = 0x0c,
+ R8 = 0x0d,
+ String = 0x0e,
+ Ptr = 0x0f,
+ ByRef = 0x10,
+ ValueType = 0x11,
+ Class = 0x12,
+ Var = 0x13,
+ Array = 0x14,
+ GenericInst = 0x15,
+ TypedByRef = 0x16,
+ I = 0x18,
+ U = 0x19,
+ FnPtr = 0x1b,
+ Object = 0x1c,
+ SzArray = 0x1d,
+ MVar = 0x1e,
+ CModReqD = 0x1f,
+ CModOpt = 0x20,
+ Internal = 0x21,
+ Modifier = 0x40,
+ Sentinel = 0x41,
+ Pinned = 0x45,
+
+ Type = 0x50,
+ Boxed = 0x51,
+ Enum = 0x55
+ }
+
class ValueImpl {
public ElementType Type; /* or one of the VALUE_TYPE_ID constants */
public long Objid;
}
}
+ class EventInfo {
+ public EventType EventType {
+ get; set;
+ }
+
+ public int ReqId {
+ get; set;
+ }
+
+ public SuspendPolicy SuspendPolicy {
+ get; set;
+ }
+
+ public long ThreadId {
+ get; set;
+ }
+
+ public long Id {
+ get; set;
+ }
+
+ public long Location {
+ get; set;
+ }
+
+ public EventInfo (EventType type, int req_id) {
+ EventType = type;
+ ReqId = req_id;
+ }
+ }
+
public enum ErrorCode {
NONE = 0,
INVALID_OBJECT = 20,
NOT_SUSPENDED = 101,
INVALID_ARGUMENT = 102,
ERR_UNLOADED = 103,
- ERR_NO_INVOCATION = 104
+ ERR_NO_INVOCATION = 104,
+ ABSENT_INFORMATION = 105
}
public class ErrorHandlerEventArgs : EventArgs {
* with newer runtimes, and vice versa.
*/
public const int MAJOR_VERSION = 2;
- public const int MINOR_VERSION = 1;
+ public const int MINOR_VERSION = 2;
enum WPSuspendPolicy {
NONE = 0,
GET_PROPERTIES = 9,
GET_CATTRS = 10,
GET_FIELD_CATTRS = 11,
- GET_PROPERTY_CATTRS = 12
+ GET_PROPERTY_CATTRS = 12,
+ /* FIXME: Merge into GET_SOURCE_FILES when the major protocol version is increased */
+ GET_SOURCE_FILES_2 = 13
}
enum CmdStackFrame {
int offset;
public PacketWriter () {
- // FIXME:
data = new byte [1024];
offset = 0;
}
+ void MakeRoom (int size) {
+ if (offset + size >= data.Length) {
+ int new_len = data.Length * 2;
+ while (new_len < offset + size) {
+ new_len *= 2;
+ }
+ byte[] new_data = new byte [new_len];
+ Array.Copy (data, new_data, data.Length);
+ data = new_data;
+ }
+ }
+
public PacketWriter WriteByte (byte val) {
+ MakeRoom (1);
encode_byte (data, val, ref offset);
return this;
}
public PacketWriter WriteInt (int val) {
+ MakeRoom (4);
encode_int (data, val, ref offset);
return this;
}
public PacketWriter WriteId (long id) {
+ MakeRoom (8);
encode_id (data, id, ref offset);
return this;
}
public PacketWriter WriteLong (long val) {
+ MakeRoom (8);
encode_long (data, val, ref offset);
return this;
}
public PacketWriter WriteFloat (float f) {
+ MakeRoom (8);
byte[] b = DataConverter.GetBytesBE (f);
for (int i = 0; i < 4; ++i)
data [offset + i] = b [i];
}
public PacketWriter WriteDouble (double d) {
+ MakeRoom (8);
byte[] b = DataConverter.GetBytesBE (d);
for (int i = 0; i < 8; ++i)
data [offset + i] = b [i];
public PacketWriter WriteString (string s) {
encode_int (data, s.Length, ref offset);
byte[] b = Encoding.UTF8.GetBytes (s);
+ MakeRoom (b.Length);
Buffer.BlockCopy (b, 0, data, offset, b.Length);
offset += b.Length;
return this;
PacketReader r = new PacketReader (packet);
if (r.CommandSet == CommandSet.EVENT && r.Command == (int)CmdEvent.COMPOSITE) {
- r.ReadByte (); // suspend_policy
+ int spolicy = r.ReadByte ();
int nevents = r.ReadInt ();
+ SuspendPolicy suspend_policy = decode_suspend_policy (spolicy);
+
+ EventInfo[] events = new EventInfo [nevents];
+
for (int i = 0; i < nevents; ++i) {
EventKind kind = (EventKind)r.ReadByte ();
int req_id = r.ReadInt ();
+ EventType etype = (EventType)kind;
+
if (kind == EventKind.VM_START) {
long thread_id = r.ReadId ();
- EventHandler.VMStart (req_id, thread_id, null);
+ events [i] = new EventInfo (etype, req_id) { ThreadId = thread_id };
+ //EventHandler.VMStart (req_id, thread_id, null);
} else if (kind == EventKind.VM_DEATH) {
- EventHandler.VMDeath (req_id, 0, null);
+ //EventHandler.VMDeath (req_id, 0, null);
+ events [i] = new EventInfo (etype, req_id) { };
} else if (kind == EventKind.THREAD_START) {
long thread_id = r.ReadId ();
- EventHandler.ThreadStart (req_id, thread_id, thread_id);
+ events [i] = new EventInfo (etype, req_id) { ThreadId = thread_id, Id = thread_id };
+ //EventHandler.ThreadStart (req_id, thread_id, thread_id);
} else if (kind == EventKind.THREAD_DEATH) {
long thread_id = r.ReadId ();
- EventHandler.ThreadDeath (req_id, thread_id, thread_id);
+ events [i] = new EventInfo (etype, req_id) { ThreadId = thread_id, Id = thread_id };
+ //EventHandler.ThreadDeath (req_id, thread_id, thread_id);
} else if (kind == EventKind.ASSEMBLY_LOAD) {
long thread_id = r.ReadId ();
long id = r.ReadId ();
- EventHandler.AssemblyLoad (req_id, thread_id, id);
+ events [i] = new EventInfo (etype, req_id) { ThreadId = thread_id, Id = id };
+ //EventHandler.AssemblyLoad (req_id, thread_id, id);
} else if (kind == EventKind.ASSEMBLY_UNLOAD) {
long thread_id = r.ReadId ();
long id = r.ReadId ();
- EventHandler.AssemblyUnload (req_id, thread_id, id);
+ events [i] = new EventInfo (etype, req_id) { ThreadId = thread_id, Id = id };
+ //EventHandler.AssemblyUnload (req_id, thread_id, id);
} else if (kind == EventKind.TYPE_LOAD) {
long thread_id = r.ReadId ();
long id = r.ReadId ();
- EventHandler.TypeLoad (req_id, thread_id, id);
+ events [i] = new EventInfo (etype, req_id) { ThreadId = thread_id, Id = id };
+ //EventHandler.TypeLoad (req_id, thread_id, id);
} else if (kind == EventKind.METHOD_ENTRY) {
long thread_id = r.ReadId ();
long id = r.ReadId ();
- EventHandler.MethodEntry (req_id, thread_id, id);
+ events [i] = new EventInfo (etype, req_id) { ThreadId = thread_id, Id = id };
+ //EventHandler.MethodEntry (req_id, thread_id, id);
} else if (kind == EventKind.METHOD_EXIT) {
long thread_id = r.ReadId ();
long id = r.ReadId ();
- EventHandler.MethodExit (req_id, thread_id, id);
+ events [i] = new EventInfo (etype, req_id) { ThreadId = thread_id, Id = id };
+ //EventHandler.MethodExit (req_id, thread_id, id);
} else if (kind == EventKind.BREAKPOINT) {
long thread_id = r.ReadId ();
long id = r.ReadId ();
long loc = r.ReadLong ();
- EventHandler.Breakpoint (req_id, thread_id, id, loc);
+ events [i] = new EventInfo (etype, req_id) { ThreadId = thread_id, Id = id, Location = loc };
+ //EventHandler.Breakpoint (req_id, thread_id, id, loc);
} else if (kind == EventKind.STEP) {
long thread_id = r.ReadId ();
long id = r.ReadId ();
long loc = r.ReadLong ();
- EventHandler.Step (req_id, thread_id, id, loc);
+ events [i] = new EventInfo (etype, req_id) { ThreadId = thread_id, Id = id, Location = loc };
+ //EventHandler.Step (req_id, thread_id, id, loc);
} else if (kind == EventKind.EXCEPTION) {
long thread_id = r.ReadId ();
long id = r.ReadId ();
long loc = 0; // FIXME
- EventHandler.Exception (req_id, thread_id, id, loc);
+ events [i] = new EventInfo (etype, req_id) { ThreadId = thread_id, Id = id, Location = loc };
+ //EventHandler.Exception (req_id, thread_id, id, loc);
} else if (kind == EventKind.APPDOMAIN_CREATE) {
long thread_id = r.ReadId ();
long id = r.ReadId ();
- EventHandler.AppDomainCreate (req_id, thread_id, id);
+ events [i] = new EventInfo (etype, req_id) { ThreadId = thread_id, Id = id };
+ //EventHandler.AppDomainCreate (req_id, thread_id, id);
} else if (kind == EventKind.APPDOMAIN_UNLOAD) {
long thread_id = r.ReadId ();
long id = r.ReadId ();
- EventHandler.AppDomainUnload (req_id, thread_id, id);
+ events [i] = new EventInfo (etype, req_id) { ThreadId = thread_id, Id = id };
+ //EventHandler.AppDomainUnload (req_id, thread_id, id);
} else {
throw new NotImplementedException ("Unknown event kind: " + kind);
}
}
+
+ EventHandler.Events (suspend_policy, events);
}
}
SendReceive (CommandSet.TYPE, (int)CmdType.SET_VALUES, new PacketWriter ().WriteId (id).WriteInt (fields.Length).WriteIds (fields).WriteValues (values));
}
- public string[] Type_GetSourceFiles (long id) {
- var r = SendReceive (CommandSet.TYPE, (int)CmdType.GET_SOURCE_FILES, new PacketWriter ().WriteId (id));
+ public string[] Type_GetSourceFiles (long id, bool return_full_paths) {
+ var r = SendReceive (CommandSet.TYPE, return_full_paths ? (int)CmdType.GET_SOURCE_FILES_2 : (int)CmdType.GET_SOURCE_FILES, new PacketWriter ().WriteId (id));
int len = r.ReadInt ();
string[] res = new string [len];
for (int i = 0; i < len; ++i)
/* This is the interface exposed by the debugger towards the debugger agent */
interface IEventHandler
{
- void VMStart (int req_id, long thread_id, string vm_uri);
-
- void VMDeath (int req_id, long thread_id, string vm_uri);
+ void Events (SuspendPolicy suspend_policy, EventInfo[] events);
void VMDisconnect (int req_id, long thread_id, string vm_uri);
-
- void ThreadStart (int req_id, long thread_id, long id);
-
- void ThreadDeath (int req_id, long thread_id, long id);
-
- void AssemblyLoad (int req_id, long thread_id, long id);
-
- void AssemblyUnload (int req_id, long thread_id, long id);
-
- void TypeLoad (int req_id, long thread_id, long id);
-
- void MethodEntry (int req_id, long thread_id, long id);
-
- void MethodExit (int req_id, long thread_id, long id);
-
- void Breakpoint (int req_id, long thread_id, long method_id, long loc);
-
- void Step (int req_id, long thread_id, long method_id, long loc);
-
- void Exception (int req_id, long thread_id, long exc_id, long loc);
-
- void AppDomainCreate (int req_id, long thread_id, long id);
-
- void AppDomainUnload (int req_id, long thread_id, long id);
}
}