Author: jgardou Date: Fri Aug 26 21:07:27 2016 New Revision: 72467
URL: http://svn.reactos.org/svn/reactos?rev=72467&view=rev Log: [KDGDB] - Add a ugly and grotesque hack to give "o" back to RtlAssert so that we actually break on ASSERTs - Check for the breakpoint instruction for deciding when to move forward the ProgramCounter. This is OK since KD removes all breakpoints set when hitting a soft BP
Modified: trunk/reactos/drivers/base/kdgdb/gdb_input.c trunk/reactos/drivers/base/kdgdb/kdgdb.h trunk/reactos/drivers/base/kdgdb/kdpacket.c
Modified: trunk/reactos/drivers/base/kdgdb/gdb_input.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/base/kdgdb/gdb_inpu... ============================================================================== --- trunk/reactos/drivers/base/kdgdb/gdb_input.c [iso-8859-1] (original) +++ trunk/reactos/drivers/base/kdgdb/gdb_input.c [iso-8859-1] Fri Aug 26 21:07:27 2016 @@ -830,7 +830,7 @@
/* See if we should update the program counter */ if (Exception && (Exception->ExceptionRecord.ExceptionCode == STATUS_BREAKPOINT) - && ProgramCounter == KdDebuggerDataBlock->BreakpointWithStatus.Pointer) + && ((*(KD_BREAKPOINT_TYPE*)ProgramCounter) == KD_BREAKPOINT_VALUE)) { /* We must get past the breakpoint instruction */ KdpSetContextPc(&CurrentContext, ProgramCounter + KD_BREAKPOINT_SIZE);
Modified: trunk/reactos/drivers/base/kdgdb/kdgdb.h URL: http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/base/kdgdb/kdgdb.h?... ============================================================================== --- trunk/reactos/drivers/base/kdgdb/kdgdb.h [iso-8859-1] (original) +++ trunk/reactos/drivers/base/kdgdb/kdgdb.h [iso-8859-1] Fri Aug 26 21:07:27 2016 @@ -121,7 +121,9 @@ ((Context)->Eip) # define KdpSetContextPc(Context, ProgramCounter) \ ((Context)->Eip = (ProgramCounter)) +# define KD_BREAKPOINT_TYPE UCHAR # define KD_BREAKPOINT_SIZE sizeof(UCHAR) +# define KD_BREAKPOINT_VALUE 0xCC /* Single step mode */ # define KdpSetSingleStep(Context) \ ((Context)->EFlags |= EFLAGS_TF)
Modified: trunk/reactos/drivers/base/kdgdb/kdpacket.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/base/kdgdb/kdpacket... ============================================================================== --- trunk/reactos/drivers/base/kdgdb/kdpacket.c [iso-8859-1] (original) +++ trunk/reactos/drivers/base/kdgdb/kdpacket.c [iso-8859-1] Fri Aug 26 21:07:27 2016 @@ -183,6 +183,7 @@ switch (DebugIO->ApiNumber) { case DbgKdPrintStringApi: + case DbgKdGetStringApi: gdb_send_debug_io(String, TRUE); break; default: @@ -362,28 +363,34 @@ _Out_ PULONG DataLength, _Inout_ PKD_CONTEXT KdContext) { - DBGKD_MANIPULATE_STATE64* State; - - /* Special handling for breakin packet */ if (PacketType == PACKET_TYPE_KD_POLL_BREAKIN) { return KdpPollBreakIn(); }
- if (PacketType != PACKET_TYPE_KD_STATE_MANIPULATE) - { - /* What should we do ? */ - while (1); - } - - State = (DBGKD_MANIPULATE_STATE64*)MessageHeader->Buffer; - - /* Maybe we are in a send<->receive loop that GDB doesn't need to know about */ - if (KdpManipulateStateHandler != NULL) - return KdpManipulateStateHandler(State, MessageData, DataLength, KdContext); - - /* Receive data from GDB and interpret it */ - return gdb_receive_and_interpret_packet(State, MessageData, DataLength, KdContext); + if (PacketType == PACKET_TYPE_KD_DEBUG_IO) + { + /* HACK ! RtlAssert asks for (boipt), always say "o" --> break once. */ + MessageData->Length = 1; + MessageData->Buffer[0] = 'o'; + return KdPacketReceived; + } + + if (PacketType == PACKET_TYPE_KD_STATE_MANIPULATE) + { + DBGKD_MANIPULATE_STATE64* State = (DBGKD_MANIPULATE_STATE64*)MessageHeader->Buffer; + + /* Maybe we are in a send<->receive loop that GDB doesn't need to know about */ + if (KdpManipulateStateHandler != NULL) + return KdpManipulateStateHandler(State, MessageData, DataLength, KdContext); + + /* Receive data from GDB and interpret it */ + return gdb_receive_and_interpret_packet(State, MessageData, DataLength, KdContext); + } + + /* What should we do ? */ + while (1); + return KdPacketNeedsResend; }
VOID