fn write_response()

in reverie-ptrace/src/gdbstub/commands/mod.rs [471:577]


    fn write_response(&self, writer: &mut ResponseWriter) {
        match self {
            StopReason::NewTask(new_task) => {
                writer.put_str("T05");
                match new_task.op {
                    ChildOp::Fork => {
                        // T05fork:p21feb6.21feb6;06:30dcffffff7f0000;07:10dcffffff7f0000;10:37c2ecf7ff7f0000;thread:p21f994.21f994;core:10;
                        let thread_id = ThreadId {
                            pid: IdKind::from_raw(new_task.child.as_raw()),
                            tid: IdKind::from_raw(new_task.child.as_raw()),
                        };
                        writer.put_str("fork:");
                        thread_id.write_response(writer);
                        writer.put_str(";");
                    }
                    ChildOp::Vfork => {
                        let thread_id = ThreadId {
                            pid: IdKind::from_raw(new_task.child.as_raw()),
                            tid: IdKind::from_raw(new_task.child.as_raw()),
                        };
                        writer.put_str("vfork:");
                        thread_id.write_response(writer);
                        writer.put_str(";");
                    }
                    ChildOp::Clone => {
                        let thread_id = ThreadId {
                            pid: IdKind::from_raw(new_task.tgid.as_raw()),
                            tid: IdKind::from_raw(new_task.child.as_raw()),
                        };
                        writer.put_str("create:");
                        thread_id.write_response(writer);
                        writer.put_str(";");
                    }
                }
                for (regno, regval) in &new_task.regs.0 {
                    writer.put_num(*regno);
                    writer.put_str(":");
                    writer.put_hex_encoded(&regval.to_ne_bytes());
                    writer.put_str(";");
                }
                let thread_id = ThreadId::pid_tid(new_task.tgid.as_raw(), new_task.pid.as_raw());
                writer.put_str("thread:");
                thread_id.write_response(writer);
                writer.put_str(";");
            }
            StopReason::Stopped(stopped) => {
                writer.put_str("T05");
                match &stopped.event {
                    StopEvent::Signal(_) => {}
                    StopEvent::SwBreak => {
                        writer.put_str("swbreak:;");
                    }
                    StopEvent::Vforkdone => {
                        writer.put_str("vforkdone:;");
                    }
                    StopEvent::Exec(p) => {
                        // T05exec:2f746d702f6631;06:0000000000000000;07:80ddffffff7f0000;10:9030fdf7ff7f0000;thread:p350ad8.350ad8;core:9;
                        writer.put_str("exec:");
                        if let Some(p) = p.to_str() {
                            writer.put_hex_encoded(p.as_bytes());
                        }
                        writer.put_str(";");
                    }
                    StopEvent::ReplayDone(log) => match log {
                        ReplayLog::Begin => writer.put_str("replaylog:begin;"),
                        ReplayLog::End => writer.put_str("replaylog:end;"),
                    },
                }
                for (regno, regval) in &stopped.regs.0 {
                    writer.put_num(*regno);
                    writer.put_str(":");
                    writer.put_hex_encoded(&regval.to_ne_bytes());
                    writer.put_str(";");
                }
                let thread_id = ThreadId::pid_tid(stopped.tgid.as_raw(), stopped.pid.as_raw());
                writer.put_str("thread:");
                thread_id.write_response(writer);
                writer.put_str(";");
            }
            StopReason::Exited(pid, exit_status) => {
                match exit_status {
                    ExitStatus::Exited(code) => {
                        writer.put_str("W");
                        writer.put_hex_encoded(&[*code as u8]);
                    }
                    ExitStatus::Signaled(sig, _) => {
                        writer.put_str("X");
                        writer.put_hex_encoded(&[(*sig as u8) | 0x80]);
                    }
                }
                writer.put_str(";process:");
                writer.put_num(pid.as_raw());
            }
            StopReason::ThreadExited(pid, tgid, exit_status) => {
                match exit_status {
                    ExitStatus::Exited(code) => {
                        writer.put_str("w");
                        writer.put_hex_encoded(&[*code as u8]);
                    }
                    ExitStatus::Signaled(_, _) => unreachable!(),
                }
                writer.put_str(";");
                let threadid = ThreadId::pid_tid(tgid.as_raw(), pid.as_raw());
                threadid.write_response(writer);
            }
        }
    }