[crashlog] Change heuristic to stripping the meta data from crashlogs
authorJonas Devlieghere <jonas@devlieghere.com>
Mon, 14 Feb 2022 20:12:54 +0000 (12:12 -0800)
committerJonas Devlieghere <jonas@devlieghere.com>
Mon, 14 Feb 2022 20:18:12 +0000 (12:18 -0800)
Instead trying to pro-actively determine if the first line in a
crashlog contains meta data, change the heuristic to do the following:

 1. To trying to parse the whole file. If that fails, then:
 2. Strip the first line and try parsing the remainder of the file. If
    that fails, then:
 3. Fall back to the textual crashlog parser.

rdar://88580543

Differential revision: https://reviews.llvm.org/D119755

lldb/examples/python/crashlog.py

index ec9f2d4..63be066 100755 (executable)
@@ -397,7 +397,7 @@ class CrashLogFormatException(Exception):
 
 
 class CrashLogParseException(Exception):
-   pass
+    pass
 
 
 class CrashLogParser:
@@ -414,22 +414,22 @@ class JSONCrashLogParser:
         self.verbose = verbose
         self.crashlog = CrashLog(debugger, self.path, self.verbose)
 
+    def parse_json(self, buffer):
+        try:
+            return json.loads(buffer)
+        except:
+            # The first line can contain meta data. Try stripping it and try
+            # again.
+            head, _, tail = buffer.partition('\n')
+            return json.loads(tail)
+
     def parse(self):
         with open(self.path, 'r') as f:
             buffer = f.read()
 
-        # Skip the first line if it contains meta data.
-        head, _, tail = buffer.partition('\n')
         try:
-            metadata = json.loads(head)
-            if 'app_name' in metadata and 'app_version' in metadata:
-                buffer = tail
-        except ValueError:
-            pass
-
-        try:
-            self.data = json.loads(buffer)
-        except ValueError:
+            self.data = self.parse_json(buffer)
+        except:
             raise CrashLogFormatException()
 
         try: