[Lldb-commits] [lldb] f043e66 - [lldb/crashlog] Make register output match lldb ordering in legacy mode

Med Ismail Bennani via lldb-commits lldb-commits at lists.llvm.org
Sat Aug 12 00:00:16 PDT 2023


Author: Med Ismail Bennani
Date: 2023-08-11T23:59:41-07:00
New Revision: f043e66e98836e3acf3c978fd0dc429f74b228da

URL: https://github.com/llvm/llvm-project/commit/f043e66e98836e3acf3c978fd0dc429f74b228da
DIFF: https://github.com/llvm/llvm-project/commit/f043e66e98836e3acf3c978fd0dc429f74b228da.diff

LOG: [lldb/crashlog] Make register output match lldb ordering in legacy mode

This patch changes the way we dump the registers from the legacy
crashlog command to make sure that the ordering matches the one from lldb.

rdar://109172073

Differential Revision: https://reviews.llvm.org/D156919

Signed-off-by: Med Ismail Bennani <ismail at bennani.ma>

Added: 
    

Modified: 
    lldb/examples/python/crashlog.py

Removed: 
    


################################################################################
diff  --git a/lldb/examples/python/crashlog.py b/lldb/examples/python/crashlog.py
index 709dda714eb346..ccf3fb1aa9146a 100755
--- a/lldb/examples/python/crashlog.py
+++ b/lldb/examples/python/crashlog.py
@@ -71,6 +71,7 @@
         sys.exit(1)
 
 from lldb.utils import symbolication
+from lldb.plugins.scripted_process import INTEL64_GPR, ARM64_GPR
 
 
 def read_plist(s):
@@ -84,7 +85,7 @@ class CrashLog(symbolication.Symbolicator):
     class Thread:
         """Class that represents a thread in a darwin crash log"""
 
-        def __init__(self, index, app_specific_backtrace):
+        def __init__(self, index, app_specific_backtrace, arch):
             self.index = index
             self.id = index
             self.images = list()
@@ -96,8 +97,56 @@ def __init__(self, index, app_specific_backtrace):
             self.queue = None
             self.crashed = False
             self.app_specific_backtrace = app_specific_backtrace
+            self.arch = arch
+
+        def dump_registers(self, prefix=""):
+            registers_info = None
+            sorted_registers = {}
+
+            def sort_dict(d):
+                sorted_keys = list(d.keys())
+                sorted_keys.sort()
+                return {k: d[k] for k in sorted_keys}
+
+            if self.arch:
+                if "x86_64" == self.arch:
+                    registers_info = INTEL64_GPR
+                elif "arm64" in self.arch:
+                    registers_info = ARM64_GPR
+                else:
+                    print("unknown target architecture: %s" % self.arch)
+                    return
 
-        def dump(self, prefix):
+                # Add registers available in the register information dictionary.
+                for reg_info in registers_info:
+                    reg_name = None
+                    if reg_info["name"] in self.registers:
+                        reg_name = reg_info["name"]
+                    elif (
+                        "generic" in reg_info and reg_info["generic"] in self.registers
+                    ):
+                        reg_name = reg_info["generic"]
+                    else:
+                        # Skip register that are present in the register information dictionary but not present in the report.
+                        continue
+
+                    reg_val = self.registers[reg_name]
+                    sorted_registers[reg_name] = reg_val
+
+                unknown_parsed_registers = {}
+                for reg_name in self.registers:
+                    if reg_name not in sorted_registers:
+                        unknown_parsed_registers[reg_name] = self.registers[reg_name]
+
+                sorted_registers.update(sort_dict(unknown_parsed_registers))
+
+            else:
+                sorted_registers = sort_dict(self.registers)
+
+            for reg_name, reg_val in sorted_registers.items():
+                print("%s    %-8s = %#16.16x" % (prefix, reg_name, reg_val))
+
+        def dump(self, prefix=""):
             if self.app_specific_backtrace:
                 print(
                     "%Application Specific Backtrace[%u] %s"
@@ -111,8 +160,7 @@ def dump(self, prefix):
                     frame.dump(prefix + "    ")
             if self.registers:
                 print("%s  Registers:" % (prefix))
-                for reg in self.registers.keys():
-                    print("%s    %-8s = %#16.16x" % (prefix, reg, self.registers[reg]))
+                self.dump_registers(prefix)
 
         def dump_symbolicated(self, crash_log, options):
             this_thread_crashed = self.app_specific_backtrace
@@ -194,8 +242,7 @@ def dump_symbolicated(self, crash_log, options):
                     print(frame)
             if self.registers:
                 print()
-                for reg in self.registers.keys():
-                    print("    %-8s = %#16.16x" % (reg, self.registers[reg]))
+                self.dump_registers()
             elif self.crashed:
                 print()
                 print("No thread state (register information) available")
@@ -655,7 +702,7 @@ def parse_frames(self, thread, json_frames):
     def parse_threads(self, json_threads):
         idx = 0
         for json_thread in json_threads:
-            thread = self.crashlog.Thread(idx, False)
+            thread = self.crashlog.Thread(idx, False, self.crashlog.process_arch)
             if "name" in json_thread:
                 thread.name = json_thread["name"]
                 thread.reason = json_thread["name"]
@@ -749,7 +796,7 @@ def parse_asi_backtrace(self, thread, bt):
 
     def parse_app_specific_backtraces(self, json_app_specific_bts):
         for idx, backtrace in enumerate(json_app_specific_bts):
-            thread = self.crashlog.Thread(idx, True)
+            thread = self.crashlog.Thread(idx, True, self.crashlog.process_arch)
             thread.queue = "Application Specific Backtrace"
             if self.parse_asi_backtrace(thread, backtrace):
                 self.crashlog.threads.append(thread)
@@ -1008,7 +1055,9 @@ def parse_normal(self, line):
                 self.app_specific_backtrace = False
                 self.parse_mode = CrashLogParseMode.THREAD
                 thread_idx = int(thread_match.group(1))
-                self.thread = self.crashlog.Thread(thread_idx, False)
+                self.thread = self.crashlog.Thread(
+                    thread_idx, False, self.crashlog.process_arch
+                )
                 return
             return
         elif line.startswith("Binary Images:"):
@@ -1020,12 +1069,14 @@ def parse_normal(self, line):
                 self.parse_mode = CrashLogParseMode.THREAD
                 self.app_specific_backtrace = True
                 idx = int(app_backtrace_match.group(1))
-                self.thread = self.crashlog.Thread(idx, True)
+                self.thread = self.crashlog.Thread(
+                    idx, True, self.crashlog.process_arch
+                )
         elif line.startswith("Last Exception Backtrace:"):  # iOS
             self.parse_mode = CrashLogParseMode.THREAD
             self.app_specific_backtrace = True
             idx = 1
-            self.thread = self.crashlog.Thread(idx, True)
+            self.thread = self.crashlog.Thread(idx, True, self.crashlog.process_arch)
         self.crashlog.info_lines.append(line.strip())
 
     def parse_thread(self, line):


        


More information about the lldb-commits mailing list