From 738756ae110a60d8f185cd6d832dc7a52055ecb6 Mon Sep 17 00:00:00 2001 From: pompolic <pompolic@special-circumstanc.es> Date: Mon, 10 Oct 2022 18:21:16 +0200 Subject: [PATCH] Add token addresses to display for debugging --- gdb-port/ast.py | 14 ++++++++++++++ gdb-port/top-level-parse.py | 9 ++++++--- 2 files changed, 20 insertions(+), 3 deletions(-) diff --git a/gdb-port/ast.py b/gdb-port/ast.py index f6cee66..6950b3f 100644 --- a/gdb-port/ast.py +++ b/gdb-port/ast.py @@ -46,6 +46,9 @@ class HParseResult: def __str__(self): return "HParseResult ({0}) {{ arena:{1}, data:{2} }}".format(hex(self.address), self.arena, self.ast) + def str_no_deref(self): # DEBUG? + return "HParseResult ({0}) {{ arena:{1}, data:{2} }}".format(hex(self.address), self.arena, self.ast.str_no_deref()) + class HParsedToken: token_union_members = { 2: 'bytes', @@ -158,6 +161,13 @@ class HParsedToken: else: return "{{ {0}, {1} }}".format(self.token_type, self.data) + def str_no_deref(self): # DEBUG? + if self.children: + return "{{ {0}, {1} }}".format(self.token_type, self.data.str_no_deref()) + else: + return "{{ {0}, {1} }}".format(self.token_type, self.data) + + class HCountedArray: HCountedArray_t_p = None @@ -185,6 +195,10 @@ class HCountedArray: elements_str = ", ".join([str(elem) for elem in self.elements_as_list()]) return "[ {0} ]".format(elements_str) + def str_no_deref(self): # DEBUG? + elements_str = ", ".join([hex(elem.address) for elem in self.elements_as_list()]) + return "[ {0} ]".format(elements_str) + # Unlike HCountedArray and HParsedToken, HBytes wraps the gdb.Value that is the structure itself, not a pointer to it # This is because the bytes field of a HParsedToken is a HBytes, not a HBytes* # If a HBytes* is really needed: for a given HParsedToken hpt, diff --git a/gdb-port/top-level-parse.py b/gdb-port/top-level-parse.py index 868d259..d3ca70b 100644 --- a/gdb-port/top-level-parse.py +++ b/gdb-port/top-level-parse.py @@ -233,7 +233,7 @@ class TopLevelParse: del self.input_index_tree_path[self.current_parse_depth+1:] token_addr = hparseresult_addr.cast(gdb.lookup_type("HParseResult").pointer())['ast'] if token_addr: - self.input_token_map[int(token_addr)] = {'start': self.starting_input_index[self.current_parse_depth], 'end': index} + self.input_token_map[int(token_addr)] = {'start': self.starting_input_index[self.current_parse_depth], 'end': index, 'hparseresult': hex(hparseresult_addr)} #print("DEBUG: current parse depth:", self.current_parse_depth) #print("DEBUG: finished tokens:", self.input_stream_indices) #print("DEBUG: path:", self.input_index_tree_path) @@ -393,7 +393,8 @@ class TopLevelParse: print("print_input_chunk(): start: ", start, "end: ", end) #h = min(rows, len(token.children)) tokenmap_values = list(self.input_token_map.values()) - tokenmap_val_list = [token for token in list(self.input_token_map.values()) if (token['start'] <= start and token['start'] <= end)] + #tokenmap_val_list = [token for token in list(self.input_token_map.values()) if (token['start'] <= start and token['start'] <= end)] + tokenmap_val_list = [dict(token, addr=hex(key)) for key, token in self.input_token_map.items() if (token['start'] <= start and token['start'] <= end)] numrows = min(rows, len(tokenmap_val_list)) #row_lengths_for_columns = [len([token for token in list(tokenmap_values) if (token['start'] <= x and x >= token['end'])]) for x in range(start,end+1)] #numrows = min(rows, max(row_lengths_for_columns)) @@ -430,8 +431,10 @@ class TopLevelParse: # print("end: ", end, "start+w", start+w) # print("w:", w, "h=rows:", h) # raise ie + charbufrows_token_debug = [ "".join(row) + "\n" + str(tokenmap_values_sorted[index]) for index, row in enumerate(charbuf)] charbufrows = ["".join(row) for row in charbuf] - charbuf_final = "\n".join(charbufrows) + #charbuf_final = "\n".join(charbufrows) + charbuf_final = "\n".join(charbufrows_token_debug) print(charbuf_final) def print_input_map(self, token, rec_depth=0, parent_bounds=None): -- GitLab