--- title: "Reading notes: Writing a basic `async` debugger" tags: WG-async, reading-club, minutes date: 2023-10-19 url: https://hackmd.io/A1tDROG0TwWZjOMW3w7ZvQ --- # Reading notes: Link to document: https://cliffle.com/blog/lildb/ ## Attendance - People: TC, zmitchell, eholk, yosh ## Terminology yosh: I'm surprised they're coming up with new terminology in this post. What they're referring to as an "await-trace" I've always known as a "logical trace"? As opposed to I guess "physical stack trace", which is the way "normal" stack traces work. yosh: I think I first saw this pop up when Chrome added support for async debugging in devtools in ~2016 or so? zmitchell: Are there places outside of async that a logical trace would show up? yosh: Anything that suspends, moves, and then resumes somewhere else. You could imagine a trace across multiple threads being "logical". A lot of distributed tracing things are able to create traces across client/server/database verticals as well. The meaning of "trace" becomes a bit dependent on the context there, but I feel the term can be applied more broadly. ## Missing pieces zmitchell: What are the missing pieces preventing us from writing an async-debugger today, or adding support for async-specific debugging to something like gdb/rust-gdb? - Query the existing tasks yosh: This is the work mwoerster was working on before going on parental leave. It's in-progress. He should have a good overview of the exact state, but iirc you do indeed need to write debugger-specific plugins. TC: Here's a link to him describing his work: https://internals.rust-lang.org/t/async-debugging-logical-stack-traces-setting-goals-collecting-examples/15547 TC: As linked there, here's the document in our own repo about the debugging experience: https://github.com/rust-lang/wg-async/blob/master/src/vision/submitted_stories/shiny_future/grace_debugs_a_crash_dump_again.md TC: And here's a link to the initiative: https://github.com/rust-lang/async-crashdump-debugging-initiative/tree/master https://github.com/rust-lang/rust-dbg-ext yosh; Wesley is the other expert on debuggers in Rust. yosh: I wrote ["Rust should own its debugger experience"](https://blog.yoshuawuyts.com/rust-should-own-its-debugger-experience/) to cover some of the shortcomings I see in making this a fully integrated experience. Right now we're somewhat dependent on upstreaming things like async integration, symbol translation, etc. to e.g. gdb/lldb/windbg, etc. In my opinion if we want to really provide a "first-class async debug experience", one of the required steps is for `cargo` to be able to run the debuggers (maybe even package them too), insert the right plugins, and then provide that for users. There are a lot of moving parts required to make this like, actually turnkey and easy to use. ## "intrusive tracing" terminology yosh: canonical terms I've seen used for this: - intrusive tracing -> "static tracing" (requires annotations) - non-intrusive tracing -> "dynamic tracing" (does not require annotations) source: Brendan Gregg - "Systems Performance and the Cloud (first edition)" ## How would you go about writing your own debugger? Zach: How would you? Eric: Debuggers already exist. We could probably extend those to be able to create the logical traces using their plugin API Zach: Is there a specific module you could point me at where I could start looking at? Eric: I believe "generator.rs"? Eric: Here it is: https://github.com/rust-lang/rust/blob/master/compiler/rustc_mir_transform/src/generator.rs Eric: That's pretty low level, so it may not be the best place to start if you're just trying to get a high level understanding, but it probably has the details you'd need to find the interesting debug info, or at least will point you in the right direction. ## DWARF extensions? > To fix this, I think Rust needs to add some DWARF extensions, something they’ve managed to avoid so far (admirably!). But that’ll be a harder problem. eholk: This was kind of an interesting claim, but something I'm currently skeptical of. Could Rust do better if it were willing to make what amounts to a custom symbol format and its own debugger?