[Lldb-commits] [PATCH] D131719: [lldb/crashlog] Adapt raw text crashlog exception to json format

Med Ismail Bennani via Phabricator via lldb-commits lldb-commits at lists.llvm.org
Thu Aug 11 13:47:54 PDT 2022


mib created this revision.
mib added reviewers: JDevlieghere, kastiglione.
mib added a project: LLDB.
Herald added a project: All.
mib requested review of this revision.
Herald added a subscriber: lldb-commits.

This patch parses CrashLog exception data from the raw
text format and adapts it to the new JSON format.

This is necessary for feature parity between the 2 formats.

Signed-off-by: Med Ismail Bennani <medismail.bennani at gmail.com>


Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D131719

Files:
  lldb/examples/python/crashlog.py


Index: lldb/examples/python/crashlog.py
===================================================================
--- lldb/examples/python/crashlog.py
+++ lldb/examples/python/crashlog.py
@@ -340,6 +340,7 @@
         self.backtraces = list()  # For application specific backtraces
         self.idents = list()  # A list of the required identifiers for doing all stack backtraces
         self.errors = list()
+        self.exception = None
         self.crashed_thread_idx = -1
         self.version = -1
         self.target = None
@@ -483,6 +484,7 @@
         self.crashlog.process_identifier = json_data['procName']
 
     def parse_crash_reason(self, json_exception):
+        self.crashlog.exception = json_exception
         exception_type = json_exception['type']
         exception_signal = " "
         if 'signal' in json_exception:
@@ -601,7 +603,6 @@
     SYSTEM = 4
     INSTRS = 5
 
-
 class TextCrashLogParser(CrashLogParser):
     parent_process_regex = re.compile(r'^Parent Process:\s*(.*)\[(\d+)\]')
     thread_state_regex = re.compile(r'^Thread \d+ crashed with')
@@ -624,6 +625,9 @@
                                   r'(?:<([-0-9a-fA-F]+)>\s+)?' # img_uuid
                                   r'(/.*)'                     # img_path
                                  )
+    exception_type_regex = re.compile(r'^Exception Type:\s+(EXC_.*) \s*\((.*)\)')
+    exception_codes_regex = re.compile(r'^Exception Codes:\s+(0x[\d]+),\s*(0x[\d]+)')
+    exception_extra_regex = re.compile(r'^Exception\s+.*:\s+(.*)')
 
     def __init__(self, debugger, path, verbose):
         super().__init__(debugger, path, verbose)
@@ -670,6 +674,41 @@
 
         return self.crashlog
 
+    def parse_exception(self, line):
+        if not line.startswith('Exception'):
+            return
+        if line.startswith('Exception Type:'):
+            self.crashlog.thread_exception = line[15:].strip()
+            exception_type_match = self.exception_type_regex.search(line)
+            if exception_type_match:
+                (exc_type, exc_signal) = exception_type_match.groups()
+                self.crashlog.exception = {}
+                self.crashlog.exception['type'] = exc_type
+                self.crashlog.exception['signal'] = exc_signal
+            return
+        elif line.startswith('Exception Subtype:'): # iOS
+            self.crashlog.thread_exception_subtype = line[18:].strip()
+            if self.crashlog.exception['type']:
+                self.crashlog.exception['subtype']: self.crashlog.thread_exception_subtype
+            return
+        elif line.startswith('Exception Codes:'):
+            self.crashlog.thread_exception_data = line[16:].strip()
+            exception_codes_match = self.exception_codes_regex.search(line)
+            if exception_codes_match:
+                if not self.crashlog.exception['type']:
+                    return
+                self.crashlog.exception['codes'] = self.crashlog.thread_exception_data
+                (code, subcode) = exception_codes_match.groups()
+                self.crashlog.exception['rawcodes'] = [int(code, base=16),
+                                                       int(subcode, base=16)]
+            return
+        else:
+            exception_extra_match = self.exception_extra_regex.search(line)
+            if exception_extra_match:
+                if not self.crashlog.exception['type']:
+                    return
+                self.crashlog.exception['message'] = exception_extra_match.group(0)
+            return
 
     def parse_normal(self, line):
         if line.startswith('Process:'):
@@ -693,14 +732,8 @@
                 line)
             self.crashlog.parent_process_name = parent_process_match.group(1)
             self.crashlog.parent_process_id = parent_process_match.group(2)
-        elif line.startswith('Exception Type:'):
-            self.crashlog.thread_exception = line[15:].strip()
-            return
-        elif line.startswith('Exception Codes:'):
-            self.crashlog.thread_exception_data = line[16:].strip()
-            return
-        elif line.startswith('Exception Subtype:'): # iOS
-            self.crashlog.thread_exception_data = line[18:].strip()
+        elif line.startswith('Exception'):
+            self.parse_exception(line)
             return
         elif line.startswith('Crashed Thread:'):
             self.crashlog.crashed_thread_idx = int(line[15:].strip().split()[0])


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D131719.451971.patch
Type: text/x-patch
Size: 4451 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/lldb-commits/attachments/20220811/6eaf1fb1/attachment-0001.bin>


More information about the lldb-commits mailing list