This is the mail archive of the gdb-patches@sourceware.org mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[unavailable values part 1, 15/17] print pointers with 'set print object on'


With:

 struct Virtual {
   virtual ~Virtual() {}
 };

 Virtual *virtualp;

With "set print object on", before the patch we get:

 (gdb) print virtualp
 $39 = (value is not available

That's an error being thrown trying to read the pointed-to object.

Afterwards:

 (gdb) print virtualp
 $39 = (Virtual *) <unavailable>

-- 
Pedro Alves

2011-02-07  Pedro Alves  <pedro@codesourcery.com>

	gdb/testsuite/
	* gdb.trace/unavailable.cc (struct Virtual): New.
	(virtualp): New global pointer.
	* gdb.trace/unavailable.exp (gdb_collect_globals_test): Test
	printing a pointer to an object whose type has a vtable, with
	print object on.

	gdb/
	* value.h (value_entirely_available): Declare.
	* value.c (value_entirely_available): New function.
	* c-valprint.c (c_value_print): Don't try fetching the pointer's
	real type if the pointer is unavailable.

---
 gdb/c-valprint.c                        |   48 +++++++++++++++++---------------
 gdb/testsuite/gdb.trace/unavailable.cc  |    7 ++++
 gdb/testsuite/gdb.trace/unavailable.exp |   12 +++++++-
 gdb/value.c                             |   16 ++++++++++
 gdb/value.h                             |    4 ++
 5 files changed, 64 insertions(+), 23 deletions(-)

Index: src/gdb/testsuite/gdb.trace/unavailable.cc
===================================================================
--- src.orig/gdb/testsuite/gdb.trace/unavailable.cc	2011-02-07 13:18:21.436706001 +0000
+++ src/gdb/testsuite/gdb.trace/unavailable.cc	2011-02-07 13:24:23.726706003 +0000
@@ -114,6 +114,13 @@ struct StructA StructB::static_struct_a;
 StructRef g_structref(0x12345678);
 StructRef *g_structref_p = &g_structref;
 
+struct Virtual {
+  int z;
+
+  virtual ~Virtual() {}
+};
+
+Virtual *virtualp;
 
 /* Test functions.  */
 
Index: src/gdb/testsuite/gdb.trace/unavailable.exp
===================================================================
--- src.orig/gdb/testsuite/gdb.trace/unavailable.exp	2011-02-07 13:22:15.776706000 +0000
+++ src/gdb/testsuite/gdb.trace/unavailable.exp	2011-02-07 13:24:23.726706003 +0000
@@ -103,7 +103,7 @@ proc gdb_collect_globals_test { } {
 	"collect g_string_partial\[1\]" "^$" \
 	"collect g_string_partial\[2\]" "^$" \
 	\
-	"collect g_structref_p" "^$" \
+	"collect g_structref_p" "^$"
 
     # Begin the test.
     run_trace_experiment globals_test_func
@@ -242,6 +242,16 @@ proc gdb_collect_globals_test { } {
     gdb_test "print g_smallstruct_b" " = \\{<small_struct> = \\{member = <unavailable>\\}, <No data fields>\\}"
     gdb_test "print (small_struct) \$" " = \\{member = <unavailable>\\}"
 
+    gdb_test_no_output "set print object on"
+
+    # With print object on, printing a pointer may need to fetch the
+    # pointed-to object, to check its run-time type.  Make sure that
+    # fails gracefully and transparently when the pointer itself is
+    # unavailable.
+    gdb_test "print virtualp" " = \\(Virtual \\*\\) <unavailable>"
+
+    gdb_test_no_output "set print object off"
+
     gdb_test "tfind none" \
 	"#0  end .*" \
 	"cease trace debugging"
Index: src/gdb/value.h
===================================================================
--- src.orig/gdb/value.h	2011-02-07 13:18:21.426706000 +0000
+++ src/gdb/value.h	2011-02-07 13:24:23.766706003 +0000
@@ -368,6 +368,10 @@ extern int value_bits_synthetic_pointer
 extern int value_bytes_available (const struct value *value,
 				  int offset, int length);
 
+/* Like value_bytes_available, but return false if any byte in the
+   whole object is unavailable.  */
+extern int value_entirely_available (struct value *value);
+
 /* Mark VALUE's content bytes starting at OFFSET and extending for
    LENGTH bytes as unavailable.  */
 
Index: src/gdb/value.c
===================================================================
--- src.orig/gdb/value.c	2011-02-07 13:18:21.426706000 +0000
+++ src/gdb/value.c	2011-02-07 13:24:23.766706003 +0000
@@ -288,6 +288,22 @@ value_bytes_available (const struct valu
   return !ranges_contain_p (value->unavailable, offset, length);
 }
 
+int
+value_entirely_available (struct value *value)
+{
+  if (value == NULL)
+    return 1;
+
+  /* We can only tell whether the whole value is available when we try
+     to read it.  */
+  if (value->lazy)
+    value_fetch_lazy (value);
+
+  if (VEC_empty (range_s, value->unavailable))
+    return 1;
+  return 0;
+}
+
 void
 mark_value_bytes_unavailable (struct value *value, int offset, int length)
 {
Index: src/gdb/c-valprint.c
===================================================================
--- src.orig/gdb/c-valprint.c	2011-02-07 13:17:36.276706003 +0000
+++ src/gdb/c-valprint.c	2011-02-07 13:24:23.766706003 +0000
@@ -686,29 +686,33 @@ c_value_print (struct value *val, struct
 	    }
 	  /* Pointer to class, check real type of object.  */
 	  fprintf_filtered (stream, "(");
-          real_type = value_rtti_target_type (val, &full,
-					      &top, &using_enc);
-          if (real_type)
-	    {
-	      /* RTTI entry found.  */
-              if (TYPE_CODE (type) == TYPE_CODE_PTR)
-                {
-                  /* Create a pointer type pointing to the real
-		     type.  */
-                  type = lookup_pointer_type (real_type);
-                }
-              else
-                {
-                  /* Create a reference type referencing the real
-		     type.  */
-                  type = lookup_reference_type (real_type);
-                }
-	      /* JYG: Need to adjust pointer value.  */
-	      val = value_from_pointer (type, value_as_address (val) - top);
 
-              /* Note: When we look up RTTI entries, we don't get any 
-                 information on const or volatile attributes.  */
-            }
+	  if (value_entirely_available (val))
+ 	    {
+	      real_type = value_rtti_target_type (val, &full, &top, &using_enc);
+	      if (real_type)
+		{
+		  /* RTTI entry found.  */
+		  if (TYPE_CODE (type) == TYPE_CODE_PTR)
+		    {
+		      /* Create a pointer type pointing to the real
+			 type.  */
+		      type = lookup_pointer_type (real_type);
+		    }
+		  else
+		    {
+		      /* Create a reference type referencing the real
+			 type.  */
+		      type = lookup_reference_type (real_type);
+		    }
+		  /* Need to adjust pointer value.  */
+		  val = value_from_pointer (type, value_as_address (val) - top);
+
+		  /* Note: When we look up RTTI entries, we don't get
+		     any information on const or volatile
+		     attributes.  */
+		}
+	    }
           type_print (type, "", stream, -1);
 	  fprintf_filtered (stream, ") ");
 	  val_type = type;


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]