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
2 changed files with 26 additions and 17 deletions
|
@ -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>
|
2016-02-12 Markus Metzger <markus.t.metzger@intel.com>
|
||||||
|
|
||||||
* frame.h (skip_tailcall_frames): New.
|
* 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 (" ");
|
wrap_here (" ");
|
||||||
printf_filtered ("saved %s = ", pc_regname);
|
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);
|
TRY
|
||||||
caller_pc_p = 1;
|
|
||||||
}
|
|
||||||
CATCH (ex, RETURN_MASK_ERROR)
|
|
||||||
{
|
|
||||||
switch (ex.error)
|
|
||||||
{
|
{
|
||||||
case NOT_AVAILABLE_ERROR:
|
caller_pc = frame_unwind_caller_pc (fi);
|
||||||
val_print_unavailable (gdb_stdout);
|
caller_pc_p = 1;
|
||||||
break;
|
|
||||||
case OPTIMIZED_OUT_ERROR:
|
|
||||||
val_print_not_saved (gdb_stdout);
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
fprintf_filtered (gdb_stdout, _("<error: %s>"), ex.message);
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
|
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)
|
if (caller_pc_p)
|
||||||
fputs_filtered (paddress (gdbarch, caller_pc), gdb_stdout);
|
fputs_filtered (paddress (gdbarch, caller_pc), gdb_stdout);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue