diff --git a/src/core/ext/client_config/client_channel.c b/src/core/ext/client_config/client_channel.c
index 7c6b19d558c9939300b789a268738e22bbf038ca..0b220c04d49684869be9dc7d02779c3cf4acdb55 100644
--- a/src/core/ext/client_config/client_channel.c
+++ b/src/core/ext/client_config/client_channel.c
@@ -128,8 +128,8 @@ static void set_channel_connectivity_state_locked(grpc_exec_ctx *exec_ctx,
         /* mask= */ GRPC_INITIAL_METADATA_IGNORE_CONNECTIVITY,
         /* check= */ 0);
   }
-  grpc_connectivity_state_set(exec_ctx, &chand->state_tracker, state,
-                              error, reason);
+  grpc_connectivity_state_set(exec_ctx, &chand->state_tracker, state, error,
+                              reason);
 }
 
 static void on_lb_policy_state_changed_locked(grpc_exec_ctx *exec_ctx,
@@ -228,8 +228,8 @@ static void cc_on_config_changed(grpc_exec_ctx *exec_ctx, void *arg,
   }
 
   if (error == GRPC_ERROR_NONE && chand->resolver) {
-    set_channel_connectivity_state_locked(exec_ctx, chand, state, GRPC_ERROR_REF(state_error),
-                                          "new_lb+resolver");
+    set_channel_connectivity_state_locked(
+        exec_ctx, chand, state, GRPC_ERROR_REF(state_error), "new_lb+resolver");
     if (lb_policy != NULL) {
       watch_lb_policy(exec_ctx, chand, lb_policy, state);
     }
@@ -269,6 +269,7 @@ static void cc_on_config_changed(grpc_exec_ctx *exec_ctx, void *arg,
   }
 
   GRPC_CHANNEL_STACK_UNREF(exec_ctx, chand->owning_stack, "resolver");
+  GRPC_ERROR_UNREF(state_error);
 }
 
 static void cc_start_transport_op(grpc_exec_ctx *exec_ctx,
@@ -316,8 +317,8 @@ static void cc_start_transport_op(grpc_exec_ctx *exec_ctx,
       if (!chand->started_resolving) {
         grpc_closure_list_fail_all(&chand->waiting_for_config_closures,
                                    GRPC_ERROR_REF(op->disconnect_with_error));
-        grpc_exec_ctx_enqueue_list(exec_ctx, &chand->waiting_for_config_closures,
-                                   NULL);
+        grpc_exec_ctx_enqueue_list(exec_ctx,
+                                   &chand->waiting_for_config_closures, NULL);
       }
       if (chand->lb_policy != NULL) {
         grpc_pollset_set_del_pollset_set(exec_ctx,
diff --git a/src/core/lib/iomgr/closure.c b/src/core/lib/iomgr/closure.c
index 866110d89cab9daf6370bc4fef7c42644785f9ce..0b6c3b25392ea6653ca53f71276fafb4c13a4ef4 100644
--- a/src/core/lib/iomgr/closure.c
+++ b/src/core/lib/iomgr/closure.c
@@ -43,7 +43,10 @@ void grpc_closure_init(grpc_closure *closure, grpc_iomgr_cb_func cb,
 
 void grpc_closure_list_append(grpc_closure_list *closure_list,
                               grpc_closure *closure, grpc_error *error) {
-  if (closure == NULL) return;
+  if (closure == NULL) {
+    GRPC_ERROR_UNREF(error);
+    return;
+  }
   closure->error = error;
   closure->next_data.next = NULL;
   if (closure_list->head == NULL) {
diff --git a/src/core/lib/iomgr/error.c b/src/core/lib/iomgr/error.c
index cc0265737a37b269f52fa3336d67f24fda16de55..d67eb6e425280f9655d86bce775dae29dd410614 100644
--- a/src/core/lib/iomgr/error.c
+++ b/src/core/lib/iomgr/error.c
@@ -158,10 +158,11 @@ static bool is_special(grpc_error *err) {
          err == GRPC_ERROR_CANCELLED;
 }
 
-grpc_error *grpc_error_ref(grpc_error *err, const char *file, int line) {
+grpc_error *grpc_error_ref(grpc_error *err, const char *file, int line,
+                           const char *func) {
   if (is_special(err)) return err;
-  gpr_log(GPR_DEBUG, "%p: %d -> %d [%s:%d]", err, err->refs.count,
-          err->refs.count + 1, file, line);
+  gpr_log(GPR_DEBUG, "%p: %d -> %d [%s:%d %s]", err, err->refs.count,
+          err->refs.count + 1, file, line, func);
   gpr_ref(&err->refs);
   return err;
 }
@@ -175,10 +176,11 @@ static void error_destroy(grpc_error *err) {
   gpr_free(err);
 }
 
-void grpc_error_unref(grpc_error *err, const char *file, int line) {
+void grpc_error_unref(grpc_error *err, const char *file, int line,
+                      const char *func) {
   if (is_special(err)) return;
-  gpr_log(GPR_DEBUG, "%p: %d -> %d [%s:%d]", err, err->refs.count,
-          err->refs.count - 1, file, line);
+  gpr_log(GPR_DEBUG, "%p: %d -> %d [%s:%d %s]", err, err->refs.count,
+          err->refs.count - 1, file, line, func);
   if (gpr_unref(&err->refs)) {
     error_destroy(err);
   }
@@ -191,6 +193,7 @@ grpc_error *grpc_error_create(const char *file, int line, const char *desc,
   if (err == NULL) {  // TODO(ctiller): make gpr_malloc return NULL
     return GRPC_ERROR_OOM;
   }
+  gpr_log(GPR_DEBUG, "%p create [%s:%d]", err, file, line);
   err->ints = gpr_avl_add(gpr_avl_create(&avl_vtable_ints),
                           (void *)(uintptr_t)GRPC_ERROR_INT_FILE_LINE,
                           (void *)(uintptr_t)line);
diff --git a/src/core/lib/iomgr/error.h b/src/core/lib/iomgr/error.h
index 2b56aede7566d42526279bf340e47639cfc5e0b2..266a621704d6676dabc811e2ce4dec23da8dc685 100644
--- a/src/core/lib/iomgr/error.h
+++ b/src/core/lib/iomgr/error.h
@@ -97,10 +97,13 @@ grpc_error *grpc_error_create(const char *file, int line, const char *desc,
 #define GRPC_ERROR_CREATE_REFERENCING(desc, errs, count) \
   grpc_error_create(__FILE__, __LINE__, desc, errs, count)
 
-grpc_error *grpc_error_ref(grpc_error *err, const char *file, int line);
-void grpc_error_unref(grpc_error *err, const char *file, int line);
-#define GRPC_ERROR_REF(err) grpc_error_ref(err, __FILE__, __LINE__)
-#define GRPC_ERROR_UNREF(err) grpc_error_unref(err, __FILE__, __LINE__)
+grpc_error *grpc_error_ref(grpc_error *err, const char *file, int line,
+                           const char *func);
+void grpc_error_unref(grpc_error *err, const char *file, int line,
+                      const char *func);
+#define GRPC_ERROR_REF(err) grpc_error_ref(err, __FILE__, __LINE__, __func__)
+#define GRPC_ERROR_UNREF(err) \
+  grpc_error_unref(err, __FILE__, __LINE__, __func__)
 
 grpc_error *grpc_error_set_int(grpc_error *src, grpc_error_ints which,
                                intptr_t value);
diff --git a/src/core/lib/surface/call.c b/src/core/lib/surface/call.c
index 66bdb7b213c5b4d1585b160a5b9d424f154cceaf..1ad635710a5fa8183c4029e3214c07fa6bd92dc4 100644
--- a/src/core/lib/surface/call.c
+++ b/src/core/lib/surface/call.c
@@ -1119,6 +1119,8 @@ static void finish_batch(grpc_exec_ctx *exec_ctx, void *bctlp,
   grpc_call *child_call;
   grpc_call *next_child_call;
 
+  GRPC_ERROR_REF(error);
+
   gpr_mu_lock(&call->mu);
   if (bctl->send_initial_metadata) {
     if (error != GRPC_ERROR_NONE) {
@@ -1170,7 +1172,7 @@ static void finish_batch(grpc_exec_ctx *exec_ctx, void *bctlp,
     GRPC_ERROR_UNREF(error);
     error = GRPC_ERROR_NONE;
   }
-  bctl->error = GRPC_ERROR_REF(error);
+  bctl->error = error;
   gpr_mu_unlock(&call->mu);
   if (gpr_unref(&bctl->steps_to_complete)) {
     post_batch_completion(exec_ctx, bctl);