Package: libc-bin
Version: 2.29-3
Severity: wishlist
Tags: upstream patch

Dear Maintainer,
since upstream commit in 2012 [1] the function __backtrace_symbols_fd
seems to outputs in one of this formats:

    program(+<offset>)[<address>]
    program(function+<offset>)[<address>]

Therefore the /usr/bin/catchsegv cannot find the backtrace lines
and produces less useful outputs (see below)

There exists an upstream bug about the issue [2].

Attached patch is an attempt to parse the offset instead of the
address, which seems now less important due to ASLR.


Known symbols are currently written by __backtrace_symbols_fd
as such with the offset in relation to the function instead
of the library section.
To get for these also sourcefile and line information
either __backtrace_symbols_fd needs to be changed to
output the library section offset to the backtrace too,
or addr2line (binutils) needs a change to lookup the symbol and
calculate from there, but both would be different issues.

What do you think?

Kind regards,
Bernhard


Current:
Backtrace:
/tmp/tmp.sSrfzsTKpn/3-options-input-fn(+0x175b)[0x557275eb775b]
/lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xeb)[0x7f4f8194ebbb]
/tmp/tmp.sSrfzsTKpn/3-options-input-fn(+0x11ba)[0x557275eb71ba]


With proposed changes:
Backtrace:
 [0x5578ceb0575b] main at 
/usr/share/doc/libsoxr-dev/examples/3-options-input-fn.c:79 (discriminator 4) 
/tmp/tmp.sSrfzsTKpn/3-options-input-fn(+0x175b)
 /lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xeb)[0x7fcf5f243bbb]
 [0x5578ceb051ba] _start at ??:? /tmp/tmp.sSrfzsTKpn/3-options-input-fn(+0x11ba)


[1] 
https://sourceware.org/git/?p=glibc.git;a=commit;h=1d6c3d237d10606121c959b9bd2ae722f79ea899
[2] https://sourceware.org/bugzilla/show_bug.cgi?id=21830



-- System Information:
Debian Release: bullseye/sid
  APT prefers testing-debug
  APT policy: (500, 'testing-debug'), (500, 'proposed-updates-debug'), (500, 
'testing')
Architecture: amd64 (x86_64)

Kernel: Linux 5.3.0-2-amd64 (SMP w/12 CPU cores)
Locale: LANG=de_DE.UTF-8, LC_CTYPE=de_DE.UTF-8 (charmap=UTF-8), 
LANGUAGE=de_DE.UTF-8 (charmap=UTF-8)
Shell: /bin/sh linked to /usr/bin/dash
Init: systemd (via /run/systemd/system)
LSM: AppArmor: enabled

Versions of packages libc-bin depends on:
ii  libc6  2.29-3

Versions of packages libc-bin recommends:
ii  manpages  5.04-1

libc-bin suggests no packages.

-- no debconf information
>From fca03cd9af5ffaea1e4968fa27a7b28ee80903ef Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Bernhard=20=C3=9Cbelacker?= <bernha...@mailbox.org>
Date: Wed, 11 Dec 2019 19:56:39 +0100
Subject: Make catchsegv work again after format changed.

https://sourceware.org/bugzilla/show_bug.cgi?id=21830
---
 debug/catchsegv.sh | 34 +++++++++++++++++++++++-----------
 1 file changed, 23 insertions(+), 11 deletions(-)

diff --git a/debug/catchsegv.sh b/debug/catchsegv.sh
index 245c100f..da87122c 100755
--- a/debug/catchsegv.sh
+++ b/debug/catchsegv.sh
@@ -87,18 +87,30 @@ if test -s "$segv_output"; then
   sed '/Backtrace/q' "$segv_output"
   sed '1,/Backtrace/d' "$segv_output" |
   (while read line; do
-     line=`echo $line | sed "s@^$prog\\(\\[.*\\)@\1@"`
      case "$line" in
-       \[*) addr=`echo "$line" | sed 's/^\[\(.*\)\]$/\1/'`
-	    complete=`addr2line -f -e "$prog" $addr 2>/dev/null`
-	    if test $? -eq 0; then
-	      echo "`echo "$complete"|sed 'N;s/\(.*\)\n\(.*\)/\2(\1)/;'`$line"
-	    else
-	      echo "$line"
-	    fi
-	    ;;
-	 *) echo "$line"
-	    ;;
+       *\(*\)\[*\])
+         lib=`echo $line  | sed "s@^\(.*\)(\(.*\))\[\(.*\)\]\\$@\1@"`
+         offs=`echo $line | sed "s@^\(.*\)(\(.*\))\[\(.*\)\]\\$@\2@"`
+         addr=`echo $line | sed "s@^\(.*\)(\(.*\))\[\(.*\)\]\\$@\3@"`
+         case "$offs" in
+           +*) case "$prog" in
+                 */$lib)
+                   lib="$prog"
+                   ;;
+               esac
+               complete=`addr2line -p -i -f -e "$lib" $offs 2>/dev/null`
+               if test $? -eq 0; then
+                 echo " [$addr] $complete $lib($offs)"
+               else
+                 echo " $line"
+               fi
+               ;;
+             *) echo " $line"
+                ;;
+         esac
+         ;;
+        *) echo "$line"
+           ;;
      esac
    done)
 fi
-- 
2.24.0

Reply via email to