[vm] Provide more detailed errors when message deserialization cannot find a program element serialized by name.

TEST=local
Bug: https://github.com/flutter/flutter/issues/109248
Change-Id: Ifda7c08cf88c37a9895839858a18badf994bf72c
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/255220
Reviewed-by: Slava Egorov <vegorov@google.com>
Commit-Queue: Ryan Macnak <rmacnak@google.com>
diff --git a/runtime/vm/message_snapshot.cc b/runtime/vm/message_snapshot.cc
index e9a92a7..2c2621a 100644
--- a/runtime/vm/message_snapshot.cc
+++ b/runtime/vm/message_snapshot.cc
@@ -562,8 +562,9 @@
 
   void ReadNodes(MessageDeserializer* d) {
     auto* class_table = d->isolate_group()->class_table();
-    String& str = String::Handle(d->zone());
+    String& uri = String::Handle(d->zone());
     Library& lib = Library::Handle(d->zone());
+    String& name = String::Handle(d->zone());
     Class& cls = Class::Handle(d->zone());
     intptr_t count = d->ReadUnsigned();
     for (intptr_t i = 0; i < count; i++) {
@@ -571,16 +572,20 @@
       if (cid != 0) {
         cls = class_table->At(cid);
       } else {
-        str = String::New(d->ReadAscii());  // Library URI.
-        lib = Library::LookupLibrary(d->thread(), str);
-        RELEASE_ASSERT(!lib.IsNull());
-        str = String::New(d->ReadAscii());  // Class name.
-        if (str.Equals(Symbols::TopLevel())) {
+        uri = String::New(d->ReadAscii());   // Library URI.
+        name = String::New(d->ReadAscii());  // Class name.
+        lib = Library::LookupLibrary(d->thread(), uri);
+        if (UNLIKELY(lib.IsNull())) {
+          FATAL("Not found: %s %s\n", uri.ToCString(), name.ToCString());
+        }
+        if (name.Equals(Symbols::TopLevel())) {
           cls = lib.toplevel_class();
         } else {
-          cls = lib.LookupClass(str);
+          cls = lib.LookupClass(name);
         }
-        RELEASE_ASSERT(!cls.IsNull());
+        if (UNLIKELY(cls.IsNull())) {
+          FATAL("Not found: %s %s\n", uri.ToCString(), name.ToCString());
+        }
         cls.EnsureIsFinalized(d->thread());
       }
       d->AssignRef(cls.ptr());
@@ -762,25 +767,36 @@
 
   void ReadNodes(MessageDeserializer* d) {
     const intptr_t count = d->ReadUnsigned();
-    String& str = String::Handle(d->zone());
+    String& uri = String::Handle(d->zone());
     Library& lib = Library::Handle(d->zone());
+    String& cname = String::Handle(d->zone());
     Class& cls = Class::Handle(d->zone());
+    String& fname = String::Handle(d->zone());
     Function& func = Function::Handle(d->zone());
     for (intptr_t i = 0; i < count; i++) {
-      str = String::New(d->ReadAscii());  // Library URI.
-      lib = Library::LookupLibrary(d->thread(), str);
-      RELEASE_ASSERT(!lib.IsNull());
-      str = String::New(d->ReadAscii());  // Class name.
-      if (str.Equals(Symbols::TopLevel())) {
+      uri = String::New(d->ReadAscii());    // Library URI.
+      cname = String::New(d->ReadAscii());  // Class name.
+      fname = String::New(d->ReadAscii());  // Function name.
+      lib = Library::LookupLibrary(d->thread(), uri);
+      if (UNLIKELY(lib.IsNull())) {
+        FATAL("Not found: %s %s %s", uri.ToCString(), cname.ToCString(),
+              fname.ToCString());
+      }
+      if (cname.Equals(Symbols::TopLevel())) {
         cls = lib.toplevel_class();
       } else {
-        cls = lib.LookupClass(str);
+        cls = lib.LookupClass(cname);
       }
-      RELEASE_ASSERT(!cls.IsNull());
+      if (UNLIKELY(cls.IsNull())) {
+        FATAL("Not found: %s %s %s", uri.ToCString(), cname.ToCString(),
+              fname.ToCString());
+      }
       cls.EnsureIsFinalized(d->thread());
-      str = String::New(d->ReadAscii());  // Function name.
-      func = cls.LookupStaticFunction(str);
-      RELEASE_ASSERT(!func.IsNull());
+      func = cls.LookupStaticFunction(fname);
+      if (UNLIKELY(func.IsNull())) {
+        FATAL("Not found: %s %s %s", uri.ToCString(), cname.ToCString(),
+              fname.ToCString());
+      }
       d->AssignRef(func.ptr());
     }
   }