summaryrefslogtreecommitdiffstats
path: root/tests
diff options
context:
space:
mode:
authorUlf Hermann <[email protected]>2017-04-20 14:41:35 +0200
committerMark Wielaard <[email protected]>2017-05-02 16:37:51 +0200
commitd8437ed5d62a90d18739bc204b83be14188de00f (patch)
tree2783dc61f5b60e4139ba495cf43e4eed0b90ba16 /tests
parentaecc2a7052f69386109dcf17d92c8396e9067eec (diff)
Add frame pointer unwinding for aarch64 and relax backtrace testcases.
If we don't find any debug information for a given frame, we usually cannot unwind any further. However, the binary in question might have been compiled with frame pointers, in which case we can look up the well known frame pointer locations in the stack snapshot and use them to bridge the frames without debug information. Relax the backtrace core testcases a little by allowing a duplicate sigusr2 frame or a backtrace ending with an invalid register. Both of which can happen if the frame pointer unwinder guesses slightly wrong. Signed-off-by: Ulf Hermann <[email protected]> Signed-off-by: Mark Wielaard <[email protected]>
Diffstat (limited to 'tests')
-rw-r--r--tests/ChangeLog10
-rw-r--r--tests/Makefile.am3
-rw-r--r--tests/backtrace-subr.sh2
-rw-r--r--tests/backtrace.aarch64.fp.core.bz2bin0 -> 8437 bytes
-rw-r--r--tests/backtrace.aarch64.fp.exec.bz2bin0 -> 394972 bytes
-rw-r--r--tests/backtrace.c12
-rwxr-xr-xtests/run-backtrace-fp-core-aarch64.sh28
7 files changed, 54 insertions, 1 deletions
diff --git a/tests/ChangeLog b/tests/ChangeLog
index 81b5f7a2..5b0d486e 100644
--- a/tests/ChangeLog
+++ b/tests/ChangeLog
@@ -1,3 +1,13 @@
+2017-02-13 Ulf Hermann <[email protected]>
+ Mark Wielaard <[email protected]>
+
+ * Makefile.am: Add test for unwinding with frame pointers on aarch64
+ * backtrace.aarch64.fp.core.bz2: New file
+ * backtrace.aarch64.fp.exec.bz2: New file
+ * run-backtrace-fp-core-aarch64.sh: New file
+ * backtrace-subr.sh (check_err): Allow Invalid register.
+ * backtrace.c (callback_verify): Allow duplicate_sigusr2 frames.
+
2017-04-06 Mark Wielaard <[email protected]>
* run-backtrace-fp-core-i386.sh: New test.
diff --git a/tests/Makefile.am b/tests/Makefile.am
index 2c82bfd8..3a12fe3a 100644
--- a/tests/Makefile.am
+++ b/tests/Makefile.am
@@ -116,6 +116,7 @@ TESTS = run-arextract.sh run-arsymtest.sh newfile test-nlist \
run-backtrace-native-biarch.sh run-backtrace-native-core.sh \
run-backtrace-native-core-biarch.sh run-backtrace-core-x86_64.sh \
run-backtrace-fp-core-x86_64.sh \
+ run-backtrace-fp-core-aarch64.sh \
run-backtrace-core-x32.sh \
run-backtrace-core-i386.sh run-backtrace-fp-core-i386.sh \
run-backtrace-core-ppc.sh \
@@ -297,6 +298,8 @@ EXTRA_DIST = run-arextract.sh run-arsymtest.sh \
run-backtrace-core-x86_64.sh run-backtrace-core-i386.sh \
run-backtrace-fp-core-x86_64.sh \
run-backtrace-core-x32.sh \
+ run-backtrace-fp-core-aarch64.sh \
+ backtrace.aarch64.fp.core.bz2 backtrace.aarch64.fp.exec.bz2 \
backtrace-subr.sh backtrace.i386.core.bz2 backtrace.i386.exec.bz2 \
run-backtrace-fp-core-i386.sh \
backtrace.i386.fp.core.bz2 backtrace.i386.fp.exec.bz2 \
diff --git a/tests/backtrace-subr.sh b/tests/backtrace-subr.sh
index a303e32c..9731c43a 100644
--- a/tests/backtrace-subr.sh
+++ b/tests/backtrace-subr.sh
@@ -59,7 +59,7 @@ check_backtracegen()
# Ignore it here as it is a bug of OS, not a bug of elfutils.
check_err()
{
- if [ $(egrep -v <$1 'dwfl_thread_getframes: (No DWARF information found|no matching address range|address out of range)$' \
+ if [ $(egrep -v <$1 'dwfl_thread_getframes: (No DWARF information found|no matching address range|address out of range|Invalid register)$' \
| wc -c) \
-eq 0 ]
then
diff --git a/tests/backtrace.aarch64.fp.core.bz2 b/tests/backtrace.aarch64.fp.core.bz2
new file mode 100644
index 00000000..ff867881
--- /dev/null
+++ b/tests/backtrace.aarch64.fp.core.bz2
Binary files differ
diff --git a/tests/backtrace.aarch64.fp.exec.bz2 b/tests/backtrace.aarch64.fp.exec.bz2
new file mode 100644
index 00000000..9d06db1e
--- /dev/null
+++ b/tests/backtrace.aarch64.fp.exec.bz2
Binary files differ
diff --git a/tests/backtrace.c b/tests/backtrace.c
index 1ff6353c..21abe8af 100644
--- a/tests/backtrace.c
+++ b/tests/backtrace.c
@@ -90,6 +90,10 @@ callback_verify (pid_t tid, unsigned frameno, Dwarf_Addr pc,
return;
}
Dwfl_Module *mod;
+ /* See case 4. Special case to help out simple frame pointer unwinders. */
+ static bool duplicate_sigusr2 = false;
+ if (duplicate_sigusr2)
+ frameno--;
static bool reduce_frameno = false;
if (reduce_frameno)
frameno--;
@@ -125,6 +129,14 @@ callback_verify (pid_t tid, unsigned frameno, Dwarf_Addr pc,
}
/* FALLTHRU */
case 4:
+ /* Some simple frame unwinders get this wrong and think sigusr2
+ is calling itself again. Allow it and just pretend there is
+ an extra sigusr2 frame. */
+ if (symname != NULL && strcmp (symname, "sigusr2") == 0)
+ {
+ duplicate_sigusr2 = true;
+ break;
+ }
assert (symname != NULL && strcmp (symname, "stdarg") == 0);
break;
case 5:
diff --git a/tests/run-backtrace-fp-core-aarch64.sh b/tests/run-backtrace-fp-core-aarch64.sh
new file mode 100755
index 00000000..fda88d37
--- /dev/null
+++ b/tests/run-backtrace-fp-core-aarch64.sh
@@ -0,0 +1,28 @@
+#! /bin/bash
+# Copyright (C) 2017 The Qt Company
+# This file is part of elfutils.
+#
+# This file 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.
+#
+# elfutils 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/>.
+
+. $srcdir/backtrace-subr.sh
+
+# The binary is generated by compiling with eh_frame CFI, but with frame
+# pointers.
+#
+# gcc -static -O2 -fno-omit-frame-pointer -fno-asynchronous-unwind-tables \
+# -D_GNU_SOURCE -pthread -o tests/backtrace.aarch64.fp.exec -I. -Ilib \
+# tests/backtrace-child.c
+# The core is generated by calling the binary with --gencore
+
+check_core aarch64.fp