This is an automated email from the ASF dual-hosted git repository.
xiaoxiang pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/nuttx.git
The following commit(s) were added to refs/heads/master by this push:
new 5fd03186af tools/minidumpserver: fix 32bit crash log parsing
5fd03186af is described below
commit 5fd03186af1d65f1b16f01125597ac475e80b095
Author: Xu Xingliang <[email protected]>
AuthorDate: Fri Jun 7 18:53:21 2024 +0800
tools/minidumpserver: fix 32bit crash log parsing
Need to distinguish between 32bit and 64bit registers, format the gdb reply
message using struct.pack with correct format.
'<I' is used for 32bit registers, '<Q' for 64bit
Do not raise exeption for unrecognized registers in log, since they are
not used.
Signed-off-by: Xu Xingliang <[email protected]>
---
tools/minidumpserver.py | 14 +++++++-------
1 file changed, 7 insertions(+), 7 deletions(-)
diff --git a/tools/minidumpserver.py b/tools/minidumpserver.py
index 469e8a36c8..04e7636222 100755
--- a/tools/minidumpserver.py
+++ b/tools/minidumpserver.py
@@ -335,6 +335,7 @@ class DumpLogFile:
self.registers = []
self.__memories = list()
self.reg_table = dict()
+ self.reg_len = 32
def _init_register(self):
# registers list should be able to hold the max index
@@ -353,8 +354,7 @@ class DumpLogFile:
if reg_name in self.reg_table:
reg_index = self.reg_table[reg_name]
self.registers[reg_index] = int(reg_val, 16)
- else:
- raise Exception("Unknown register name: ", reg_name)
+ self.reg_len = max(self.reg_len, len(reg_val) * 4)
return True
@@ -386,8 +386,9 @@ class DumpLogFile:
data = b""
start = addr_start
+ reg_fmt = "<I" if self.reg_len <= 32 else "<Q"
for val in match_res.groupdict()["VALS"].split():
- data = data + struct.pack("<Q", int(val, 16))
+ data = data + struct.pack(reg_fmt, int(val, 16))
return start, data
@@ -437,6 +438,7 @@ class GDBStub:
self.gdb_signal = GDB_SIGNAL_DEFAULT
self.mem_regions = self.elffile.get_memories() +
self.logfile.get_memories()
self.reg_digits = elffile.xlen() // 4
+ self.reg_fmt = "<I" if elffile.xlen() <= 32 else "<Q"
self.mem_regions.sort(key=lambda x: x["start"])
@@ -508,12 +510,11 @@ class GDBStub:
self.put_gdb_packet(pkt)
def handle_register_group_read_packet(self):
- reg_fmt = "<Q"
pkt = b""
for reg in self.logfile.registers:
if reg != b"x":
- bval = struct.pack(reg_fmt, reg)
+ bval = struct.pack(self.reg_fmt, reg)
pkt += binascii.hexlify(bval)
else:
# Register not in coredump -> unknown value
@@ -523,12 +524,11 @@ class GDBStub:
self.put_gdb_packet(pkt)
def handle_register_single_read_packet(self, pkt):
- reg_fmt = "<Q"
logger.debug(f"pkt: {pkt}")
reg = int("0x" + pkt[1:].decode("utf8"), 16)
if reg < len(self.logfile.registers) and self.logfile.registers[reg]
!= b"x":
- bval = struct.pack(reg_fmt, self.logfile.registers[reg])
+ bval = struct.pack(self.reg_fmt, self.logfile.registers[reg])
self.put_gdb_packet(binascii.hexlify(bval))
else:
self.put_gdb_packet(b"x" * self.reg_digits)