use dbgscope::dbgeng::DebugEngine;
fn show(tag: &str, e: &DebugEngine) {
println!("--- {tag}");
println!(" has_target = {:?}", e.has_target());
match e.debuggee_type() {
Ok(t) => println!(
" debuggee_type = class {} qualifier {} (kernel {}, live kernel {})",
t.class,
t.qualifier,
t.is_kernel(),
t.is_live_kernel()
),
Err(err) => println!(" debuggee_type = ERR {err}"),
}
match e.dump_files() {
Ok(files) => println!(" dump_files = {files:?}"),
Err(err) => println!(" dump_files = ERR {err}"),
}
match e.current_process_system_id() {
Ok(pid) => println!(" process id = {pid}"),
Err(err) => println!(" process id = ERR {err}"),
}
match e.kernel_connection_options() {
Ok(options) => {
let scheme = options.split(':').next().unwrap_or("").to_string();
println!(
" kernel conn = scheme {:?}, {} chars, hash {:016x}",
scheme,
options.len(),
fnv(&options)
);
}
Err(err) => println!(" kernel conn = ERR {err}"),
}
}
fn fnv(s: &str) -> u64 {
let mut h: u64 = 0xcbf2_9ce4_8422_2325;
for b in s.as_bytes() {
h ^= u64::from(*b);
h = h.wrapping_mul(0x1000_0000_01b3);
}
h
}
fn main() {
if let Ok(connection) = std::env::var("DBGSCOPE_PROBE_KERNEL") {
let e = DebugEngine::new();
match e.attach_kernel(&connection) {
Ok(()) => {
show("a live kernel connection", &e);
match e.end_session() {
Ok(left) => println!(" released: {left:?}"),
Err(err) => println!(" release ERR: {err}"),
}
}
Err(err) => println!("kernel attach failed: {err}"),
}
return;
}
let dump = std::env::args().nth(1);
{
let e = DebugEngine::new();
show("a fresh engine, no target at all", &e);
}
{
let e = DebugEngine::new();
match e.launch_process("cmd.exe /c ping -n 3 127.0.0.1") {
Ok(()) => {
show("a launched live process, stopped at its initial break", &e);
println!("--- running it to completion");
match e.execute_and_wait("g", 30_000) {
Ok(run) => println!(" g -> target_gone {}", run.target_gone),
Err(err) => println!(" g -> ERR {err}"),
}
show("the same engine once its debuggee has exited", &e);
}
Err(err) => println!("launch failed: {err}"),
}
}
let Some(path) = dump else {
return;
};
let e = DebugEngine::new();
match e.open_dump(&path) {
Ok(()) => {
show(&format!("a dump opened but not yet loaded: {path}"), &e);
match e.wait_for_event(60_000) {
Ok(outcome) => println!("--- load wait: {outcome:?}"),
Err(err) => println!("--- load wait ERR: {err}"),
}
show(&format!("the same dump, loaded: {path}"), &e);
}
Err(err) => println!("open_dump failed: {err}"),
}
}