diff --git a/src/core/surface/channel.c b/src/core/surface/channel.c
index e38734c6a4921fb4e7e63a6d247262b13637e1c9..e764a3b9af0a82666137eecbf22a83eef2f66edb 100644
--- a/src/core/surface/channel.c
+++ b/src/core/surface/channel.c
@@ -39,6 +39,7 @@
 #include "src/core/iomgr/iomgr.h"
 #include "src/core/surface/call.h"
 #include "src/core/surface/client.h"
+#include "src/core/surface/init.h"
 #include <grpc/support/alloc.h>
 #include <grpc/support/log.h>
 
@@ -63,6 +64,7 @@ grpc_channel *grpc_channel_create_from_filters(
   size_t size =
       sizeof(grpc_channel) + grpc_channel_stack_size(filters, num_filters);
   grpc_channel *channel = gpr_malloc(size);
+  GPR_ASSERT(grpc_is_initialized() && "call grpc_init()");
   channel->is_client = is_client;
   /* decremented by grpc_channel_destroy, and grpc_client_channel_closed if is_client */
   gpr_ref_init(&channel->refs, 1 + is_client);
diff --git a/src/core/surface/init.c b/src/core/surface/init.c
index 4db66fb66eb05b485a428f35113df0a775664d95..1f5c8d1b5d984a333d0edca6bc8c87644ba6e9e2 100644
--- a/src/core/surface/init.c
+++ b/src/core/surface/init.c
@@ -73,3 +73,13 @@ void grpc_shutdown(void) {
   }
   gpr_mu_unlock(&g_init_mu);
 }
+
+int grpc_is_initialized(void) {
+  int r;
+  gpr_once_init(&g_init, do_init);
+  gpr_mu_lock(&g_init_mu);
+  r = g_initializations > 0;
+  gpr_mu_unlock(&g_init_mu);
+  return r;
+}
+
diff --git a/src/core/surface/init.h b/src/core/surface/init.h
index ab40bedf8754918fd965d52e5dfa4c2bcc1872c7..416874020d7c79b090b2e66487d443b15febd93a 100644
--- a/src/core/surface/init.h
+++ b/src/core/surface/init.h
@@ -35,5 +35,6 @@
 #define GRPC_INTERNAL_CORE_SURFACE_INIT_H
 
 void grpc_security_pre_init(void);
+int grpc_is_initialized(void);
 
 #endif  /* GRPC_INTERNAL_CORE_SURFACE_INIT_H */
diff --git a/src/core/surface/server.c b/src/core/surface/server.c
index c99a1b4cc9c9c72c3c144607890f6a143b69ba39..424734c54ce5615fcbe700bb22bd834803004d82 100644
--- a/src/core/surface/server.c
+++ b/src/core/surface/server.c
@@ -44,6 +44,7 @@
 #include "src/core/surface/call.h"
 #include "src/core/surface/channel.h"
 #include "src/core/surface/completion_queue.h"
+#include "src/core/surface/init.h"
 #include "src/core/transport/metadata.h"
 #include <grpc/support/alloc.h>
 #include <grpc/support/log.h>
@@ -612,6 +613,9 @@ grpc_server *grpc_server_create_from_filters(grpc_completion_queue *cq,
   int census_enabled = grpc_channel_args_is_census_enabled(args);
 
   grpc_server *server = gpr_malloc(sizeof(grpc_server));
+
+  GPR_ASSERT(grpc_is_initialized() && "call grpc_init()");
+
   memset(server, 0, sizeof(grpc_server));
   if (cq) addcq(server, cq);