df48d89796
In compiled code, a block of instructions that calls the single step handler in the runtime is generated for any pause points. Enabling a breakpoint at a pause point then patches those instructions to instead call a stub. The stub first calls the breakpoint handler in the runtime. The runtime's breakpoint handler returns the original call target for the breakpoint, which the stub then calls. Since the debugger ignores any pause points with the same source location after hitting a breakpoint, this means that setting a breakpoint at a pause point only generates a breakpoint hit event, ensuring that a request to single step after hitting a breakpoint steps to the next location, not the breakpoint location. Similar to compiled code, enabling a breakpoint in interpreted code replaces the original instruction with a special instruction that first calls the breakpoint handler and then performs the original instruction's implementation. However, there is no specific instruction for pause points in interpreted code. Instead, the dispatch loop in the interpreter has two labels for each instruction: one for the instruction's implementation, and another that is used instead when single stepping is enabled. All the single step labels point at the same code block, which first calls the single step handler and then dispatches to the code for the instruction's implementation. This difference in handling breakpoints and single step checks means that pause events are prioritized, not breakpoint hit events, which means single stepping into a breakpoint generates first a pause event and then a breakpoint hit event, which differs from the behavior for compiled code. To fix this, refactor single step handling in the interpreter so that the single step label for breakpoint instructions point to a different code block which first calls the breakpoint handler and then calls the single step handler before dispatching to the original instruction's implementation. TEST=ci Cq-Include-Trybots: luci.dart.try:vm-dyn-linux-debug-x64-try,vm-dyn-mac-debug-arm64-try Change-Id: Id33132bbecc5d0cbd9e92bc5a13d8d8a80155344 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/481782 Reviewed-by: Alexander Markov <alexmarkov@google.com> Commit-Queue: Tess Strickland <sstrickl@google.com> Auto-Submit: Tess Strickland <sstrickl@google.com>