code: def threads_list(io_handler, max_depth=1):
          
          # Normalize maximum depth
          try:
              max_depth = int(max_depth)
              if max_depth < 1:
                  max_depth = None
          except (ValueError, TypeError):
              max_depth = None
  
          # pylint: disable=W0212
          try:
              # Extract frames
              frames = sys._current_frames()
  
              # Get the thread ID -> Thread mapping
              names = threading._active.copy()
          except AttributeError:
              io_handler.write_line("sys._current_frames() is not available.")
              return
  
          # Sort by thread ID
          thread_ids = sorted(frames.keys())
          lines = []
          for thread_id in thread_ids:
              # Get the corresponding stack
              stack = frames[thread_id]
  
              # Try to get the thread name
              try:
                  name = names[thread_id].name
              except KeyError:
                  name = "<unknown>"
  
              # Construct the code position
              lines.append("Thread ID: {0} - Name: {1}".format(thread_id, name))
              lines.append("Stack Trace:")
  
              trace_lines = []
              depth = 0
              frame = stack
              while frame is not None and (
                  max_depth is None or depth < max_depth
              ):
                  # Store the line information
                  trace_lines.append(format_frame_info(frame))
  
                  # Previous frame...
                  frame = frame.f_back
                  depth += 1
  
              # Reverse the lines
              trace_lines.reverse()
  
              # Add them to the printed lines
              lines.extend(trace_lines)
              lines.append("")
  
          lines.append("")
  
          # Sort the lines
          io_handler.write("\n".join(lines))
docs: Lists the active threads and their current code line