Good to know! I've seen the pattern of "int3; nop" before, but I've never seen the explanation for why. I'd always assumed it involved the desire to be able to live-patch a different instruction over it.
In Rust, we're using the `llvm.debugtrap` intrinsic. Does that DTRT?