code: def read_and_forward_gdb_output():
      
  
      while True:
          socketio.sleep(0.05)
          controllers_to_remove = []
          controller_items = _state.controller_to_client_ids.items()
          for controller, client_ids in controller_items:
              try:
                  try:
                      response = controller.get_gdb_response(
                          timeout_sec=0, raise_error_on_timeout=False
                      )
                  except NoGdbProcessError:
                      response = None
                      send_msg_to_clients(
                          client_ids,
                          "The underlying gdb process has been killed. This tab will no longer function as expected.",
                          error=True,
                      )
                      controllers_to_remove.append(controller)
  
                  if response:
                      for client_id in client_ids:
                          logger.info(
                              "emiting message to websocket client id " + client_id
                          )
                          socketio.emit(
                              "gdb_response",
                              response,
                              namespace="/gdb_listener",
                              room=client_id,
                          )
                  else:
                      # there was no queued response from gdb, not a problem
                      pass
  
              except Exception:
                  logger.error(traceback.format_exc())
  
          for controller in controllers_to_remove:
              _state.remove_gdb_controller(controller)
docs: A task that runs on a different thread, and emits websocket messages
      of gdb responses