summaryrefslogtreecommitdiffstats
path: root/tools/Linux/kodi.sh.in
diff options
context:
space:
mode:
Diffstat (limited to 'tools/Linux/kodi.sh.in')
-rw-r--r--tools/Linux/kodi.sh.in192
1 files changed, 192 insertions, 0 deletions
diff --git a/tools/Linux/kodi.sh.in b/tools/Linux/kodi.sh.in
new file mode 100644
index 0000000..11cace2
--- /dev/null
+++ b/tools/Linux/kodi.sh.in
@@ -0,0 +1,192 @@
+#!/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}
+KODI_DATA=${KODI_DATA:-"${HOME}/.${bin_name}"} # mapped to special://home/
+
+# 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
+ ;;
+ *)
+ shift
+ ;;
+ esac
+done
+
+KODI_BINARY=${APP_BINARY}
+
+if [ ! -x ${KODI_BINARY} ]; then
+ echo "Error: ${KODI_BINARY} not found"
+ exit 2
+fi
+
+APPORT_CORE="/var/crash/$(echo -n ${KODI_BINARY}|tr / _).$(id -u).crash"
+
+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
+ elif command_exists apport-unpack && test -f "${APPORT_CORE}"; then
+ TMP_DIR="$(mktemp -d -p ${HOME})"
+ if [ -d "${TMP_DIR}" ]; then
+ rm -f "${HOME}/core"
+ apport-unpack "${APPORT_CORE}" "${TMP_DIR}"
+ mv "${TMP_DIR}/CoreDump" "${HOME}/core"
+ rm -rf "${TMP_DIR}"
+ fi
+ 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 $KODI_TEMP/@APP_NAME_LC@.log ]
+ then
+ cat $KODI_TEMP/@APP_NAME_LC@.log >> $FILE
+ echo >> $FILE
+ elif [ -f $KODI_DATA/temp/@APP_NAME_LC@.log ]
+ then
+ cat $KODI_DATA/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"
+}
+
+propagate_sigterm() {
+ kill -TERM "$CHILD" 2>/dev/null
+}
+
+trap propagate_sigterm TERM
+
+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
+ [ -f "${APPORT_CORE}" ] && rm -f "${APPORT_CORE}"
+ LOOP=0
+ ${KODI_BINARY} $SAVED_ARGS &
+ CHILD=$!
+ wait "${CHILD}"
+ RET=$?
+ if [ $RET -eq 65 ]
+ then # User requested to restart app
+ LOOP=1
+ elif [ $RET -ge 131 ] && [ $RET -le 136 ] || [ $RET -eq 139 ]
+ then # Crashed with core dump
+ print_crash_report
+ fi
+done
+
+exit $RET