docs: def simple_debug_shell(globals, locals):
      """
      :param dict[str] globals:
      :param dict[str] locals:
      :return: nothing
      """
      try:
          import readline
      except ImportError:
          pass  # ignore
      compile_string_fn = "<simple_debug_shell input>"
      while True:
          try:
              s = raw_input("> ")
          except (KeyboardInterrupt, EOFError):
              print("breaked debug shell: " + sys.exc_info()[0].__name__)
              break
          if s.strip() == "":
              continue
          try:
              c = compile(s, compile_string_fn, "single")
          except Exception as e:
              print("%s : %s in %r" % (e.__class__.__name__, str(e), s))
          else:
              set_linecache(compile_string_fn, s)
              # noinspection PyBroadException
              try:
                  ret = eval(c, globals, locals)
              except (KeyboardInterrupt, SystemExit):
                  print("debug shell exit: " + sys.exc_info()[0].__name__)
                  break
              except Exception:
                  print("Error executing %r" % s)
                  better_exchook(*sys.exc_info(), autodebugshell=False)
              else:
                  # noinspection PyBroadException
                  try:
                      if ret is not None:
                          print(ret)
                  except Exception:
                      print("Error printing return value of %r" % s)
                      better_exchook(*sys.exc_info(), autodebugshell=False)