Correctly parse length (#861)

diff --git a/dwds/CHANGELOG.md b/dwds/CHANGELOG.md
index a112a1a..eb2c4db 100644
--- a/dwds/CHANGELOG.md
+++ b/dwds/CHANGELOG.md
@@ -1,6 +1,7 @@
 ## 0.8.5
 
 - Always bind to `localhost` for the local debug workflow.
+- Fix an issue where breakpoints could cause DevTools to hang.
 
 ## 0.8.4
 
diff --git a/dwds/lib/src/debugging/metadata.dart b/dwds/lib/src/debugging/metadata.dart
index 54256f0..29fd8ab 100644
--- a/dwds/lib/src/debugging/metadata.dart
+++ b/dwds/lib/src/debugging/metadata.dart
@@ -33,7 +33,7 @@
   factory ClassMetaData(
       {Object jsName, Object libraryId, Object dartName, Object length}) {
     return ClassMetaData._(jsName as String, libraryId as String,
-        dartName as String, length as int);
+        dartName as String, int.tryParse('$length'));
   }
 
   ClassMetaData._(this.jsName, this.libraryId, this.dartName, this.length);
diff --git a/dwds/test/debugging/metadata_test.dart b/dwds/test/debugging/metadata_test.dart
new file mode 100644
index 0000000..6af6b98
--- /dev/null
+++ b/dwds/test/debugging/metadata_test.dart
@@ -0,0 +1,22 @@
+// Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:dwds/src/debugging/metadata.dart';
+import 'package:test/test.dart';
+
+void main() {
+  test('Gracefully handles invalid length objects', () async {
+    var metadata = ClassMetaData(length: null);
+    expect(metadata.length, isNull);
+
+    metadata = ClassMetaData(length: {});
+    expect(metadata.length, isNull);
+
+    metadata = ClassMetaData(length: '{}');
+    expect(metadata.length, isNull);
+
+    metadata = ClassMetaData(length: 0);
+    expect(metadata.length, equals(0));
+  });
+}