2011-09-02 Pedro Alves <pedro@codesourcery.com>
gdb/ * value.c (show_convenience): Catch errors thrown while printing each internal variable. * infrun.c (validate_siginfo_access): New function. (siginfo_value_read, siginfo_value_write): Call it.
This commit is contained in:
parent
86362dfd53
commit
c709acd150
|
@ -1,3 +1,10 @@
|
||||||
|
2011-09-02 Pedro Alves <pedro@codesourcery.com>
|
||||||
|
|
||||||
|
* value.c (show_convenience): Catch errors thrown while printing
|
||||||
|
each internal variable.
|
||||||
|
* infrun.c (validate_siginfo_access): New function.
|
||||||
|
(siginfo_value_read, siginfo_value_write): Call it.
|
||||||
|
|
||||||
2011-09-01 Jan Kratochvil <jan.kratochvil@redhat.com>
|
2011-09-01 Jan Kratochvil <jan.kratochvil@redhat.com>
|
||||||
|
|
||||||
Revert:
|
Revert:
|
||||||
|
|
23
gdb/infrun.c
23
gdb/infrun.c
|
@ -6384,6 +6384,25 @@ signals_info (char *signum_exp, int from_tty)
|
||||||
"to change these tables.\n"));
|
"to change these tables.\n"));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Check if it makes sense to read $_siginfo from the current thread
|
||||||
|
at this point. If not, throw an error. */
|
||||||
|
|
||||||
|
static void
|
||||||
|
validate_siginfo_access (void)
|
||||||
|
{
|
||||||
|
/* No current inferior, no siginfo. */
|
||||||
|
if (ptid_equal (inferior_ptid, null_ptid))
|
||||||
|
error (_("No thread selected."));
|
||||||
|
|
||||||
|
/* Don't try to read from a dead thread. */
|
||||||
|
if (is_exited (inferior_ptid))
|
||||||
|
error (_("The current thread has terminated"));
|
||||||
|
|
||||||
|
/* ... or from a spinning thread. */
|
||||||
|
if (is_running (inferior_ptid))
|
||||||
|
error (_("Selected thread is running."));
|
||||||
|
}
|
||||||
|
|
||||||
/* The $_siginfo convenience variable is a bit special. We don't know
|
/* The $_siginfo convenience variable is a bit special. We don't know
|
||||||
for sure the type of the value until we actually have a chance to
|
for sure the type of the value until we actually have a chance to
|
||||||
fetch the data. The type can change depending on gdbarch, so it is
|
fetch the data. The type can change depending on gdbarch, so it is
|
||||||
|
@ -6402,6 +6421,8 @@ siginfo_value_read (struct value *v)
|
||||||
{
|
{
|
||||||
LONGEST transferred;
|
LONGEST transferred;
|
||||||
|
|
||||||
|
validate_siginfo_access ();
|
||||||
|
|
||||||
transferred =
|
transferred =
|
||||||
target_read (¤t_target, TARGET_OBJECT_SIGNAL_INFO,
|
target_read (¤t_target, TARGET_OBJECT_SIGNAL_INFO,
|
||||||
NULL,
|
NULL,
|
||||||
|
@ -6421,6 +6442,8 @@ siginfo_value_write (struct value *v, struct value *fromval)
|
||||||
{
|
{
|
||||||
LONGEST transferred;
|
LONGEST transferred;
|
||||||
|
|
||||||
|
validate_siginfo_access ();
|
||||||
|
|
||||||
transferred = target_write (¤t_target,
|
transferred = target_write (¤t_target,
|
||||||
TARGET_OBJECT_SIGNAL_INFO,
|
TARGET_OBJECT_SIGNAL_INFO,
|
||||||
NULL,
|
NULL,
|
||||||
|
|
14
gdb/value.c
14
gdb/value.c
|
@ -2095,13 +2095,23 @@ show_convenience (char *ignore, int from_tty)
|
||||||
get_user_print_options (&opts);
|
get_user_print_options (&opts);
|
||||||
for (var = internalvars; var; var = var->next)
|
for (var = internalvars; var; var = var->next)
|
||||||
{
|
{
|
||||||
|
volatile struct gdb_exception ex;
|
||||||
|
|
||||||
if (!varseen)
|
if (!varseen)
|
||||||
{
|
{
|
||||||
varseen = 1;
|
varseen = 1;
|
||||||
}
|
}
|
||||||
printf_filtered (("$%s = "), var->name);
|
printf_filtered (("$%s = "), var->name);
|
||||||
value_print (value_of_internalvar (gdbarch, var), gdb_stdout,
|
|
||||||
&opts);
|
TRY_CATCH (ex, RETURN_MASK_ERROR)
|
||||||
|
{
|
||||||
|
struct value *val;
|
||||||
|
|
||||||
|
val = value_of_internalvar (gdbarch, var);
|
||||||
|
value_print (val, gdb_stdout, &opts);
|
||||||
|
}
|
||||||
|
if (ex.reason < 0)
|
||||||
|
fprintf_filtered (gdb_stdout, _("<error: %s>"), ex.message);
|
||||||
printf_filtered (("\n"));
|
printf_filtered (("\n"));
|
||||||
}
|
}
|
||||||
if (!varseen)
|
if (!varseen)
|
||||||
|
|
Loading…
Reference in New Issue