stack: check frame_unwind_caller_id
Callers of frame_unwind_caller_* functions are supposed to check frame_unwind_caller_id. Add such a check to frame_info and treat an invalid caller ID as if the caller PC were not available. gdb/ * stack.c (frame_info): Check frame_unwind_caller_id.
This commit is contained in:
parent
2f3ef606b9
commit
a038fa3e14
@ -1,3 +1,7 @@
|
||||
2016-02-12 Markus Metzger <markus.t.metzger@intel.com>
|
||||
|
||||
* stack.c (frame_info): Check frame_unwind_caller_id.
|
||||
|
||||
2016-02-12 Markus Metzger <markus.t.metzger@intel.com>
|
||||
|
||||
* frame.h (skip_tailcall_frames): New.
|
||||
|
39
gdb/stack.c
39
gdb/stack.c
@ -1509,27 +1509,32 @@ frame_info (char *addr_exp, int from_tty)
|
||||
wrap_here (" ");
|
||||
printf_filtered ("saved %s = ", pc_regname);
|
||||
|
||||
TRY
|
||||
if (!frame_id_p (frame_unwind_caller_id (fi)))
|
||||
val_print_unavailable (gdb_stdout);
|
||||
else
|
||||
{
|
||||
caller_pc = frame_unwind_caller_pc (fi);
|
||||
caller_pc_p = 1;
|
||||
}
|
||||
CATCH (ex, RETURN_MASK_ERROR)
|
||||
{
|
||||
switch (ex.error)
|
||||
TRY
|
||||
{
|
||||
case NOT_AVAILABLE_ERROR:
|
||||
val_print_unavailable (gdb_stdout);
|
||||
break;
|
||||
case OPTIMIZED_OUT_ERROR:
|
||||
val_print_not_saved (gdb_stdout);
|
||||
break;
|
||||
default:
|
||||
fprintf_filtered (gdb_stdout, _("<error: %s>"), ex.message);
|
||||
break;
|
||||
caller_pc = frame_unwind_caller_pc (fi);
|
||||
caller_pc_p = 1;
|
||||
}
|
||||
CATCH (ex, RETURN_MASK_ERROR)
|
||||
{
|
||||
switch (ex.error)
|
||||
{
|
||||
case NOT_AVAILABLE_ERROR:
|
||||
val_print_unavailable (gdb_stdout);
|
||||
break;
|
||||
case OPTIMIZED_OUT_ERROR:
|
||||
val_print_not_saved (gdb_stdout);
|
||||
break;
|
||||
default:
|
||||
fprintf_filtered (gdb_stdout, _("<error: %s>"), ex.message);
|
||||
break;
|
||||
}
|
||||
}
|
||||
END_CATCH
|
||||
}
|
||||
END_CATCH
|
||||
|
||||
if (caller_pc_p)
|
||||
fputs_filtered (paddress (gdbarch, caller_pc), gdb_stdout);
|
||||
|
Loading…
x
Reference in New Issue
Block a user