From 5f734dfdf871602df51af61a0025df95b242ae50 Mon Sep 17 00:00:00 2001
From: pompolic <pompolic@special-circumstanc.es>
Date: Thu, 28 Apr 2022 20:48:11 +0200
Subject: [PATCH] Add memory dump command to GDB interface

---
 gdb-port/commands.py                   |  9 +++++++++
 gdb-port/tests/unit/top-level-parse.py | 14 ++++++++++++++
 gdb-port/top-level-parse.py            |  3 +++
 3 files changed, 26 insertions(+)

diff --git a/gdb-port/commands.py b/gdb-port/commands.py
index 453ccbe..ec1e557 100644
--- a/gdb-port/commands.py
+++ b/gdb-port/commands.py
@@ -141,3 +141,12 @@ class HammerParserCurrentEnv(gdb.Command):
 		print(type(p_env).__name__ + " - " + str(p_env)) # TODO: consistency with GUI
 
 HammerParserCurrentEnv()
+
+class HammerParserDumpMemoryStats(gdb.Command):
+	def __init__(self):
+		super(HammerParserDumpMemoryStats, self).__init__("hammer-parser-dump-memory-stats", gdb.COMMAND_OBSCURE)
+		print(":: hammer-parser-dump-memory-stats")
+
+	def invoke(self, arg, from_tty):
+		stats = top_level_parse.dump_memory_stats()
+		print(stats)
diff --git a/gdb-port/tests/unit/top-level-parse.py b/gdb-port/tests/unit/top-level-parse.py
index 0872e51..dd7b914 100644
--- a/gdb-port/tests/unit/top-level-parse.py
+++ b/gdb-port/tests/unit/top-level-parse.py
@@ -163,3 +163,17 @@ class TopLevelParseStateManagement(unittest.TestCase):
 		self.parser1.add_mem_use(128, 50)
 		parser2.add_mem_use(16, 60)
 		self.assertEqual(self.top_level_parse.get_avg_mem_use_per_arena(), {16: 55, 128: 50})
+
+	def test_dump_memory_stats(self):
+		self.top_level_parse.parser_stacks.append(self.ps1)
+		self.top_level_parse.parser_objs[32] = self.parser1
+		self.ps1.push(self.parser1)
+		parser2 = Parser("bar", 48)
+		self.top_level_parse.parser_objs[48] = parser2
+		self.ps1.push(parser2)
+		self.parser1.add_mem_use(16, 50)
+		self.parser1.add_mem_use(128, 50)
+		parser2.add_mem_use(16, 60)
+
+		stats = self.top_level_parse.dump_memory_stats()
+		self.assertEqual(stats, [('foo', '0x20', {16: 50, 128: 50}), ('bar', '0x30', {16: 60})])
diff --git a/gdb-port/top-level-parse.py b/gdb-port/top-level-parse.py
index 9f7b2c1..d37e8ba 100644
--- a/gdb-port/top-level-parse.py
+++ b/gdb-port/top-level-parse.py
@@ -167,6 +167,9 @@ class TopLevelParse:
 
 		return averages
 
+	def dump_memory_stats(self):
+		return [(p.name, hex(p.address), p.bytes_used) for p in self.parser_objs.values()]
+
 	# TODO: get_avg_mem_use_all_arenas, get_total_mem_use
 
 top_level_parse = TopLevelParse()
-- 
GitLab