This is the mail archive of the
gdb-patches@sourceware.org
mailing list for the GDB project.
Re: MI: type prefixes for values
- From: Daniel Jacobowitz <drow at false dot org>
- To: Vladimir Prus <ghost at cs dot msu dot su>
- Cc: gdb-patches at sources dot redhat dot com
- Date: Fri, 5 May 2006 15:25:35 -0400
- Subject: Re: MI: type prefixes for values
- References: <dt43qh$sns$1@sea.gmane.org> <17427.54333.236860.258115@kahikatea.snap.net.nz> <dvemrm$al0$1@sea.gmane.org> <20060317191207.GA19068@nevyn.them.org> <dvliph$urc$1@sea.gmane.org> <20060324030332.GB2853@nevyn.them.org> <e00anu$f6m$1@sea.gmane.org> <20060324202056.GA26748@nevyn.them.org> <e12k8s$dci$1@sea.gmane.org> <e2scu2$vvn$1@sea.gmane.org>
On Fri, Apr 28, 2006 at 10:32:34AM +0400, Vladimir Prus wrote:
>
> Any comments on the patch I've send two weeks ago? Note that I'm not longer
> interested in this patch myself, since I no longer use "--stack-list-frames
> --all-values" in KDevelop, but I believe the patch affects the MI support
> in Emacs that Nick is working on.
After thinking about it for a bit, let's not do it this way. I think
we could put a catch at the right place and make all possible memory
errors come out consistently - I'm thinking something like
volatile struct gdb_exception except;
int ret = 0;
...
TRY_CATCH (except, RETURN_MASK_ERROR)
{
ret = val_print (...);
}
if (except.reason < 0)
fprintf_filtered (stream, _("<error reading variable>"));
return ret;
This would probably either require additional changes, to use
common_val_print and value_field et cetera in more places, or
else have to be placed in val_print directly, around the call to
LA_VAL_PRINT. The latter is easier.
Here's a patch; before it I get:
(gdb) i locals
ref = (int &) @0x2ae2e8dc0392: 1287883081
ref3 = (int &) @0x2ae2e90bc7a0: -385103520
ref5 = (int &) @0x0: Cannot access memory at address 0x0
After:
(gdb) i locals
ref = (int &) @0x2ac1ec165392: 1287883081
ref3 = (int &) @0x2ac1ec4617a0: -330950304
ref5 = (int &) @0x0: <error reading variable>
ref7 = (int &) @0x40041b: 147096392
ref9 = (int &) @0x400588: 352685384
ref2 = (int &) @0x2ac1ec4630c0: -330969896
ref4 = (int &) @0x2ac1ec460fe0: -330952736
ref6 = (int &) @0x2ac1ec270ca0: 0
ref8 = (int &) @0x4005f0: 610568524
Similarly:
(gdb) interpreter-exec mi "-stack-list-locals 1"
^done,locals=[{name="ref",value="(int &) @0x2ba30c30d392:
1287883081"},{name="ref3",value="(int &) @0x2ba30c6097a0:
207657312"},{name="ref5",value="(int &) @0x0: <error reading
variable>"},{name="ref7",value="(int &) @0x40041b:
147096392"},{name="ref9",value="(int &) @0x400588:
352685384"},{name="ref2",value="(int &) @0x2ba30c60b0c0:
207637720"},{name="ref4",value="(int &) @0x2ba30c608fe0:
207654880"},{name="ref6",value="(int &) @0x2ba30c418ca0:
0"},{name="ref8",value="(int &) @0x4005f0: 610568524"}]
We already print out various <angle brackets> messages for error
conditions; I think adding a new one is fine. How about you?
This patch doesn't touch the issue of type prefixes, leaving that to
deal with separately.
--
Daniel Jacobowitz
CodeSourcery
2006-05-05 Daniel Jacobowitz <dan@codesourcery.com>
* valprint.c: Include "exceptions.h".
(val_print): If something goes wrong while printing, supply an
error message.
Index: valprint.c
===================================================================
RCS file: /cvs/src/src/gdb/valprint.c,v
retrieving revision 1.59
diff -u -p -r1.59 valprint.c
--- valprint.c 18 Jan 2006 21:24:19 -0000 1.59
+++ valprint.c 5 May 2006 19:23:53 -0000
@@ -34,6 +34,7 @@
#include "valprint.h"
#include "floatformat.h"
#include "doublest.h"
+#include "exceptions.h"
#include <errno.h>
@@ -205,6 +206,9 @@ val_print (struct type *type, const gdb_
CORE_ADDR address, struct ui_file *stream, int format,
int deref_ref, int recurse, enum val_prettyprint pretty)
{
+ volatile struct gdb_exception except;
+ int ret = 0;
+
struct type *real_type = check_typedef (type);
if (pretty == Val_pretty_default)
{
@@ -224,8 +228,15 @@ val_print (struct type *type, const gdb_
return (0);
}
- return (LA_VAL_PRINT (type, valaddr, embedded_offset, address,
- stream, format, deref_ref, recurse, pretty));
+ TRY_CATCH (except, RETURN_MASK_ERROR)
+ {
+ ret = LA_VAL_PRINT (type, valaddr, embedded_offset, address,
+ stream, format, deref_ref, recurse, pretty);
+ }
+ if (except.reason < 0)
+ fprintf_filtered (stream, _("<error reading variable>"));
+
+ return ret;
}
/* Check whether the value VAL is printable. Return 1 if it is;
Index: Makefile.in
===================================================================
RCS file: /cvs/src/src/gdb/Makefile.in,v
retrieving revision 1.811
diff -u -p -r1.811 Makefile.in
--- Makefile.in 23 Apr 2006 14:15:01 -0000 1.811
+++ Makefile.in 5 May 2006 19:24:26 -0000
@@ -2773,7 +2773,8 @@ valops.o: valops.c $(defs_h) $(symtab_h)
$(cp_support_h) $(observer_h)
valprint.o: valprint.c $(defs_h) $(gdb_string_h) $(symtab_h) $(gdbtypes_h) \
$(value_h) $(gdbcore_h) $(gdbcmd_h) $(target_h) $(language_h) \
- $(annotate_h) $(valprint_h) $(floatformat_h) $(doublest_h)
+ $(annotate_h) $(valprint_h) $(floatformat_h) $(doublest_h) \
+ $(exceptions_h)
value.o: value.c $(defs_h) $(gdb_string_h) $(symtab_h) $(gdbtypes_h) \
$(value_h) $(gdbcore_h) $(command_h) $(gdbcmd_h) $(target_h) \
$(language_h) $(scm_lang_h) $(demangle_h) $(doublest_h) \