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(®val.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(®val.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);
}
}
}