libunwind-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Libunwind-devel] [PATCH 3/5] MiniDebugInfo test: tests/run-coredump-unw


From: Martin Milata
Subject: [Libunwind-devel] [PATCH 3/5] MiniDebugInfo test: tests/run-coredump-unwind-mdi
Date: Fri, 10 Aug 2012 16:03:55 +0200

Test that creates MiniDebugInfo-containing binary and then checks if it
can recover the procedure names from its coredump.

Signed-off-by: Martin Milata <address@hidden>
---
 tests/Makefile.am             |    7 ++++++-
 tests/run-coredump-unwind     |   39 ++++++++++++++++++++++++++++++++++++++-
 tests/run-coredump-unwind-mdi |    8 ++++++++
 tests/test-coredump-unwind.c  |    2 +-
 4 files changed, 53 insertions(+), 3 deletions(-)
 create mode 100755 tests/run-coredump-unwind-mdi

diff --git a/tests/Makefile.am b/tests/Makefile.am
index 9dd9a76..40f3185 100644
--- a/tests/Makefile.am
+++ b/tests/Makefile.am
@@ -2,7 +2,8 @@ AM_CPPFLAGS = -I$(top_srcdir)/include
 
 EXTRA_DIST =   run-ia64-test-dyn1 run-ptrace-mapper run-ptrace-misc    \
                run-check-namespace run-coredump-unwind \
-               check-namespace.sh.in Gtest-nomalloc.c Gtest-nocalloc.c
+               run-coredump-unwind-mdi check-namespace.sh.in \
+               Gtest-nomalloc.c Gtest-nocalloc.c
 
 MAINTAINERCLEANFILES = Makefile.in
 
@@ -60,6 +61,10 @@ endif
 if OS_LINUX
  check_SCRIPTS_cdep += run-coredump-unwind
  noinst_PROGRAMS_cdep += test-coredump-unwind
+
+if HAVE_LZMA
+ check_SCRIPTS_cdep += run-coredump-unwind-mdi
+endif
 endif
 
 perf: perf-startup Gperf-simple Lperf-simple Lperf-trace
diff --git a/tests/run-coredump-unwind b/tests/run-coredump-unwind
index d6dd7e0..8d07742 100755
--- a/tests/run-coredump-unwind
+++ b/tests/run-coredump-unwind
@@ -1,14 +1,51 @@
 #!/bin/sh
 
+# this function is slight modification of the one used in RPM
+# found at https://bugzilla.redhat.com/show_bug.cgi?id=834073
+# written by Alexander Larsson <address@hidden>
+add_minidebug()
+{
+  debuginfo="$1" ## we don't have separate debuginfo file
+  binary="$1"
+
+  dynsyms=`mktemp`
+  funcsyms=`mktemp`
+  keep_symbols=`mktemp`
+  mini_debuginfo=`mktemp`
+
+  # Extract the dynamic symbols from the main binary, there is no need to also 
have these
+  # in the normal symbol table
+  nm -D "$binary" --format=posix --defined-only | awk '{ print $1 }' | sort > 
"$dynsyms"
+  # Extract all the text (i.e. function) symbols from the debuginfo 
+  nm "$debuginfo" --format=posix --defined-only | awk '{ if ($2 == "T" || $2 
== "t") print $1 }' | sort > "$funcsyms"
+  # Keep all the function symbols not already in the dynamic symbol table
+  comm -13 "$dynsyms" "$funcsyms" > "$keep_symbols"
+  # Copy the full debuginfo, keeping only a minumal set of symbols and 
removing some unnecessary sections
+  objcopy -S --remove-section .gdb_index --remove-section .comment 
--keep-symbols="$keep_symbols" "$debuginfo" "$mini_debuginfo" &> /dev/null
+  #Inject the compressed data into the .gnu_debugdata section of the original 
binary
+  xz "$mini_debuginfo"
+  mini_debuginfo="${mini_debuginfo}.xz"
+  objcopy --add-section .gnu_debugdata="$mini_debuginfo" "$binary"
+  rm -f "$dynsyms" "$funcsyms" "$keep_symbols" "$mini_debuginfo"
+
+  strip "$binary" ## throw away the symbol table
+}
+
+
 TESTDIR=`pwd`
 TEMPDIR=`mktemp --tmpdir -d libunwind-test-XXXXXXXXXX`
 trap "rm -r -- $TEMPDIR" EXIT
 
+cp crasher $TEMPDIR/crasher
+if [ "$1" = "-minidebuginfo" ]; then
+  add_minidebug $TEMPDIR/crasher
+fi
+
 # create core dump
 (
     cd $TEMPDIR
     ulimit -c 10000
-    $TESTDIR/crasher $TEMPDIR/backing_files
+    ./crasher backing_files
 ) 2>/dev/null
 COREFILE=$TEMPDIR/core*
 
diff --git a/tests/run-coredump-unwind-mdi b/tests/run-coredump-unwind-mdi
new file mode 100755
index 0000000..6b7f0c1
--- /dev/null
+++ b/tests/run-coredump-unwind-mdi
@@ -0,0 +1,8 @@
+#!/bin/sh
+
+# This test intends to test the unw_get_proc_name function on binaries without
+# the symbol table but with so called MiniDebuginfo available. In particular,
+# it is tested using the coredump accessors. For more info about MiniDebugInfo
+# see e.g. http://fedoraproject.org/wiki/Features/MiniDebugInfo
+
+./run-coredump-unwind -minidebuginfo
diff --git a/tests/test-coredump-unwind.c b/tests/test-coredump-unwind.c
index 2b2d4b9..6e62b8d 100644
--- a/tests/test-coredump-unwind.c
+++ b/tests/test-coredump-unwind.c
@@ -269,7 +269,7 @@ main(int argc, char **argv)
   int ret;
 
 #define TEST_FRAMES 4
-#define TEST_NAME_LEN 16
+#define TEST_NAME_LEN 32
   int testcase = 0;
   int test_cur = 0;
   long test_start_ips[TEST_FRAMES];
-- 
1.7.7.6




reply via email to

[Prev in Thread] Current Thread [Next in Thread]