diff --git a/loopy/schedule.py b/loopy/schedule.py
index 1d0dc1221a8280d73cdd03858bb72404c7c79afb..493108c68ff7e5322487dfd2796e8ffff6069e8d 100644
--- a/loopy/schedule.py
+++ b/loopy/schedule.py
@@ -343,6 +343,11 @@ class ScheduleDebugger:
     def start(self):
         from time import time
         self.start_time = time()
+
+
+class ScheduleDebugInput(Exception):
+    pass
+
 # }}}
 
 
@@ -450,7 +455,9 @@ def generate_loop_schedules_internal(
         for iname, val in six.iteritems(sched_state.loop_nest_map):
             print("%s : %s" % (iname, ", ".join(val)))
         print(75*"=")
-        print("WHY IS THIS A DEAD-END SCHEDULE?")
+
+        if debug.debug_length == len(debug.longest_rejected_schedule):
+            print("WHY IS THIS A DEAD-END SCHEDULE?")
 
     #if len(schedule) == 2:
         #from pudb import set_trace; set_trace()
@@ -525,10 +532,10 @@ def generate_loop_schedules_internal(
 
         # }}}
 
-        if is_ready and allow_insn:
-            if debug_mode:
-                print("scheduling '%s'" % insn.id)
+        if is_ready and debug_mode:
+            print("ready to schedule '%s'" % insn.id)
 
+        if is_ready and allow_insn and not debug_mode:
             iid_set = frozenset([insn.id])
 
             # {{{ update active group counts for added instruction
@@ -618,7 +625,7 @@ def generate_loop_schedules_internal(
                             can_leave = True
                         break
 
-            if can_leave:
+            if can_leave and not debug_mode:
                 for sub_sched in generate_loop_schedules_internal(
                         sched_state.copy(
                             schedule=(
@@ -790,37 +797,42 @@ def generate_loop_schedules_internal(
 
         if debug_mode:
             print("useful inames: %s" % ",".join(useful_loops_set))
-
-        for tier in priority_tiers:
-            found_viable_schedule = False
-
-            for iname in sorted(tier,
-                    key=lambda iname: iname_to_usefulness.get(iname, 0),
-                    reverse=True):
-
-                for sub_sched in generate_loop_schedules_internal(
-                        sched_state.copy(
-                            schedule=(
-                                sched_state.schedule
-                                + (EnterLoop(iname=iname),)),
-                            active_inames=(
-                                sched_state.active_inames + (iname,)),
-                            entered_inames=(
-                                sched_state.entered_inames | frozenset((iname,))),
-                            ),
-                        allow_boost=rec_allow_boost,
-                        debug=debug):
-                    found_viable_schedule = True
-                    yield sub_sched
-
-            if found_viable_schedule:
-                return
+        else:
+            for tier in priority_tiers:
+                found_viable_schedule = False
+
+                for iname in sorted(tier,
+                        key=lambda iname: iname_to_usefulness.get(iname, 0),
+                        reverse=True):
+
+                    for sub_sched in generate_loop_schedules_internal(
+                            sched_state.copy(
+                                schedule=(
+                                    sched_state.schedule
+                                    + (EnterLoop(iname=iname),)),
+                                active_inames=(
+                                    sched_state.active_inames + (iname,)),
+                                entered_inames=(
+                                    sched_state.entered_inames
+                                    | frozenset((iname,))),
+                                ),
+                            allow_boost=rec_allow_boost,
+                            debug=debug):
+                        found_viable_schedule = True
+                        yield sub_sched
+
+                if found_viable_schedule:
+                    return
 
     # }}}
 
     if debug_mode:
         print(75*"=")
-        six.moves.input("Hit Enter for next schedule:")
+        inp = six.moves.input("Hit Enter for next schedule, "
+                "or enter a number to examine schedules of a "
+                "different length:")
+        if inp:
+            raise ScheduleDebugInput(inp)
 
     if not sched_state.active_inames and not sched_state.unscheduled_insn_ids:
         # if done, yield result
@@ -1289,9 +1301,17 @@ def generate_loop_schedules(kernel, debug_args={}):
             print()
 
             debug.debug_length = len(debug.longest_rejected_schedule)
-            for _ in generate_loop_schedules_internal(sched_state,
-                    debug=debug):
-                pass
+            while True:
+                try:
+                    for _ in generate_loop_schedules_internal(sched_state,
+                            debug=debug):
+                        pass
+
+                except ScheduleDebugInput as e:
+                    debug.debug_length = int(str(e))
+                    continue
+
+                break
 
     try:
         for gen in generators:
@@ -1327,6 +1347,7 @@ def generate_loop_schedules(kernel, debug_args={}):
                 break
 
     except KeyboardInterrupt:
+        print()
         print(75*"-")
         print("Interrupted during scheduling")
         print(75*"-")