#!/bin/sh # Copyright (C) 2008-2017 Team XBMC # http://kodi.tv # # This Program 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 2, or (at your option) # any later version. # # This Program 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 XBMC; see the file COPYING. If not, write to # the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. # http://www.gnu.org/copyleft/gpl.html APP=@APP_NAME@ bin_name=@APP_NAME_LC@ SAVED_ARGS="$@" prefix="@prefix@" exec_prefix="@exec_prefix@" datarootdir="@datarootdir@" LIBDIR="@libdir@" APP_BINARY=$LIBDIR/${bin_name}/@APP_BINARY@ CRASHLOG_DIR=${CRASHLOG_DIR:-$HOME} USERDATA_DIR="${HOME}/.${bin_name}" WINDOWING=${WINDOWING:-"auto"} # Workaround for high CPU load with nvidia GFX export __GL_YIELD=USLEEP # Fix wasting RAM due to fragmentation export MALLOC_MMAP_THRESHOLD_=131072 # Check for some options used by this script while [ "$#" -gt "0" ] do case "$1" in --setlibdir) LIBDIR="$2" shift; shift ;; --windowing) WINDOWING="$2" echo "$SAVED_ARGS" | sed "s/--windowing[ ]*$2//g" shift; shift ;; *) shift ;; esac done # Note: by default only one of those binaries exists # To be able to select a different one, if has to be compiled specifically # Your distribution might provide extra packages for those if [ "$WINDOWING" = "auto" ]; then # Wayland if [ -n "$WAYLAND_DISPLAY" ] && [ -x $LIBDIR/${bin_name}/${bin_name}-wayland ]; then KODI_BINARY=$LIBDIR/${bin_name}/${bin_name}-wayland # X11 elif echo $DISPLAY | grep -qE ":[0-9]+" && [ -x $LIBDIR/${bin_name}/${bin_name}-x11 ]; then KODI_BINARY=$LIBDIR/${bin_name}/${bin_name}-x11 # GBM/DRM elif [ -z "$DISPLAY" ] && [ -z "$WAYLAND_DISPLAY" ] && [ -x $LIBDIR/${bin_name}/${bin_name}-gbm ]; then KODI_BINARY=$LIBDIR/${bin_name}/${bin_name}-gbm # Default kodi.bin else KODI_BINARY=${APP_BINARY} fi elif [ -n "$WINDOWING" ]; then KODI_BINARY=$LIBDIR/${bin_name}/${bin_name}-${WINDOWING} else KODI_BINARY=${APP_BINARY} fi if [ ! -x ${KODI_BINARY} ]; then echo "Error: ${KODI_BINARY} not found" exit 2 fi migrate_home() { [ "$(basename $0)" = "xbmc" ] && echo "WARNING: Running ${bin_name} as "xbmc" is deprecated and will be removed in later versions, please switch to using the ${bin_name} binary" #check if data migration is needed if [ -d "${HOME}/.xbmc" ] && [ ! -d "${USERDATA_DIR}" ]; then echo "INFO: migrating userdata folder. Renaming ${HOME}/.xbmc to $USERDATA_DIR" mv ${HOME}/.xbmc $USERDATA_DIR touch ${USERDATA_DIR}/.kodi_data_was_migrated fi } 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 \`${KODI_BINARY}" || continue echo "=====> Core file: "$core" ($(stat -c%y "$core"))" >> $FILE echo " =========================================" >> $FILE gdb "${KODI_BINARY}" --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 printf " Date: " >> $FILE date >> $FILE echo " $APP Options: $*" >> $FILE printf " Arch: " >> $FILE uname -m >> $FILE printf " Kernel: " >> $FILE uname -rvs >> $FILE printf " 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 if command_exists systemd-coredumpctl; then systemd-coredumpctl dump -o core $(basename ${KODI_BINARY}) > /dev/null 2>&1 elif command_exists coredumpctl; then coredumpctl dump -o core $(basename ${KODI_BINARY}) > /dev/null 2>&1 fi 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 # Check if it does not contain a pipe to a program (see man 5 core) if [ "$(cat /proc/sys/kernel/core_pattern | cut -c 1)" != "|" ]; then [ -d "$(dirname $(cat /proc/sys/kernel/core_pattern))" ] && single_stacktrace "$(dirname $(cat /proc/sys/kernel/core_pattern))" 1 fi else echo "gdb not installed, can't get stack trace." >> $FILE fi echo "############# END STACK TRACE ###############" >> $FILE echo >> $FILE echo "################# LOG FILE ##################" >> $FILE echo >> $FILE if [ -f $USERDATA_DIR/temp/@APP_NAME_LC@.log ] then cat $USERDATA_DIR/temp/@APP_NAME_LC@.log >> $FILE echo >> $FILE else echo "Logfile not found in the usual place." >> $FILE echo "Please attach it separately." >> $FILE echo "Use pastebin.com or similar for forums or IRC." >> $FILE fi echo >> $FILE echo "############### END LOG FILE ################" >> $FILE echo >> $FILE echo "############ END $APP CRASH LOG #############" >> $FILE echo "Crash report available at $FILE" } migrate_home 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 ${KODI_BINARY} $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 done exit $RET