That would probably help with viewing of stacktraces and variable data, but wouldn't opcodes still be needed to actually control stepping and breakpoints in the app itself?
No, GDB will handle the breakpoints natively.
Which is why it would be so convenient.
Basically, when you tell GDB to break at foo.pike:398, it will look up the address in the JIT:ed code for that line, and then insert a normal breakpoint there.
There is no need at all for breakpoint, step etc opcodes.
Those are only needed if you want to do debuggin in the virtual machine, and not in the actual machine (basically, inserting breakpoints is exactly what GDB is doing, but it is doing so in the native generated code)