diff --git a/gdb-port/commands.py b/gdb-port/commands.py index 453ccbe3077f31987e82d9ef7d31b96d6c676ec9..ec1e5575539405d4d23360bed6d7b9fbee8cb767 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 0872e51319b25a19e3fcced41973aa02db4e6773..dd7b914c83379568e20384af6a30fff34b8a5758 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 9f7b2c13d18232910163720a0d36258b72356099..d37e8babc71bad53e70056fac9104e7f8571e2d5 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()