Added specific routines for OUTPUT_DEBUG_STRING and EXCEPTION debug events.
Generate a breakpoint event on process attach.
Misc cleanups in request handling.
diff --git a/server/trace.c b/server/trace.c
index 1313c15..d4ff840 100644
--- a/server/trace.c
+++ b/server/trace.c
@@ -79,23 +79,28 @@
#endif
}
-static void dump_debug_event_t( const debug_event_t *event )
+static void dump_exc_record( const EXCEPTION_RECORD *rec )
{
int i;
+ fprintf( stderr, "{code=%lx,flags=%lx,rec=%p,addr=%p,params={",
+ rec->ExceptionCode, rec->ExceptionFlags, rec->ExceptionRecord,
+ rec->ExceptionAddress );
+ for (i = 0; i < rec->NumberParameters; i++)
+ {
+ if (i) fputc( ',', stderr );
+ fprintf( stderr, "%lx", rec->ExceptionInformation[i] );
+ }
+ fputc( '}', stderr );
+}
+
+static void dump_debug_event_t( const debug_event_t *event )
+{
switch(event->code)
{
case EXCEPTION_DEBUG_EVENT:
- fprintf( stderr, "{exception,code=%x,flags=%x,rec=%p,addr=%p,params={",
- event->info.exception.code, event->info.exception.flags,
- event->info.exception.record, event->info.exception.addr );
- for (i = 0; i < event->info.exception.nb_params; i++)
- {
- if (i) fputc( ',', stderr );
- fprintf( stderr, "%x", event->info.exception.params[i] );
- }
- fprintf( stderr, "},first_chance=%d,context=", event->info.exception.first_chance );
- dump_context( &event->info.exception.context );
- fputc( '}', stderr );
+ fprintf( stderr, "{exception," );
+ dump_exc_record( &event->info.exception.record );
+ fprintf( stderr, ",first=%d}", event->info.exception.first );
break;
case CREATE_THREAD_DEBUG_EVENT:
fprintf( stderr, "{create_thread,thread=%d,teb=%p,start=%p}",
@@ -927,17 +932,28 @@
dump_debug_event_t( &req->event );
}
-static void dump_send_debug_event_request( const struct send_debug_event_request *req )
+static void dump_exception_event_request( const struct exception_event_request *req )
{
- fprintf( stderr, " event=" );
- dump_debug_event_t( &req->event );
+ fprintf( stderr, " record=" );
+ dump_exc_record( &req->record );
+ fprintf( stderr, "," );
+ fprintf( stderr, " first=%d,", req->first );
+ fprintf( stderr, " context=" );
+ dump_context( &req->context );
}
-static void dump_send_debug_event_reply( const struct send_debug_event_request *req )
+static void dump_exception_event_reply( const struct exception_event_request *req )
{
fprintf( stderr, " status=%d", req->status );
}
+static void dump_output_debug_string_request( const struct output_debug_string_request *req )
+{
+ fprintf( stderr, " string=%p,", req->string );
+ fprintf( stderr, " unicode=%d,", req->unicode );
+ fprintf( stderr, " length=%d", req->length );
+}
+
static void dump_continue_debug_event_request( const struct continue_debug_event_request *req )
{
fprintf( stderr, " pid=%p,", req->pid );
@@ -1310,7 +1326,8 @@
(dump_func)dump_create_snapshot_request,
(dump_func)dump_next_process_request,
(dump_func)dump_wait_debug_event_request,
- (dump_func)dump_send_debug_event_request,
+ (dump_func)dump_exception_event_request,
+ (dump_func)dump_output_debug_string_request,
(dump_func)dump_continue_debug_event_request,
(dump_func)dump_debug_process_request,
(dump_func)dump_read_process_memory_request,
@@ -1411,7 +1428,8 @@
(dump_func)dump_create_snapshot_reply,
(dump_func)dump_next_process_reply,
(dump_func)dump_wait_debug_event_reply,
- (dump_func)dump_send_debug_event_reply,
+ (dump_func)dump_exception_event_reply,
+ (dump_func)0,
(dump_func)0,
(dump_func)0,
(dump_func)dump_read_process_memory_reply,
@@ -1512,7 +1530,8 @@
"create_snapshot",
"next_process",
"wait_debug_event",
- "send_debug_event",
+ "exception_event",
+ "output_debug_string",
"continue_debug_event",
"debug_process",
"read_process_memory",
@@ -1546,7 +1565,7 @@
/* ### make_requests end ### */
/* Everything above this line is generated automatically by tools/make_requests */
-void trace_request( enum request req, int fd )
+void trace_request( enum request req )
{
current->last_req = req;
if (req < REQ_NB_REQUESTS)
@@ -1556,7 +1575,7 @@
}
else
fprintf( stderr, "%08x: %d(", (unsigned int)current, req );
- if (fd != -1) fprintf( stderr, " ) fd=%d\n", fd );
+ if (current->pass_fd != -1) fprintf( stderr, " ) fd=%d\n", current->pass_fd );
else fprintf( stderr, " )\n" );
}