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
commit 3f3bbf76f94bc858784140127f6ce3b52f70bf61 Author: buxiasen <buxia...@xiaomi.com> AuthorDate: Wed Aug 28 19:56:36 2024 +0800 tool/gdb/memdump: fix orphan, fix -p support Signed-off-by: buxiasen <buxia...@xiaomi.com> --- tools/gdb/memdump.py | 75 ++++++++++++++++++++++++++++------------------------ 1 file changed, 40 insertions(+), 35 deletions(-) diff --git a/tools/gdb/memdump.py b/tools/gdb/memdump.py index ff09c36b15..cee921ecca 100644 --- a/tools/gdb/memdump.py +++ b/tools/gdb/memdump.py @@ -295,14 +295,14 @@ class HeapNode: record_size = gdb_node["size"] - if hasattr(gdb_node, "seqno"): + try: seqno = gdb_node["seqno"] - else: + except gdb.error: seqno = 0 - if hasattr(gdb_node, "pid"): + try: node_pid = gdb_node["pid"] - else: + except gdb.error: node_pid = 0 self.size = mm_nodesize(record_size) @@ -424,6 +424,34 @@ class Memdump(gdb.Command): backtrace_dict=self.backtrace_dict, ) + def memdump_tail(self, detail, simple): + if not detail: + output = [v for v in self.backtrace_dict.values()] + output.sort(key=get_count, reverse=True) + for node in output: + if node["node"].type == mm_allocnode_type.pointer(): + mm_dumpnode( + node["node"], + node["count"], + self.align, + simple, + detail, + self.check_alive(node["pid"]), + ) + else: + mempool_dumpbuf( + node["node"], + node["size"], + node["count"], + self.align, + simple, + detail, + self.check_alive(node["pid"]), + ) + + gdb.write("%12s%12s\n" % ("Total Blks", "Total Size")) + gdb.write("%12d%12d\n" % (self.aordblks, self.uordblks)) + def memdump(self, pid, seqmin, seqmax, address, simple, detail, biggest_top=30): """Dump the heap memory""" @@ -472,6 +500,7 @@ class Memdump(gdb.Command): title_dict = { PID_MM_ALLOC: "Dump all used memory node info, use '\x1b[33;1m*\x1b[m' mark pid does not exist:\n", + PID_MM_MEMPOOL: "Dump mempool:\n", PID_MM_FREE: "Dump all free memory node info:\n", PID_MM_BIGGEST: f"Dump biggest allocated top {biggest_top}\n", PID_MM_ORPHAN: "Dump allocated orphan nodes\n", @@ -505,45 +534,21 @@ class Memdump(gdb.Command): self.memnode_dump(node) elif pid == PID_MM_ORPHAN: for node in alloc_node: - if node.is_orphan: + if node.is_orphan(): + self.memnode_dump(node) + elif pid == PID_MM_MEMPOOL or pid >= 0: + for node in alloc_node: + if node.pid == pid: self.memnode_dump(node) - if not detail: - output = [] - for node in self.backtrace_dict.values(): - output.append(node) - - output.sort(key=get_count, reverse=True) - for node in output: - if node["node"].type == mm_allocnode_type.pointer(): - mm_dumpnode( - node["node"], - node["count"], - self.align, - simple, - detail, - self.check_alive(node["pid"]), - ) - else: - mempool_dumpbuf( - node["node"], - node["size"], - node["count"], - self.align, - simple, - detail, - self.check_alive(node["pid"]), - ) - - gdb.write("%12s%12s\n" % ("Total Blks", "Total Size")) - gdb.write("%12d%12d\n" % (self.aordblks, self.uordblks)) + self.memdump_tail(detail, simple) def complete(self, text, word): return gdb.COMPLETE_SYMBOL def parse_arguments(self, argv): parser = argparse.ArgumentParser(description="memdump command") - parser.add_argument("-p", "--pid", type=str, help="Thread PID") + parser.add_argument("-p", "--pid", type=str, help="Thread PID, -1 for mempool") parser.add_argument("-a", "--addr", type=str, help="Query memory address") parser.add_argument("-i", "--min", type=str, help="Minimum value") parser.add_argument("-x", "--max", type=str, help="Maximum value")