diff --git a/gdb-port/commands.py b/gdb-port/commands.py index f021c21352fedc82f02b7e7c4bcd95658cecc3ca..c792d5083f2fd08fd9d3829b267704593fc209fc 100644 --- a/gdb-port/commands.py +++ b/gdb-port/commands.py @@ -176,18 +176,25 @@ class HammerArenaDumpStats(gdb.Command): def invoke(self, arg, from_tty): args = gdb.string_to_argv(arg) - if len(args) != 1: - print("Usage: hammer-arena-dump-stats <arena address in hex>") - arena = args[0] - try: - arena_int = int(arena,16) - except ValueError as ve: + if len(args) > 1: print("Usage: hammer-arena-dump-stats <arena address in hex>") return + elif len(args) == 0: + arena_gdbvalue = top_level_parse.peek_parserstack().arena + arena = hex(arena_gdbvalue) # For printing + else: + arena = args[0] + + try: + arena_int = int(arena,16) + except ValueError as ve: + print("Usage: hammer-arena-dump-stats <arena address in hex>") + return + HArena_p_t = gdb.lookup_type("HArena").pointer() + arena_gdbvalue = gdb.Value(arena_int).cast(HArena_p_t) # TODO: how do we validate it's really a HArena at the given address? + detailed = top_level_parse.extended_arena_stats_available() print("Arena statistics for", arena, "( DETAILED_ARENA_STATISTICS:", detailed, "):") - HArena_p_t = gdb.lookup_type("HArena").pointer() - arena_gdbvalue = gdb.Value(arena_int).cast(HArena_p_t) # TODO: how do we validate it's really a HArena at the given address? for key in gdb.lookup_type("HArena").keys(): print(key, ":", arena_gdbvalue[key]) diff --git a/gdb-port/hammer-breakpoints.py b/gdb-port/hammer-breakpoints.py index b743701e8c12be90bd5dd2e92b2aac382f7f9327..b122009e6eb40486c9b20d2f762c12f6dd4d42b6 100644 --- a/gdb-port/hammer-breakpoints.py +++ b/gdb-port/hammer-breakpoints.py @@ -21,12 +21,13 @@ class HDoParseBreakpoint(gdb.Breakpoint): parser = int(block['parser'].value(frame)) state = int(block['state'].value(frame)) parse_state = block['state'].value(frame) + arena = parse_state['arena'] index = parse_state.dereference()['input_stream']['index'] input_ptr = parse_state.dereference()['input_stream']['input'] token_start = index - #top_level_parse.enter_h_do_parse(parse_state, None, parser) - top_level_parse.enter_h_do_parse(state, None, parser) + #top_level_parse.enter_h_do_parse(parse_state, None, parser) # Note for the future: passing it as int is intended here, memory stats' keys turn into gdb values too + top_level_parse.enter_h_do_parse(state, arena, parser) input_chunk = input_ptr + index #print(input_chunk.string('ascii','backslashreplace',10)) diff --git a/gdb-port/top-level-parse.py b/gdb-port/top-level-parse.py index 54481f5bc1356a3542fe7e16b285620c53feea80..6dcbd8607a311da9bb6c5e3deb2ac58498a3bad9 100644 --- a/gdb-port/top-level-parse.py +++ b/gdb-port/top-level-parse.py @@ -72,6 +72,8 @@ class TopLevelParse: # Called from h_do_parse()'s handler, at which point we know the addresses of the state and arena def first_h_do_parse_after_packrat_parse(self, parse_state, arena): parser_stack = self.peek_parserstack() + if arena and not parser_stack.arena: + parser_stack.arena = arena parser_stack.set_state(parse_state) # Popping the stack of stack of parsers