void write_child_data(struct context *ctx, const size_t size, void *addr, void *data) { ssize_t written = pwrite(ctx->child_mem_fd, data, size, (off_t) addr); if (written != size) { write_child_data_n(ctx->child_tid, size, addr, data); } }
static void remove_sw_breakpoint(struct context *ctx, const struct dbg_request* req) { struct breakpoint* bp = find_breakpoint(req->mem.addr); assert(sizeof(int_3_insn) == req->mem.len); if (!bp) { warn("Couldn't find breakpoint %p to remove", req->mem.addr); return; } write_child_data_n(ctx->child_tid, sizeof(bp->overwritten_data), bp->addr, &bp->overwritten_data); remove_breakpoint(bp); sys_free((void**)&bp); }
static void set_sw_breakpoint(struct context *ctx, const struct dbg_request* req) { struct breakpoint* bp = sys_malloc_zero(sizeof(*bp)); byte* orig_data_ptr; assert(sizeof(int_3_insn) == req->mem.len); bp->addr = req->mem.addr; orig_data_ptr = read_child_data(ctx, 1, bp->addr); bp->overwritten_data = *orig_data_ptr; sys_free((void**)&orig_data_ptr); write_child_data_n(ctx->child_tid, sizeof(int_3_insn), bp->addr, &int_3_insn); add_breakpoint(bp); }