mirror of
https://sourceware.org/git/binutils-gdb.git
synced 2024-12-03 04:12:10 +08:00
2231f1fb60
gdb/ * frame.c (frame_stop_reason_string): Rewrite using unwind_stop_reasons.def. * frame.h (enum unwind_stop_reason): Likewise. * python/py-frame.c (gdbpy_initialize_frames): Likewise. (gdbpy_frame_stop_reason_string): Use new enum unwind_stop_reason constants for bound-checking. * unwind_stop_reasons.def: New file. * stack.c (backtrace_command_1): Handle UNWIND_FIRST_ERROR as an alias instead of a distinct value. doc/ * gdb.texinfo ((Frames In Python): Document gdb.FRAME_UNWIND_FIRST_ERROR contant.
81 lines
2.8 KiB
Modula-2
81 lines
2.8 KiB
Modula-2
/* Copyright 2011 Free Software Foundation, Inc.
|
|
|
|
This file is part of GDB.
|
|
|
|
This program is free software; you can redistribute it and/or modify
|
|
it under the terms of the GNU General Public License as published by
|
|
the Free Software Foundation; either version 3 of the License, or
|
|
(at your option) any later version.
|
|
|
|
This program is distributed in the hope that it will be useful,
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
GNU General Public License for more details.
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
along with this program. If not, see <http://www.gnu.org/licenses/>. */
|
|
|
|
/* Reasons why frames could not be further unwound
|
|
SET (name, description)
|
|
|
|
After this reason name, all reasons should be considered errors;
|
|
i.e.: abnormal stack termination.
|
|
FIRST_ERROR (name)
|
|
|
|
First and Last reason defined
|
|
FIRST_ENTRY (name)
|
|
LAST_ENTRY (name) */
|
|
|
|
#ifdef SET
|
|
/* No particular reason; either we haven't tried unwinding yet,
|
|
or we didn't fail. */
|
|
SET (UNWIND_NO_REASON, "no reason")
|
|
|
|
/* The previous frame's analyzer returns an invalid result
|
|
from this_id.
|
|
|
|
FIXME drow/2006-08-16: This is how GDB used to indicate end of
|
|
stack. We should migrate to a model where frames always have a
|
|
valid ID, and this becomes not just an error but an internal
|
|
error. But that's a project for another day. */
|
|
SET (UNWIND_NULL_ID, "unwinder did not report frame ID")
|
|
|
|
/* This frame is the outermost. */
|
|
SET (UNWIND_OUTERMOST, "outermost")
|
|
|
|
/* Can't unwind further, because that would require knowing the
|
|
values of registers or memory that haven't been collected. */
|
|
SET (UNWIND_UNAVAILABLE, \
|
|
"not enough registers or memory available to unwind further")
|
|
|
|
/* This frame ID looks like it ought to belong to a NEXT frame,
|
|
but we got it for a PREV frame. Normally, this is a sign of
|
|
unwinder failure. It could also indicate stack corruption. */
|
|
SET (UNWIND_INNER_ID, "previous frame inner to this frame (corrupt stack?)")
|
|
|
|
/* This frame has the same ID as the previous one. That means
|
|
that unwinding further would almost certainly give us another
|
|
frame with exactly the same ID, so break the chain. Normally,
|
|
this is a sign of unwinder failure. It could also indicate
|
|
stack corruption. */
|
|
SET (UNWIND_SAME_ID, "previous frame identical to this frame (corrupt stack?)")
|
|
|
|
/* The frame unwinder didn't find any saved PC, but we needed
|
|
one to unwind further. */
|
|
SET (UNWIND_NO_SAVED_PC, "frame did not save the PC")
|
|
|
|
#endif /* SET */
|
|
|
|
|
|
#ifdef FIRST_ERROR
|
|
FIRST_ERROR (UNWIND_UNAVAILABLE)
|
|
#endif
|
|
|
|
#ifdef FIRST_ENTRY
|
|
FIRST_ENTRY (UNWIND_NO_REASON)
|
|
#endif
|
|
|
|
#ifdef LAST_ENTRY
|
|
LAST_ENTRY (UNWIND_NO_SAVED_PC)
|
|
#endif
|