This is the mail archive of the
gdb-patches@sourceware.org
mailing list for the GDB project.
[unavailable values part 1, 15/17] print pointers with 'set print object on'
- From: Pedro Alves <pedro at codesourcery dot com>
- To: gdb-patches at sourceware dot org
- Date: Mon, 7 Feb 2011 14:34:54 +0000
- Subject: [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;