diff options
Diffstat (limited to 'subsurface.debug')
-rwxr-xr-x | subsurface.debug | 110 |
1 files changed, 110 insertions, 0 deletions
diff --git a/subsurface.debug b/subsurface.debug new file mode 100755 index 000000000..1ad838f7d --- /dev/null +++ b/subsurface.debug @@ -0,0 +1,110 @@ +#!/bin/sh +# +# This is a wrapper script (based on kodi/xbmc script) to monitor subsurface and get debug information using GDB when a crash happens. +# Informations are stored in *.log file in CRASHLOG_DIR ($HOME by default) + +APP=Subsurface +bin_name=subsurface +SAVED_ARGS="$@" +prefix="/usr" +CRASHLOG_DIR=${CRASHLOG_DIR:-$HOME} +APP_VERSION=$(${prefix}/bin/${bin_name} --version) + +command_exists() +{ + command -pv $1 >/dev/null 2>&1 +} + +single_stacktrace() +{ + # core filename is either "core.$PID" or "core" + find "$1" -maxdepth $2 -name 'core*' | while read core; do + LC_ALL=C gdb --core="$core" --batch 2> /dev/null | grep -q "^Core was generated by \`${prefix}/bin/${bin_name}" || continue + echo "=====> Core file: "$core" ($(stat -c%y "$core"))" >> $FILE + echo " =========================================" >> $FILE + gdb "${prefix}/bin/${bin_name}" --core="$core" --batch -ex "thread apply all bt" 2> /dev/null >> $FILE + rm -f "$core" + done +} + +print_crash_report() +{ + FILE="$CRASHLOG_DIR/${bin_name}_crashlog-`date +%Y%m%d_%H%M%S`.log" + echo "############## $APP CRASH LOG ###############" >> $FILE + echo >> $FILE + echo "################ SYSTEM INFO ################" >> $FILE + echo -n " Date: " >> $FILE + LC_ALL=C date >> $FILE + echo " $APP Options: $SAVED_ARGS" >> $FILE + echo " $APP version: $APP_VERSION" >> $FILE + echo -n " Arch: " >> $FILE + uname -m >> $FILE + echo -n " Kernel: " >> $FILE + uname -rvs >> $FILE + echo -n " Release: " >> $FILE + if [ -f /etc/os-release ]; then + . /etc/os-release + echo $NAME $VERSION >> $FILE + elif command_exists lsb_release; then + echo >> $FILE + lsb_release -a 2> /dev/null | sed -e 's/^/ /' >> $FILE + else + echo "lsb_release not available" >> $FILE + fi + echo "############## END SYSTEM INFO ##############" >> $FILE + echo >> $FILE + echo "############### STACK TRACE #################" >> $FILE + if command_exists gdb; then +# TODO: systemd needs more test (systemd-coredumpctl exist on openSUSE 13.1 but does not find any core) +# if command_exists systemd-coredumpctl; then +# systemd-coredumpctl dump -o core ${prefix}/bin/${bin_name} > /dev/null 2>&1 +# elif command_exists coredumpctl; then +# coredumpctl dump -o core ${prefix}/bin/${bin_name} > /dev/null 2>&1 +# fi + # Find in current directory + single_stacktrace "$PWD" 1 + # Find in plugins directories + if [ $KODI_HOME ]; then + BASEDIR=$KODI_HOME + else + BASEDIR="$LIBDIR/${bin_name}/" + fi + single_stacktrace "$BASEDIR" 5 + # find in userdata dir + single_stacktrace "$HOME" 5 + # try /proc/sys/kernel/core_pattern + [ -d "$(dirname $(cat /proc/sys/kernel/core_pattern))" ] && single_stacktrace "$(dirname $(cat /proc/sys/kernel/core_pattern))" 1 + else + echo "gdb not installed, can't get stack trace." >> $FILE + fi + echo "############# END STACK TRACE ###############" >> $FILE + echo >> $FILE + echo "############ END $APP CRASH LOG #############" >> $FILE + echo "Crash report available at $FILE" +} + +if command_exists gdb; then + # Output warning in case ulimit is unsupported by shell + eval ulimit -c unlimited + if [ ! $? = "0" ]; then + echo "${bin_name}: ulimit is unsupported by this shell" 1>&2 + fi +fi + +LOOP=1 +while [ $(( $LOOP )) = "1" ] +do + LOOP=0 + "${prefix}/bin/${bin_name}" $SAVED_ARGS + RET=$? + if [ $(( $RET == 65 )) = "1" ] + then # User requested to restart app + LOOP=1 + elif [ $(( ($RET >= 131 && $RET <= 136) || $RET == 139 )) = "1" ] + then # Crashed with core dump + print_crash_report + fi +# echo "RET = $RET" +done + +exit $RET |