From: Joel Brobecker <brobecker@adacore.com>
To: Tom Tromey <tromey@redhat.com>
Cc: gdb-patches@sourceware.org
Subject: Re: [PATCH 2/2] handle an unspecified return address column
Date: Tue, 26 Nov 2013 13:55:00 -0000 [thread overview]
Message-ID: <20131126133446.GA28596@adacore.com> (raw)
In-Reply-To: <1384375873-32160-3-git-send-email-tromey@redhat.com>
[-- Attachment #1: Type: text/plain, Size: 1667 bytes --]
Hi Tom,
On Wed, Nov 13, 2013 at 01:51:13PM -0700, Tom Tromey wrote:
> Debugging PR 16155 further, I found that the DWARF unwinder found the
> function in question, but thought it had no registers saved
> (fs->regs.num_regs == 0).
>
> It seems to me that if a frame does not specify the return address
> column, or if the return address column is explicitly marked as
> DWARF2_FRAME_REG_UNSPECIFIED, then we should set the
> "undefined_retaddr" flag and let the DWARF unwinder gracefully stop.
>
> This patch implements that idea.
>
> With this patch the backtrace works properly:
>
> (gdb) bt
> #0 0x0000007fb7ed485c in nanosleep () from /lib64/libc.so.6
> #1 0x0000007fb7ed4508 in sleep () from /lib64/libc.so.6
> #2 0x00000000004008bc in thread_function (arg=0x4) at threadapply.c:73
> #3 0x0000007fb7fad950 in start_thread () from /lib64/libpthread.so.0
> #4 0x0000007fb7f0956c in clone () from /lib64/libc.so.6
>
> 2013-11-13 Tom Tromey <tromey@redhat.com>
>
> PR backtrace/16155:
> * dwarf2-frame.c (dwarf2_frame_cache): Set undefined_retaddr if
> the return address column is unspecified.
I just found out that this patch causes some problems on at least
arm-elf and ppc-elf. Attached is a proposed patch, with associated
analysis.
gdb/ChangeLog:
PR backtrace/16155:
* dwarf2-frame.c (dwarf2_frame_cache): Remove condition that
sets cache->undefined_retaddr to 1 if there is no column in
the frame info for the return register.
Tested on x86_64-linux, no regression. It also fixes all regressions
observed on arm-elf and ppc-elf.
Can you tell me what you think?
Thank you!
--
Joel
[-- Attachment #2: 0001-DWARF-cannot-unwind-from-leaf-functions-that-do-not-.patch --]
[-- Type: text/x-diff, Size: 3581 bytes --]
From f01867f9f4fdd55d7692d09ae1d4622968e2bb04 Mon Sep 17 00:00:00 2001
From: Joel Brobecker <brobecker@adacore.com>
Date: Tue, 26 Nov 2013 17:08:03 +0400
Subject: [PATCH] DWARF: cannot unwind from leaf functions that do not touch
the link register
I noticed this problem on arm-eabi and on ppc-elf. Consider this
simple function:
function F return Num is
begin
return 1.0 + 2.0;
end F;
Trying to unwind from it on ppc-elf, no longer works. Consider for
instance the following setup, where we are about to call our function
F above:
(gdb) tar sim -e bug -r 0x400000
(gdb) load x
(gdb) start
[...]
Temporary breakpoint 1, x () at x.adb:4
4 Z : constant Num := F;
At this point, let's see what happens to our backtrace once we've
stepped inside F:
(gdb) s
pck.f () at pck.adb:2
2 function F return Num is
(gdb) bt
#0 pck.f () at pck.adb:2
As you can see, the backtrace is truncated. We're missing the frame
corresponding to the main subprogram "x".
This is due to a recent change, which added the following check:
+ else if (fs->retaddr_column >= fs->regs.num_regs
+ || (fs->regs.reg[fs->retaddr_column].how
+ == DWARF2_FRAME_REG_UNSPECIFIED))
+ cache->undefined_retaddr = 1;
The rationale was:
It seems to me that if a frame does not specify the return address
column, or if the return address column is explicitly marked as
DWARF2_FRAME_REG_UNSPECIFIED, then we should set the
"undefined_retaddr" flag and let the DWARF unwinder gracefully stop.
In our case, we're tripping the first half of the condition.
Looking at the frame info with readelf, for instance, we see:
| 00000000 0000000c ffffffff CIE "" cf=4 df=-4 ra=65
| LOC CFA
| 00000000 r1+0
|
| 00000010 00000020 00000000 FDE cie=00000000 pc=00000000..0000002c
| LOC CFA r31
| 00000000 r1+0 u
| 00000004 r1+16 u
| [etc]
Here, the return address register is number 65, and there is no
column for it. I think that this meant to be decoded as "ra never
changes throughout the lifetime of the function, so no column
needed for it in the CFI". Regardless of correctness, this appears
to be a practice that's established enough that we should handle it
gracefully, as we used to.
This patch therefore changes a bit the logic to remove the part
of the condition that would cause the unwinding to terminate when
the CFI has no column corresponding to the return address register.
gdb/ChangeLog:
PR backtrace/16155:
* dwarf2-frame.c (dwarf2_frame_cache): Remove condition that
sets cache->undefined_retaddr to 1 if there is no column in
the frame info for the return register.
---
gdb/dwarf2-frame.c | 8 +++-----
1 file changed, 3 insertions(+), 5 deletions(-)
diff --git a/gdb/dwarf2-frame.c b/gdb/dwarf2-frame.c
index f185ca6..9e9c32b 100644
--- a/gdb/dwarf2-frame.c
+++ b/gdb/dwarf2-frame.c
@@ -1243,11 +1243,9 @@ incomplete CFI data; unspecified registers (e.g., %s) at %s"),
}
if (fs->retaddr_column < fs->regs.num_regs
- && fs->regs.reg[fs->retaddr_column].how == DWARF2_FRAME_REG_UNDEFINED)
- cache->undefined_retaddr = 1;
- else if (fs->retaddr_column >= fs->regs.num_regs
- || (fs->regs.reg[fs->retaddr_column].how
- == DWARF2_FRAME_REG_UNSPECIFIED))
+ && (fs->regs.reg[fs->retaddr_column].how == DWARF2_FRAME_REG_UNDEFINED
+ || (fs->regs.reg[fs->retaddr_column].how
+ == DWARF2_FRAME_REG_UNSPECIFIED)))
cache->undefined_retaddr = 1;
do_cleanups (old_chain);
--
1.8.1.2
next prev parent reply other threads:[~2013-11-26 13:35 UTC|newest]
Thread overview: 31+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-11-13 20:51 [PATCH 0/2] fix multi-threaded unwinding on AArch64 Tom Tromey
2013-11-13 20:51 ` [PATCH 2/2] handle an unspecified return address column Tom Tromey
2013-11-22 18:22 ` Tom Tromey
2013-11-26 13:55 ` Joel Brobecker [this message]
2013-11-26 14:30 ` Mark Kettenis
2013-11-26 14:37 ` Joel Brobecker
2013-11-26 14:41 ` Mark Kettenis
2013-11-26 14:42 ` Joel Brobecker
2013-11-26 14:50 ` Tom Tromey
2013-11-26 15:05 ` Tom Tromey
2013-11-26 15:16 ` Tom Tromey
2013-11-26 16:11 ` Joel Brobecker
2013-11-13 22:03 ` [PATCH 1/2] avoid infinite loop with bad debuginfo Tom Tromey
2013-11-14 17:34 ` Pedro Alves
2013-11-18 18:25 ` Tom Tromey
2013-11-19 15:10 ` Pedro Alves
2013-11-19 15:47 ` Tom Tromey
2013-11-19 16:33 ` Pedro Alves
2013-11-19 19:07 ` Tom Tromey
2013-11-19 20:24 ` Pedro Alves
2013-11-19 20:56 ` Tom Tromey
2013-11-20 18:27 ` [PATCH] Don't let two frames with the same id end up in the frame chain. (Re: [PATCH 1/2] avoid infinite loop with bad debuginfo) Pedro Alves
2013-11-21 0:33 ` Tom Tromey
2013-11-21 16:40 ` Pedro Alves
2013-11-21 19:25 ` Tom Tromey
2013-11-22 14:13 ` [COMMITTED] Make use of the frame stash to detect wider stack cycles. (was: Re: [PATCH] Don't let two frames with the same id end up in the frame chain. (Re: [PATCH 1/2] avoid infinite loop with bad debuginfo)) Pedro Alves
2013-11-22 14:29 ` [PATCH] Don't let two frames with the same id end up in the frame chain. (Re: [PATCH 1/2] avoid infinite loop with bad debuginfo) Pedro Alves
2013-11-22 14:52 ` [PATCH 1/2] avoid infinite loop with bad debuginfo Pedro Alves
2013-11-22 17:16 ` Tom Tromey
2013-11-22 17:56 ` Pedro Alves
2013-11-19 15:52 ` Tom Tromey
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20131126133446.GA28596@adacore.com \
--to=brobecker@adacore.com \
--cc=gdb-patches@sourceware.org \
--cc=tromey@redhat.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox