1. A system comprising: at least one processor of a computing device; a memory of the computing device; and a debugger causing the at least one processor to: execute native code of a program, the native code including at least one pre-determined debug bailout point, the at least one pre-determined debug bailout point representing a location in the program at which the debugger automatically transitions to debugging non-native code when at least one debug bailout condition is met; and in response to detecting that the at least one debug bailout condition has been met: receive current state of the native code executing under the debugger; instantiate an instance of an interpreter; create an interpreter stack frame for the instance of the interpreter; populate the interpreter stack frame for the instantiated interpreter with the current state of the native code; and transition from debugging the native code representing the program to debugging corresponding non-native code representing the program.