Author: martin
Date: 2007-10-18 13:48:18 -0400 (Thu, 18 Oct 2007)
New Revision: 87775
Modified:
branches/martin/debugger-plophos/debugger/backend/Inferior.cs
branches/martin/debugger-plophos/debugger/backend/SingleSteppingEngine.cs
branches/martin/debugger-plophos/debugger/backend/server/library.c
branches/martin/debugger-plophos/debugger/backend/server/server.h
branches/martin/debugger-plophos/debugger/backend/server/x86-arch.h
branches/martin/debugger-plophos/debugger/backend/server/x86-ptrace.c
branches/martin/debugger-plophos/debugger/backend/server/x86_64-arch.c
Log:
Modified: branches/martin/debugger-plophos/debugger/backend/Inferior.cs
===================================================================
--- branches/martin/debugger-plophos/debugger/backend/Inferior.cs
2007-10-18 17:48:16 UTC (rev 87774)
+++ branches/martin/debugger-plophos/debugger/backend/Inferior.cs
2007-10-18 17:48:18 UTC (rev 87775)
@@ -154,7 +154,7 @@
static extern IntPtr mono_debugger_server_create_inferior
(IntPtr breakpoint_manager);
[DllImport("monodebuggerserver")]
- static extern ChildEventType
mono_debugger_server_dispatch_event (IntPtr handle, int status, out long arg,
out long data1, out long data2);
+ static extern ChildEventType
mono_debugger_server_dispatch_event (IntPtr handle, int status, out long arg,
out long data1, out long data2, out int opt_data_size, out IntPtr opt_data);
[DllImport("monodebuggerserver")]
static extern TargetError mono_debugger_server_get_signal_info
(IntPtr handle, out IntPtr data);
@@ -219,8 +219,9 @@
public readonly long Data1;
public readonly long Data2;
- public ChildEvent (ChildEventType type, long arg,
- long data1, long data2)
+ public readonly byte[] CallbackData;
+
+ public ChildEvent (ChildEventType type, long arg, long
data1, long data2)
{
this.Type = type;
this.Argument = arg;
@@ -228,6 +229,13 @@
this.Data2 = data2;
}
+ public ChildEvent (ChildEventType type, long arg, long
data1, long data2,
+ byte[] callback_data)
+ : this (type, arg, data1, data2)
+ {
+ this.CallbackData = callback_data;
+ }
+
public override string ToString ()
{
return String.Format ("ChildEvent
({0}:{1}:{2:x}:{3:x})",
@@ -619,8 +627,12 @@
long arg, data1, data2;
ChildEventType message;
+ int opt_data_size;
+ IntPtr opt_data;
+
message = mono_debugger_server_dispatch_event (
- server_handle, status, out arg, out data1, out
data2);
+ server_handle, status, out arg, out data1, out
data2,
+ out opt_data_size, out opt_data);
switch (message) {
case ChildEventType.CHILD_EXITED:
@@ -641,6 +653,14 @@
break;
}
+ if (opt_data_size > 0) {
+ byte[] data = new byte [opt_data_size];
+ Marshal.Copy (opt_data, data, 0, opt_data_size);
+ g_free (opt_data);
+
+ return new ChildEvent (message, arg, data1,
data2, data);
+ }
+
return new ChildEvent (message, arg, data1, data2);
}
Modified:
branches/martin/debugger-plophos/debugger/backend/SingleSteppingEngine.cs
===================================================================
--- branches/martin/debugger-plophos/debugger/backend/SingleSteppingEngine.cs
2007-10-18 17:48:16 UTC (rev 87774)
+++ branches/martin/debugger-plophos/debugger/backend/SingleSteppingEngine.cs
2007-10-18 17:48:18 UTC (rev 87775)
@@ -2944,13 +2944,18 @@
try {
args = null;
- return CallbackCompleted (cevent.Data1,
cevent.Data2);
+ return CallbackCompleted (cevent);
} catch {
RestoreStack ();
return EventResult.CompletedCallback;
}
}
+ protected virtual EventResult CallbackCompleted
(Inferior.ChildEvent cevent)
+ {
+ return CallbackCompleted (cevent.Data1, cevent.Data2);
+ }
+
protected abstract EventResult CallbackCompleted (long data1,
long data2);
public override bool IsSourceOperation {
@@ -3329,7 +3334,7 @@
}
}
- protected delegate void MyTrampolineHandler (TargetAddress address);
+ protected delegate void MyTrampolineHandler (TargetAddress address,
byte[] data);
protected class OperationTrampoline : Operation
{
@@ -3380,12 +3385,17 @@
Console.WriteLine ("NEW OPERATION TRAMPOLINE: {0} {1}",
CallSite, CallTarget);
- sse.PushOperation (new OperationDoTrampoline (sse,
CallSite, CallTarget,
- delegate (TargetAddress the_address) {
- this.address = the_address;
- }));
+ sse.PushOperation (new OperationDoTrampoline (
+ sse, CallSite, CallTarget, callback_completed));
}
+ void callback_completed (TargetAddress address, byte[] data)
+ {
+ this.address = address;
+
+ Console.WriteLine ("OPERATION TRAMPOLINE DONE: {0}",
address);
+ }
+
protected override EventResult DoProcessEvent
(Inferior.ChildEvent cevent,
out
TargetEventArgs args)
{
@@ -3537,12 +3547,12 @@
this.MyTrampolineHandler = handler;
}
+ byte[] code_buffer;
+ int code_buffer_size;
+ int code_buffer_offset;
+
protected override void DoExecute ()
{
- byte[] code_buffer = null;
- int code_buffer_size = 0;
- int code_buffer_offset = 0;
-
if
(sse.process.BreakpointManager.IsAnyBreakpointInMemoryArea (CallSite - 16, 32))
{
code_buffer = inferior.ReadBuffer (CallSite -
16, 32);
code_buffer_size = 32;
@@ -3550,7 +3560,7 @@
}
TargetBinaryWriter writer = new TargetBinaryWriter (
- 32 + code_buffer_size, inferior.TargetInfo);
+ 24 + code_buffer_size, inferior.TargetInfo);
writer.WriteInt64 (CallSite.Address);
writer.WriteInt64 (CallTarget.Address);
writer.WriteInt32 (code_buffer_size);
@@ -3563,16 +3573,42 @@
inferior.CallMethod (sse.MonoDebuggerInfo.DoTrampoline,
data, ID);
}
- protected override EventResult CallbackCompleted (long data1,
long data2)
+ protected override EventResult CallbackCompleted
(Inferior.ChildEvent cevent)
{
- Console.WriteLine ("TRAMPOLINE COMPLETED: {0:x} {1:x}",
data1, data2);
- TargetAddress address = new TargetAddress
(inferior.AddressDomain, data1);
- MyTrampolineHandler (address);
+ Console.WriteLine ("TRAMPOLINE COMPLETED: {0:x}
{1:x}\n{2}", cevent.Data1,
+ cevent.Data2,
TargetBinaryReader.HexDump (cevent.CallbackData));
+
+ TargetBinaryReader reader = new TargetBinaryReader (
+ cevent.CallbackData, inferior.TargetInfo);
+ byte[] new_code = reader.PeekBuffer (24,
code_buffer_size);
+
+ Console.WriteLine ("OLD:\n{0}\n\nNEW:\n{1}",
+ TargetBinaryReader.HexDump
(code_buffer),
+ TargetBinaryReader.HexDump
(new_code));
+
+ bool modified = false;
+ for (int i = 0; i < code_buffer_size; i++) {
+ if (code_buffer [i] != new_code [i]) {
+ modified = true;
+ break;
+ }
+ }
+
+ Console.WriteLine ("TRAMPOLINE COMPLETED #1: {0:x}
{1}", cevent.Data1, modified);
+
+ TargetAddress address = new TargetAddress
(inferior.AddressDomain, cevent.Data1);
+ MyTrampolineHandler (address, cevent.CallbackData);
RestoreStack ();
return EventResult.ResumeOperation;
}
+
+ protected override EventResult CallbackCompleted (long data1,
long data2)
+ {
+ throw new InternalError ();
+ }
}
+#if FIXME
protected class OperationCompileMethod : OperationCallback
{
public readonly TargetAddress Method;
@@ -3599,6 +3635,7 @@
return EventResult.ResumeOperation;
}
}
+#endif
protected class OperationRuntimeClassInit : OperationCallback
{
Modified: branches/martin/debugger-plophos/debugger/backend/server/library.c
===================================================================
--- branches/martin/debugger-plophos/debugger/backend/server/library.c
2007-10-18 17:48:16 UTC (rev 87774)
+++ branches/martin/debugger-plophos/debugger/backend/server/library.c
2007-10-18 17:48:18 UTC (rev 87775)
@@ -103,9 +103,11 @@
ServerStatusMessageType
mono_debugger_server_dispatch_event (ServerHandle *handle, guint32 status,
guint64 *arg,
- guint64 *data1, guint64 *data2)
+ guint64 *data1, guint64 *data2, guint32
*opt_data_size,
+ gpointer *opt_data)
{
- return (*global_vtable->dispatch_event) (handle, status, arg, data1,
data2);
+ return (*global_vtable->dispatch_event) (
+ handle, status, arg, data1, data2, opt_data_size, opt_data);
}
ServerCommandError
Modified: branches/martin/debugger-plophos/debugger/backend/server/server.h
===================================================================
--- branches/martin/debugger-plophos/debugger/backend/server/server.h
2007-10-18 17:48:16 UTC (rev 87774)
+++ branches/martin/debugger-plophos/debugger/backend/server/server.h
2007-10-18 17:48:18 UTC (rev 87775)
@@ -131,7 +131,9 @@
guint32
status,
guint64 *arg,
guint64
*data1,
- guint64
*data2);
+ guint64
*data2,
+ guint32
*opt_data_size,
+ gpointer
*opt_data);
/* Get sizeof (int), sizeof (long) and sizeof (void *) from the target.
*/
ServerCommandError (* get_target_info) (guint32
*target_int_size,
@@ -391,7 +393,9 @@
guint32 status,
guint64 *arg,
guint64 *data1,
- guint64 *data2);
+ guint64 *data2,
+ guint32
*opt_data_size,
+ gpointer *opt_data);
ServerCommandError
mono_debugger_server_get_target_info (guint32 *target_int_size,
Modified: branches/martin/debugger-plophos/debugger/backend/server/x86-arch.h
===================================================================
--- branches/martin/debugger-plophos/debugger/backend/server/x86-arch.h
2007-10-18 17:48:16 UTC (rev 87774)
+++ branches/martin/debugger-plophos/debugger/backend/server/x86-arch.h
2007-10-18 17:48:18 UTC (rev 87775)
@@ -29,7 +29,8 @@
static ChildStoppedAction
x86_arch_child_stopped (ServerHandle *handle, int stopsig,
- guint64 *callback_arg, guint64 *retval, guint64
*retval2);
+ guint64 *callback_arg, guint64 *retval, guint64
*retval2,
+ guint32 *opt_data_size, gpointer *opt_data);
static ServerCommandError
x86_arch_get_registers (ServerHandle *handle);
Modified: branches/martin/debugger-plophos/debugger/backend/server/x86-ptrace.c
===================================================================
--- branches/martin/debugger-plophos/debugger/backend/server/x86-ptrace.c
2007-10-18 17:48:16 UTC (rev 87774)
+++ branches/martin/debugger-plophos/debugger/backend/server/x86-ptrace.c
2007-10-18 17:48:18 UTC (rev 87775)
@@ -160,7 +160,8 @@
static ServerStatusMessageType
server_ptrace_dispatch_event (ServerHandle *handle, guint32 status, guint64
*arg,
- guint64 *data1, guint64 *data2)
+ guint64 *data1, guint64 *data2, guint32
*opt_data_size,
+ gpointer *opt_data)
{
if (status >> 16) {
switch (status >> 16) {
@@ -228,7 +229,7 @@
}
action = x86_arch_child_stopped (
- handle, stopsig, &callback_arg, &retval, &retval2);
+ handle, stopsig, &callback_arg, &retval, &retval2,
opt_data_size, opt_data);
if (action != STOP_ACTION_STOPPED)
handle->inferior->last_signal = 0;
Modified: branches/martin/debugger-plophos/debugger/backend/server/x86_64-arch.c
===================================================================
--- branches/martin/debugger-plophos/debugger/backend/server/x86_64-arch.c
2007-10-18 17:48:16 UTC (rev 87774)
+++ branches/martin/debugger-plophos/debugger/backend/server/x86_64-arch.c
2007-10-18 17:48:18 UTC (rev 87775)
@@ -36,6 +36,8 @@
guint64 exc_address;
int saved_signal;
guint64 pushed_registers;
+ guint64 data_pointer;
+ guint32 data_size;
gboolean debug;
} CallbackData;
@@ -159,7 +161,8 @@
ChildStoppedAction
x86_arch_child_stopped (ServerHandle *handle, int stopsig,
- guint64 *callback_arg, guint64 *retval, guint64
*retval2)
+ guint64 *callback_arg, guint64 *retval, guint64
*retval2,
+ guint32 *opt_data_size, gpointer *opt_data)
{
ArchInfo *arch = handle->arch;
InferiorHandle *inferior = handle->inferior;
@@ -234,6 +237,20 @@
*callback_arg = cdata->callback_argument;
*retval = INFERIOR_REG_RAX (arch->current_regs);
+ if (cdata->data_pointer) {
+ *opt_data_size = cdata->data_size;
+ *opt_data = g_malloc0 (cdata->data_size);
+
+ if (_server_ptrace_read_memory (
+ handle, cdata->data_pointer,
cdata->data_size, *opt_data))
+ g_error (G_STRLOC ": Can't read data buffer
after returning from a call");
+
+ g_message (G_STRLOC ": %p - %d", *opt_data,
cdata->data_size);
+ } else {
+ *opt_data_size = 0;
+ *opt_data = NULL;
+ }
+
if (cdata->exc_address &&
(server_ptrace_peek_word (handle, cdata->exc_address,
retval2) != COMMAND_ERROR_NONE))
g_error (G_STRLOC ": Can't get exc object");
@@ -856,9 +873,6 @@
*((guint64 *) (code+104)) = INFERIOR_REG_R15 (arch->current_regs);
*((guint8 *) (code+data_size+116)) = 0xcc;
- if (data_size > 0)
- memcpy (code+112, data_buffer, data_size);
-
cdata = g_new0 (CallbackData, 1);
memcpy (&cdata->saved_regs, &arch->current_regs, sizeof
(arch->current_regs));
memcpy (&cdata->saved_fpregs, &arch->current_fpregs, sizeof
(arch->current_fpregs));
@@ -870,6 +884,12 @@
cdata->pushed_registers = new_rsp + 8;
handle->inferior->last_signal = 0;
+ if (data_size > 0) {
+ memcpy (code+112, data_buffer, data_size);
+ cdata->data_pointer = new_rsp + 112;
+ cdata->data_size = data_size;
+ }
+
server_ptrace_write_memory (handle, (unsigned long) new_rsp, size,
code);
g_free (code);
if (result != COMMAND_ERROR_NONE)
_______________________________________________
Mono-patches maillist - [email protected]
http://lists.ximian.com/mailman/listinfo/mono-patches