Make use of the frame stash to detect wider stack cycles.
authorPedro Alves <palves@redhat.com>
Thu, 21 Nov 2013 15:20:09 +0000 (15:20 +0000)
committerPedro Alves <palves@redhat.com>
Fri, 22 Nov 2013 13:53:39 +0000 (13:53 +0000)
commit194cca41192efa65f710967e3149bbc813c12b22
treea36148b875d93eafe33dc1cea95072c0205aeb8f
parent33f8fe58b9a55a0075a90cc9080a1716221a3f81
Make use of the frame stash to detect wider stack cycles.

Given we already have the frame id stash, which holds the ids of all
frames in the chain, detecting corrupted stacks with wide stack cycles
with non-consecutive dup frame ids is just as cheap as just detecting
cycles in consecutive frames:

 #0 frame_id1
 #1 frame_id2
 #2 frame_id3
 #3 frame_id1
 #4 frame_id2
 #5 frame_id3
 #6 frame_id1
 ... forever ...

We just need to check whether the stash already knows about a given
frame id instead of comparing the ids of the previous/this frames.

Tested on x86_64 Fedora 17.

gdb/
2013-11-22  Pedro Alves  <palves@redhat.com>
    Tom Tromey  <tromey@redhat.com>

* frame.c (frame_stash_add): Now returns whether a frame with the
same ID was already known.
(compute_frame_id): New function, factored out from get_frame_id.
(get_frame_id): No longer lazilly compute the frame id here.
(get_prev_frame_if_no_cycle): New function.  Detects wider stack
cycles.
(get_prev_frame_1): Use it instead of get_prev_frame_raw directly,
and checking for stack cycles here.
gdb/ChangeLog
gdb/frame.c