]> git.ipfire.org Git - thirdparty/binutils-gdb.git/commitdiff
gdb-gdb.py: strip typedefs in intrusive_list printer assertion
authorSimon Marchi <simon.marchi@polymtl.ca>
Wed, 17 Jul 2024 16:10:57 +0000 (12:10 -0400)
committerSimon Marchi <simon.marchi@polymtl.ca>
Fri, 19 Jul 2024 20:30:52 +0000 (16:30 -0400)
When debugging gdb itself and trying to print a intrusive_list that has
more than one element, I get:

    File "/home/simark/build/binutils-gdb-all-targets/gdb/gdb-gdb.py", line 365, in _children_generator
      node_ptr = self._as_node_ptr(elem_ptr)
                 ^^^^^^^^^^^^^^^^^^^^^^^^^^^
    File "/home/simark/build/binutils-gdb-all-targets/gdb/gdb-gdb.py", line 345, in _as_node_ptr
      assert elem_ptr.type.code == gdb.TYPE_CODE_PTR
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    AssertionError

This is because node_ptr is a typedef
(intrusive_list_base_iterator::pointer).  Add a call to strip_typedefs
to get to the real type.

Enhance gdb.gdb/python-helper.exp with a test that would have caught
this bug.

Change-Id: I3eaca8de5ed06d05756ed979332b6a431e15b700
Approved-By: Andrew Burgess <aburgess@redhat.com>
gdb/gdb-gdb.py.in
gdb/testsuite/gdb.gdb/python-helper.exp

index b5a7fa4f39034dd74fee7ebf349c9a14f827d102..7cab6941f02cc8cd835b9d9671da4aaab370ebd5 100644 (file)
@@ -342,7 +342,7 @@ class IntrusiveListPrinter:
         corresponding intrusive_list_node.
         """
 
-        assert elem_ptr.type.code == gdb.TYPE_CODE_PTR
+        assert elem_ptr.type.strip_typedefs().code == gdb.TYPE_CODE_PTR
 
         if self._uses_member_node():
             # Node as a member: add the member node offset from to the element's
index 8a8afb12257bc14d3b2944758d45d7a3d6f574d0..4589edc388fdc946067314787d108fa6398adf4b 100644 (file)
@@ -111,6 +111,16 @@ proc test_python_helper {} {
        }
     }
 
+    # Add a second inferior, useful to the intrusive_list pretty-printer test
+    # below.
+    send_inferior "add-inferior\n"
+    gdb_test_multiple "" "add second inferior in inner GDB" {
+       -i "$inferior_spawn_id"
+       -re "Added inferior 2\r\n$gdb_prompt $" {
+           pass $gdb_test_name
+       }
+    }
+
     # Send Ctrl-C to the inner GDB, this should kick us back to the
     # prompt of the outer GDB.
     send_inferior "\003"
@@ -253,6 +263,11 @@ proc test_python_helper {} {
     # Test the htab_t pretty-printer.
     gdb_test -prompt $outer_prompt_re "print all_bfds" "htab_t with ${::decimal} elements = \\{${::hex}.*\\}"
 
+    # Test the intrusive_list pretty-printer.  A bug occured in the
+    # pretty-printer for lists with more than one element.  Verify that
+    # we see both elements of the inferior_list list being printed.
+    gdb_test -prompt $outer_prompt_re "print inferior_list" "intrusive list of inferior = {.*, num = 1,.*, num = 2,.*}"
+
     return 0
 }