code: func (m *kubeGenericRuntimeManager) doBackOff(pod *v1.Pod, container *v1.Container, podStatus *kubecontainer.PodStatus, backOff *flowcontrol.Backoff) (bool, string, error) {
  	var cStatus *kubecontainer.ContainerStatus
  	for _, c := range podStatus.ContainerStatuses {
  		if c.Name == container.Name && c.State == kubecontainer.ContainerStateExited {
  			cStatus = c
  			break
  		}
  	}
  
  	if cStatus == nil {
  		return false, "", nil
  	}
  
  	klog.V(3).Infof("checking backoff for container %q in pod %q", container.Name, format.Pod(pod))
  	// Use the finished time of the latest exited container as the start point to calculate whether to do back-off.
  	ts := cStatus.FinishedAt
  	// backOff requires a unique key to identify the container.
  	key := getStableKey(pod, container)
  	if backOff.IsInBackOffSince(key, ts) {
  		if ref, err := kubecontainer.GenerateContainerRef(pod, container); err == nil {
  			m.recorder.Eventf(ref, v1.EventTypeWarning, events.BackOffStartContainer, "Back-off restarting failed container")
  		}
  		err := fmt.Errorf("Back-off %s restarting failed container=%s pod=%s", backOff.Get(key), container.Name, format.Pod(pod))
  		klog.V(3).Infof("%s", err.Error())
  		return true, err.Error(), kubecontainer.ErrCrashLoopBackOff
  	}
  
  	backOff.Next(key, ts)
  	return false, "", nil
  }
docs: // If a container is still in backoff, the function will return a brief backoff error and
  // a detailed error message.