docs: def dump_all_thread_tracebacks(exclude_thread_ids=None, file=None):
      """
      Prints the traceback of all threads.
  
      :param set[int]|list[int]|None exclude_thread_ids: threads to exclude
      :param io.TextIOBase|io.StringIO file: output stream
      """
      if exclude_thread_ids is None:
          exclude_thread_ids = []
      if not file:
          file = sys.stdout
      import threading
  
      if hasattr(sys, "_current_frames"):
          print("", file=file)
          threads = {t.ident: t for t in threading.enumerate()}
          # noinspection PyProtectedMember
          for tid, stack in sys._current_frames().items():
              if tid in exclude_thread_ids:
                  continue
              # This is a bug in earlier Python versions.
              # http://bugs.python.org/issue17094
              # Note that this leaves out all threads not created via the threading module.
              if tid not in threads:
                  continue
              tags = []
              thread = threads.get(tid)
              if thread:
                  assert isinstance(thread, threading.Thread)
                  if thread is threading.currentThread():
                      tags += ["current"]
                  # noinspection PyProtectedMember,PyUnresolvedReferences
                  if isinstance(thread, threading._MainThread):
                      tags += ["main"]
                  tags += [str(thread)]
              else:
                  tags += ["unknown with id %i" % tid]
              print("Thread %s:" % ", ".join(tags), file=file)
              print_tb(stack, file=file)
              print("", file=file)
          print("That were all threads.", file=file)
      else:
          print("Does not have sys._current_frames, cannot get thread tracebacks.", file=file)