* [PATCH] gdb: add HtabPrinter to gdb-gdb.py.in @ 2023-02-09 19:50 Simon Marchi 2023-02-09 19:52 ` Simon Marchi 2023-02-27 18:10 ` Tom Tromey 0 siblings, 2 replies; 6+ messages in thread From: Simon Marchi @ 2023-02-09 19:50 UTC (permalink / raw) To: gdb-patches; +Cc: Simon Marchi When debugging GDB, I find it a bit tedious to inspect htab_t objects. It is possible to find the entries by poking at the fields, but it's annoying to do each time. I think a pretty printer would help. Add a basic one to gdb-gdb.py. The pretty printer advertises itself as "array-like", and the result looks like: (top-gdb) p bfcache $3 = htab_t with 3 elements = {0x6210003252a0, 0x62100032caa0, 0x62100033baa0} The htab_t itself doesn't know about the type of pointed objects. But it's easy enough to cast the addresses to the right type to use them: (top-gdb) print *((btrace_frame_cache *) 0x6210003252a0) $6 = {tp = 0x61700002ed80, frame = 0x6210003251e0, bfun = 0x62000000b390} Change-Id: Ia692e3555fe7a117b7ec087840246b1260a704c6 --- gdb/gdb-gdb.py.in | 36 ++++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/gdb/gdb-gdb.py.in b/gdb/gdb-gdb.py.in index 95b7d84966f0..31ce80bb1e44 100644 --- a/gdb/gdb-gdb.py.in +++ b/gdb/gdb-gdb.py.in @@ -369,6 +369,40 @@ class IntrusiveListPrinter: return self._children_generator() +class HtabPrinter: + """Pretty-printer for htab_t hash tables.""" + + def __init__(self, val): + self._val = val + self._entries = val["entries"] + self._size = int(val["size"]) + + def display_hint(self): + return "array" + + def to_string(self): + n = int(self._val["n_elements"]) - int(self._val["n_deleted"]) + return "htab_t with {} elements".format(n) + + def _children_generator(self): + size = int(self._val["size"]) + entries = self._val["entries"] + + child_i = 0 + for entries_i in range(size): + entry = entries[entries_i] + # 0 (NULL pointer) means there's nothing, 1 (HTAB_DELETED_ENTRY) + # means there was something, but is now deleted. + if int(entry) in (0, 1): + continue + + yield (str(child_i), entry) + child_i += 1 + + def children(self): + return self._children_generator() + + def type_lookup_function(val): """A routine that returns the correct pretty printer for VAL if appropriate. Returns None otherwise. @@ -383,6 +417,8 @@ def type_lookup_function(val): return CoreAddrPrettyPrinter(val) elif tag is not None and tag.startswith("intrusive_list<"): return IntrusiveListPrinter(val) + elif name == "htab_t": + return HtabPrinter(val) return None -- 2.39.1 ^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH] gdb: add HtabPrinter to gdb-gdb.py.in 2023-02-09 19:50 [PATCH] gdb: add HtabPrinter to gdb-gdb.py.in Simon Marchi @ 2023-02-09 19:52 ` Simon Marchi 2023-02-27 18:10 ` Tom Tromey 1 sibling, 0 replies; 6+ messages in thread From: Simon Marchi @ 2023-02-09 19:52 UTC (permalink / raw) To: Simon Marchi, gdb-patches > diff --git a/gdb/gdb-gdb.py.in b/gdb/gdb-gdb.py.in > index 95b7d84966f0..31ce80bb1e44 100644 > --- a/gdb/gdb-gdb.py.in > +++ b/gdb/gdb-gdb.py.in > @@ -369,6 +369,40 @@ class IntrusiveListPrinter: > return self._children_generator() > > > +class HtabPrinter: > + """Pretty-printer for htab_t hash tables.""" > + > + def __init__(self, val): > + self._val = val > + self._entries = val["entries"] > + self._size = int(val["size"]) Just after sending, I realized that _entries and _size aren't necessary. I removed them locally. Simon ^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH] gdb: add HtabPrinter to gdb-gdb.py.in 2023-02-09 19:50 [PATCH] gdb: add HtabPrinter to gdb-gdb.py.in Simon Marchi 2023-02-09 19:52 ` Simon Marchi @ 2023-02-27 18:10 ` Tom Tromey 2023-02-28 4:23 ` Simon Marchi 1 sibling, 1 reply; 6+ messages in thread From: Tom Tromey @ 2023-02-27 18:10 UTC (permalink / raw) To: Simon Marchi via Gdb-patches; +Cc: Simon Marchi >>>>> "Simon" == Simon Marchi via Gdb-patches <gdb-patches@sourceware.org> writes: Simon> When debugging GDB, I find it a bit tedious to inspect htab_t objects. Simon> It is possible to find the entries by poking at the fields, but it's Simon> annoying to do each time. I think a pretty printer would help. Add a Simon> basic one to gdb-gdb.py. I could have used this today :-} Simon> + def _children_generator(self): Simon> + size = int(self._val["size"]) Simon> + entries = self._val["entries"] Simon> + Simon> + child_i = 0 Simon> + for entries_i in range(size): Simon> + entry = entries[entries_i] Simon> + # 0 (NULL pointer) means there's nothing, 1 (HTAB_DELETED_ENTRY) Simon> + # means there was something, but is now deleted. Simon> + if int(entry) in (0, 1): Simon> + continue Simon> + Simon> + yield (str(child_i), entry) Simon> + child_i += 1 Simon> + Simon> + def children(self): Simon> + return self._children_generator() I don't think the indirection here is needed, you can just have children yield. But, either way seems fine to me. Reviewed-By: Tom Tromey <tom@tromey.com> Tom ^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH] gdb: add HtabPrinter to gdb-gdb.py.in 2023-02-27 18:10 ` Tom Tromey @ 2023-02-28 4:23 ` Simon Marchi 2023-02-28 14:30 ` Tom Tromey 0 siblings, 1 reply; 6+ messages in thread From: Simon Marchi @ 2023-02-28 4:23 UTC (permalink / raw) To: Tom Tromey, Simon Marchi via Gdb-patches; +Cc: Simon Marchi On 2/27/23 13:10, Tom Tromey wrote: >>>>>> "Simon" == Simon Marchi via Gdb-patches <gdb-patches@sourceware.org> writes: > > Simon> When debugging GDB, I find it a bit tedious to inspect htab_t objects. > Simon> It is possible to find the entries by poking at the fields, but it's > Simon> annoying to do each time. I think a pretty printer would help. Add a > Simon> basic one to gdb-gdb.py. > > I could have used this today :-} > > Simon> + def _children_generator(self): > Simon> + size = int(self._val["size"]) > Simon> + entries = self._val["entries"] > Simon> + > Simon> + child_i = 0 > Simon> + for entries_i in range(size): > Simon> + entry = entries[entries_i] > Simon> + # 0 (NULL pointer) means there's nothing, 1 (HTAB_DELETED_ENTRY) > Simon> + # means there was something, but is now deleted. > Simon> + if int(entry) in (0, 1): > Simon> + continue > Simon> + > Simon> + yield (str(child_i), entry) > Simon> + child_i += 1 > Simon> + > Simon> + def children(self): > Simon> + return self._children_generator() > > I don't think the indirection here is needed, you can just have children > yield. But, either way seems fine to me. > > Reviewed-By: Tom Tromey <tom@tromey.com> Ah, you're right. Well, here's an updated version that also adds a test in gdb.gdb/python-helper.exp. From 69259c470aaad72b28b4d34a5f1d0a999f660582 Mon Sep 17 00:00:00 2001 From: Simon Marchi <simon.marchi@efficios.com> Date: Thu, 9 Feb 2023 14:50:56 -0500 Subject: [PATCH] gdb: add HtabPrinter to gdb-gdb.py.in When debugging GDB, I find it a bit tedious to inspect htab_t objects. It is possible to find the entries by poking at the fields, but it's annoying to do each time. I think a pretty printer would help. Add a basic one to gdb-gdb.py. The pretty printer advertises itself as "array-like", and the result looks like: (top-gdb) p bfcache $3 = htab_t with 3 elements = {0x6210003252a0, 0x62100032caa0, 0x62100033baa0} The htab_t itself doesn't know about the type of pointed objects. But it's easy enough to cast the addresses to the right type to use them: (top-gdb) print *((btrace_frame_cache *) 0x6210003252a0) $6 = {tp = 0x61700002ed80, frame = 0x6210003251e0, bfun = 0x62000000b390} Change-Id: Ia692e3555fe7a117b7ec087840246b1260a704c6 Reviewed-By: Tom Tromey <tom@tromey.com> --- gdb/gdb-gdb.py.in | 31 +++++++++++++++++++++++++ gdb/testsuite/gdb.gdb/python-helper.exp | 3 +++ 2 files changed, 34 insertions(+) diff --git a/gdb/gdb-gdb.py.in b/gdb/gdb-gdb.py.in index 95b7d84966f0..56d063cd506b 100644 --- a/gdb/gdb-gdb.py.in +++ b/gdb/gdb-gdb.py.in @@ -369,6 +369,35 @@ class IntrusiveListPrinter: return self._children_generator() +class HtabPrinter: + """Pretty-printer for htab_t hash tables.""" + + def __init__(self, val): + self._val = val + + def display_hint(self): + return "array" + + def to_string(self): + n = int(self._val["n_elements"]) - int(self._val["n_deleted"]) + return "htab_t with {} elements".format(n) + + def children(self): + size = int(self._val["size"]) + entries = self._val["entries"] + + child_i = 0 + for entries_i in range(size): + entry = entries[entries_i] + # 0 (NULL pointer) means there's nothing, 1 (HTAB_DELETED_ENTRY) + # means there was something, but is now deleted. + if int(entry) in (0, 1): + continue + + yield (str(child_i), entry) + child_i += 1 + + def type_lookup_function(val): """A routine that returns the correct pretty printer for VAL if appropriate. Returns None otherwise. @@ -383,6 +412,8 @@ def type_lookup_function(val): return CoreAddrPrettyPrinter(val) elif tag is not None and tag.startswith("intrusive_list<"): return IntrusiveListPrinter(val) + elif name == "htab_t": + return HtabPrinter(val) return None diff --git a/gdb/testsuite/gdb.gdb/python-helper.exp b/gdb/testsuite/gdb.gdb/python-helper.exp index f1e95fbe5ee7..16b419984cf3 100644 --- a/gdb/testsuite/gdb.gdb/python-helper.exp +++ b/gdb/testsuite/gdb.gdb/python-helper.exp @@ -208,6 +208,9 @@ proc test_python_helper {} { " cplus_stuff = $hex}"] gdb_test -prompt $outer_prompt_re "print *type->main_type" $answer + # Test the htab_t pretty-printer. + gdb_test -prompt $outer_prompt_re "print all_bfds" "htab_t with ${::decimal} elements = \\{${::hex}.*\\}" + return 0 } base-commit: 26c294bd1b8d95b421487294863eb1560b65580d -- 2.39.2 ^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH] gdb: add HtabPrinter to gdb-gdb.py.in 2023-02-28 4:23 ` Simon Marchi @ 2023-02-28 14:30 ` Tom Tromey 2023-02-28 16:08 ` Simon Marchi 0 siblings, 1 reply; 6+ messages in thread From: Tom Tromey @ 2023-02-28 14:30 UTC (permalink / raw) To: Simon Marchi via Gdb-patches; +Cc: Tom Tromey, Simon Marchi, Simon Marchi >>>>> "Simon" == Simon Marchi via Gdb-patches <gdb-patches@sourceware.org> writes: Simon> Ah, you're right. Well, here's an updated version that also adds a test Simon> in gdb.gdb/python-helper.exp. Looks great, thank you. Tom ^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH] gdb: add HtabPrinter to gdb-gdb.py.in 2023-02-28 14:30 ` Tom Tromey @ 2023-02-28 16:08 ` Simon Marchi 0 siblings, 0 replies; 6+ messages in thread From: Simon Marchi @ 2023-02-28 16:08 UTC (permalink / raw) To: Tom Tromey, Simon Marchi via Gdb-patches; +Cc: Simon Marchi On 2/28/23 09:30, Tom Tromey wrote: >>>>>> "Simon" == Simon Marchi via Gdb-patches <gdb-patches@sourceware.org> writes: > > Simon> Ah, you're right. Well, here's an updated version that also adds a test > Simon> in gdb.gdb/python-helper.exp. > > Looks great, thank you. > > Tom Pushed, thanks! Simon ^ permalink raw reply [flat|nested] 6+ messages in thread
end of thread, other threads:[~2023-02-28 16:08 UTC | newest] Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed) -- links below jump to the message on this page -- 2023-02-09 19:50 [PATCH] gdb: add HtabPrinter to gdb-gdb.py.in Simon Marchi 2023-02-09 19:52 ` Simon Marchi 2023-02-27 18:10 ` Tom Tromey 2023-02-28 4:23 ` Simon Marchi 2023-02-28 14:30 ` Tom Tromey 2023-02-28 16:08 ` Simon Marchi
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).