[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