Zebediah Figura : winedbg: Use gdb's default handling of breakpoints.
Alexandre Julliard
julliard at winehq.org
Fri May 18 16:53:13 CDT 2018
Module: wine
Branch: master
Commit: a602405efd59d9728b29216828cc9f9f5c26b425
URL: https://source.winehq.org/git/wine.git/?a=commit;h=a602405efd59d9728b29216828cc9f9f5c26b425
Author: Zebediah Figura <z.figura12 at gmail.com>
Date: Fri May 18 08:51:22 2018 -0500
winedbg: Use gdb's default handling of breakpoints.
We're essentially doing the same thing, so there's no reason not to leave
the handling entirely to gdb.
Signed-off-by: Zebediah Figura <z.figura12 at gmail.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
programs/winedbg/gdbproxy.c | 129 +-------------------------------------------
1 file changed, 2 insertions(+), 127 deletions(-)
diff --git a/programs/winedbg/gdbproxy.c b/programs/winedbg/gdbproxy.c
index 3909cb5..3ecf629 100644
--- a/programs/winedbg/gdbproxy.c
+++ b/programs/winedbg/gdbproxy.c
@@ -72,13 +72,6 @@
#define GDBPXY_TRC_WIN32_ERROR 0x20
#define GDBPXY_TRC_COMMAND_FIXME 0x80
-struct gdb_ctx_Xpoint
-{
- enum be_xpoint_type type; /* (-1) == be_xpoint_free means free */
- void* addr;
- unsigned long val;
-};
-
struct gdb_context
{
/* gdb information */
@@ -105,8 +98,6 @@ struct gdb_context
CONTEXT context;
/* Win32 information */
struct dbg_process* process;
-#define NUM_XPOINT 32
- struct gdb_ctx_Xpoint Xpoints[NUM_XPOINT];
/* Unix environment */
unsigned long wine_segs[3]; /* load addresses of the ELF wine exec segments (text, bss and data) */
};
@@ -1570,28 +1561,6 @@ static enum packet_return packet_thread(struct gdb_context* gdbctx)
}
}
-static BOOL read_memory(struct gdb_context *gdbctx, char *addr, char *buffer, SIZE_T blk_len, SIZE_T *r)
-{
- /* Wrapper around process_io->read() that replaces values displaced by breakpoints. */
-
- BOOL ret;
-
- ret = gdbctx->process->process_io->read(gdbctx->process->handle, addr, buffer, blk_len, r);
- if (ret)
- {
- struct gdb_ctx_Xpoint *xpt;
-
- for (xpt = &gdbctx->Xpoints[NUM_XPOINT - 1]; xpt >= gdbctx->Xpoints; xpt--)
- {
- char *xpt_addr = xpt->addr;
-
- if (xpt->type != be_xpoint_free && xpt_addr >= addr && xpt_addr < addr + blk_len)
- buffer[xpt_addr - addr] = xpt->val;
- }
- }
- return ret;
-}
-
static enum packet_return packet_read_memory(struct gdb_context* gdbctx)
{
char *addr;
@@ -1608,7 +1577,8 @@ static enum packet_return packet_read_memory(struct gdb_context* gdbctx)
for (nread = 0; nread < len; nread += r, addr += r)
{
blk_len = min(sizeof(buffer), len - nread);
- if (!read_memory(gdbctx, addr, buffer, blk_len, &r) || r == 0)
+ if (!gdbctx->process->process_io->read(gdbctx->process->handle, addr,
+ buffer, blk_len, &r) || r == 0)
{
/* fail at first address, return error */
if (nread == 0) return packet_reply_error(gdbctx, EFAULT);
@@ -2163,97 +2133,6 @@ static enum packet_return packet_thread_alive(struct gdb_context* gdbctx)
return packet_reply_error(gdbctx, ESRCH);
}
-static enum packet_return packet_remove_breakpoint(struct gdb_context* gdbctx)
-{
- void* addr;
- unsigned len;
- struct gdb_ctx_Xpoint* xpt;
- enum be_xpoint_type t;
-
- /* FIXME: check packet_len */
- if (gdbctx->in_packet[0] < '0' || gdbctx->in_packet[0] > '4' ||
- gdbctx->in_packet[1] != ',' ||
- sscanf(gdbctx->in_packet + 2, "%p,%x", &addr, &len) != 2)
- return packet_error;
- if (gdbctx->trace & GDBPXY_TRC_COMMAND)
- fprintf(stderr, "Remove bp %p[%u] typ=%c\n",
- addr, len, gdbctx->in_packet[0]);
- switch (gdbctx->in_packet[0])
- {
- case '0': t = be_xpoint_break; len = 0; break;
- case '1': t = be_xpoint_watch_exec; break;
- case '2': t = be_xpoint_watch_read; break;
- case '3': t = be_xpoint_watch_write; break;
- default: return packet_error;
- }
- for (xpt = &gdbctx->Xpoints[NUM_XPOINT - 1]; xpt >= gdbctx->Xpoints; xpt--)
- {
- if (xpt->addr == addr && xpt->type == t)
- {
- if (be_cpu->remove_Xpoint(gdbctx->process->handle,
- gdbctx->process->process_io, &gdbctx->context,
- t, xpt->addr, xpt->val, len))
- {
- xpt->type = be_xpoint_free;
- return packet_ok;
- }
- break;
- }
- }
- return packet_error;
-}
-
-static enum packet_return packet_set_breakpoint(struct gdb_context* gdbctx)
-{
- void* addr;
- unsigned len;
- struct gdb_ctx_Xpoint* xpt;
- enum be_xpoint_type t;
-
- /* FIXME: check packet_len */
- if (gdbctx->in_packet[0] < '0' || gdbctx->in_packet[0] > '4' ||
- gdbctx->in_packet[1] != ',' ||
- sscanf(gdbctx->in_packet + 2, "%p,%x", &addr, &len) != 2)
- return packet_error;
- if (gdbctx->trace & GDBPXY_TRC_COMMAND)
- fprintf(stderr, "Set bp %p[%u] typ=%c\n",
- addr, len, gdbctx->in_packet[0]);
- switch (gdbctx->in_packet[0])
- {
- case '0': t = be_xpoint_break; len = 0; break;
- case '1': t = be_xpoint_watch_exec; break;
- case '2': t = be_xpoint_watch_read; break;
- case '3': t = be_xpoint_watch_write; break;
- default: return packet_error;
- }
- /* because of packet command handling, this should be made idempotent */
- for (xpt = &gdbctx->Xpoints[NUM_XPOINT - 1]; xpt >= gdbctx->Xpoints; xpt--)
- {
- if (xpt->addr == addr && xpt->type == t)
- return packet_ok; /* nothing to do */
- }
- /* really set the Xpoint */
- for (xpt = &gdbctx->Xpoints[NUM_XPOINT - 1]; xpt >= gdbctx->Xpoints; xpt--)
- {
- if (xpt->type == be_xpoint_free)
- {
- if (be_cpu->insert_Xpoint(gdbctx->process->handle,
- gdbctx->process->process_io, &gdbctx->context,
- t, addr, &xpt->val, len))
- {
- xpt->addr = addr;
- xpt->type = t;
- return packet_ok;
- }
- fprintf(stderr, "cannot set xpoint\n");
- break;
- }
- }
- /* no more entries... eech */
- fprintf(stderr, "Running out of spots for {break|watch}points\n");
- return packet_error;
-}
-
/* =============================================== *
* P A C K E T I N F R A S T R U C T U R E *
* =============================================== *
@@ -2287,8 +2166,6 @@ static struct packet_entry packet_entries[] =
/*{'S', packet_step_signal}, hard(er) to implement */
{'T', packet_thread_alive},
{'v', packet_verbose},
- {'z', packet_remove_breakpoint},
- {'Z', packet_set_breakpoint},
};
static BOOL extract_packets(struct gdb_context* gdbctx)
@@ -2578,8 +2455,6 @@ static BOOL gdb_init_context(struct gdb_context* gdbctx, unsigned flags, unsigne
gdbctx->in_trap = FALSE;
gdbctx->trace = /*GDBPXY_TRC_PACKET | GDBPXY_TRC_COMMAND |*/ GDBPXY_TRC_COMMAND_ERROR | GDBPXY_TRC_COMMAND_FIXME | GDBPXY_TRC_WIN32_EVENT;
gdbctx->process = NULL;
- for (i = 0; i < NUM_XPOINT; i++)
- gdbctx->Xpoints[i].type = -1;
for (i = 0; i < sizeof(gdbctx->wine_segs) / sizeof(gdbctx->wine_segs[0]); i++)
gdbctx->wine_segs[i] = 0;
More information about the wine-cvs
mailing list