aboutsummaryrefslogtreecommitdiff
path: root/gdb/frame.h
diff options
context:
space:
mode:
authorYao Qi <yao.qi@arm.com>2016-05-23 17:32:56 +0100
committerYao Qi <yao.qi@linaro.org>2016-05-23 17:32:56 +0100
commit7eb895307f53af3435440d3fe67c0e4e679d99b2 (patch)
treef00e0024cc8dbc112a7c99c5b604e0a7dd9501ab /gdb/frame.h
parent0f6ed0e0efe2c4dcd35b0e483dc3b5da7fe4edf0 (diff)
downloadgdb-7eb895307f53af3435440d3fe67c0e4e679d99b2.zip
gdb-7eb895307f53af3435440d3fe67c0e4e679d99b2.tar.gz
gdb-7eb895307f53af3435440d3fe67c0e4e679d99b2.tar.bz2
Skip unwritable frames in command "finish"
Nowadays, GDB can't insert breakpoint on the return address of the exception handler on ARM M-profile, because the address is a magic one 0xfffffff9, (gdb) bt #0 CT32B1_IRQHandler () at ../src/timer.c:67 #1 <signal handler called> #2 main () at ../src/timer.c:127 (gdb) info frame Stack level 0, frame at 0x200ffa8: pc = 0x4ec in CT32B1_IRQHandler (../src/timer.c:67); saved pc = 0xfffffff9 called by frame at 0x200ffc8 source language c. Arglist at 0x200ffa0, args: Locals at 0x200ffa0, Previous frame's sp is 0x200ffa8 Saved registers: r7 at 0x200ffa0, lr at 0x200ffa4 (gdb) x/x 0xfffffff9 0xfffffff9: Cannot access memory at address 0xfffffff9 (gdb) finish Run till exit from #0 CT32B1_IRQHandler () at ../src/timer.c:67 Ed:15: Target error from Set break/watch: Et:96: Pseudo-address (0xFFFFFFxx) for EXC_RETURN is invalid (GDB error?) Warning: Cannot insert hardware breakpoint 0. Could not insert hardware breakpoints: You may have requested too many hardware breakpoints/watchpoints. Command aborted. even some debug probe can't set hardware breakpoint on the magic address too, (gdb) hbreak *0xfffffff9 Hardware assisted breakpoint 2 at 0xfffffff9 (gdb) c Continuing. Ed:15: Target error from Set break/watch: Et:96: Pseudo-address (0xFFFFFFxx) for EXC_RETURN is invalid (GDB error?) Warning: Cannot insert hardware breakpoint 2. Could not insert hardware breakpoints: You may have requested too many hardware breakpoints/watchpoints. Command aborted. The problem described above is quite similar to PR 8841, in which GDB can't set breakpoint on signal trampoline, which is mapped to a read-only page by kernel. The rationale of this patch is to skip "unwritable" frames when looking for caller frames in command "finish", and a new gdbarch method code_of_frame_writable is added. This patch fixes the problem on ARM cortex-m target, but it can be used to fix PR 8841 too. gdb: 2016-05-10 Yao Qi <yao.qi@arm.com> * arch-utils.c (default_code_of_frame_writable): New function. * arch-utils.h (default_code_of_frame_writable): Declare. * arm-tdep.c (arm_code_of_frame_writable): New function. (arm_gdbarch_init): Install gdbarch method code_of_frame_writable if the target is M-profile. * frame.c (skip_unwritable_frames): New function. * frame.h (skip_unwritable_frames): Declare. * gdbarch.sh (code_of_frame_writable): New. * gdbarch.c, gdbarch.h: Re-generated. * infcmd.c (finish_command): Call skip_unwritable_frames.
Diffstat (limited to 'gdb/frame.h')
-rw-r--r--gdb/frame.h5
1 files changed, 5 insertions, 0 deletions
diff --git a/gdb/frame.h b/gdb/frame.h
index 8ee64f1..5f21bb8 100644
--- a/gdb/frame.h
+++ b/gdb/frame.h
@@ -826,4 +826,9 @@ extern enum language get_frame_language (struct frame_info *frame);
extern struct frame_info *skip_tailcall_frames (struct frame_info *frame);
+/* Return the first frame above FRAME or FRAME of which the code is
+ writable. */
+
+extern struct frame_info *skip_unwritable_frames (struct frame_info *frame);
+
#endif /* !defined (FRAME_H) */