From 4d05e69c1dac879ca5630179183b31762ccfb345 Mon Sep 17 00:00:00 2001 From: anjiahao Date: Wed, 14 Aug 2024 20:29:22 +0800 Subject: [PATCH] minidumpserver:thread awarenes bug fix 1. need to continue if tcbptr is NULL 2. need use g_last_regs to show running regs 3. get a bad range Signed-off-by: anjiahao --- tools/minidumpserver.py | 71 +++++++++++++++++++++++++++++++++-------- 1 file changed, 57 insertions(+), 14 deletions(-) diff --git a/tools/minidumpserver.py b/tools/minidumpserver.py index 77b3b40fc21..90d348635d2 100755 --- a/tools/minidumpserver.py +++ b/tools/minidumpserver.py @@ -314,7 +314,13 @@ class DumpELFFile: if symbol["st_info"]["type"] != "STT_OBJECT": continue - if symbol.name in ("g_tcbinfo", "g_pidhash", "g_npidhash"): + if symbol.name in ( + "g_tcbinfo", + "g_pidhash", + "g_npidhash", + "g_last_regs", + "g_running_tasks", + ): self.symbol[symbol.name] = symbol logger.debug( f"name:{symbol.name} size:{symbol['st_size']} value:{hex(symbol['st_value'])}" @@ -493,8 +499,6 @@ class CoreDumpFile: segment["p_paddr"], segment["p_paddr"] + len(data), data ) ) - else: - logger.debug("This CoreDump does not have program headers.") def get_memories(self): return self.__memories @@ -528,8 +532,19 @@ class GDBStub: self.current_thread = 0 try: self.parse_thread() + logger.debug(f"Have {len(self.threadinfo)} threads to debug.") + if len(self.threadinfo) == 0: + logger.critical( + "Check if your coredump or raw file matches the ELF file" + ) + sys.exit(1) + except TypeError: - pass + if not self.registers: + logger.critical( + "Logfile, coredump, or rawfile do not contain register. Please check if the files are correct." + ) + sys.exit(1) def get_gdb_packet(self): socket = self.socket @@ -619,7 +634,10 @@ class GDBStub: else: for thread in self.threadinfo: if thread["tcb"]["pid"] == self.current_thread: - put_register_packet(thread["gdb_regs"]) + if thread["tcb"]["tcbptr"] in self.running_tasks.keys(): + put_register_packet(self.running_tasks[thread["tcb"]["tcbptr"]]) + else: + put_register_packet(thread["gdb_regs"]) break def handle_register_single_read_packet(self, pkt): @@ -639,7 +657,12 @@ class GDBStub: else: for thread in self.threadinfo: if thread["tcb"]["pid"] == self.current_thread: - put_one_register_packet(thread["gdb_regs"]) + if thread["tcb"]["tcbptr"] in self.running_tasks.keys(): + put_one_register_packet( + self.running_tasks[thread["tcb"]["tcbptr"]] + ) + else: + put_one_register_packet(thread["gdb_regs"]) break def handle_register_group_write_packet(self): @@ -665,7 +688,7 @@ class GDBStub: def get_mem_region(self, addr): for mem in self.mem_regions: - if mem["start"] <= addr <= mem["end"]: + if mem["start"] <= addr < mem["end"]: return mem return None @@ -766,12 +789,15 @@ class GDBStub: "