diff --git a/packages/mediacenter/kodi/package.mk b/packages/mediacenter/kodi/package.mk index 7950d8aa28..16252c28ac 100644 --- a/packages/mediacenter/kodi/package.mk +++ b/packages/mediacenter/kodi/package.mk @@ -422,6 +422,7 @@ post_makeinstall_target() { mkdir -p $INSTALL/usr/lib/kodi cp $PKG_DIR/scripts/kodi-config $INSTALL/usr/lib/kodi + cp $PKG_DIR/scripts/kodi.sh $INSTALL/usr/lib/kodi cp $PKG_DIR/scripts/kodi-hacks $INSTALL/usr/lib/kodi cp $PKG_DIR/scripts/kodi-sources $INSTALL/usr/lib/kodi # TODO: remove this later: diff --git a/packages/mediacenter/kodi/scripts/kodi.sh b/packages/mediacenter/kodi/scripts/kodi.sh new file mode 100755 index 0000000000..d5663bebca --- /dev/null +++ b/packages/mediacenter/kodi/scripts/kodi.sh @@ -0,0 +1,100 @@ +#!/bin/sh +# Copyright (C) 2008-2013 Team XBMC +# http://xbmc.org +# +# 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. + +. /etc/profile + +trap cleanup TERM + +SAVED_ARGS="$@" +CRASHLOG_DIR=/storage/.kodi/temp + +cleanup() { + # make systemd happy by not exiting immediately but + # wait for kodi to exit + while killall -0 kodi.bin &>/dev/null; do + sleep 0.5 + done +} + +command_exists() +{ + command -v $1 &>/dev/null +} + +single_stacktrace() +{ + # core filename is "core.*kodi.bin.*" + find "$1" -name 'core.*kodi.bin.*' | while read core; do + echo "=====> Core file: "$core"" >> $FILE + echo " =========================================" >> $FILE + gdb /usr/lib/kodi/kodi.bin --core="$core" --batch -ex "thread apply all bt" 2>/dev/null >> $FILE + rm -f "$core" + done +} + +print_crash_report() +{ + if [ ! -d $CRASHLOG_DIR ] ; then + mkdir -p $CRASHLOG_DIR + fi + FILE="$CRASHLOG_DIR/kodi_crashlog.log" + echo "############## kodi CRASH LOG ###############" > $FILE + echo >> $FILE + echo "################ SYSTEM INFO ################" >> $FILE + echo -n " Date: " >> $FILE + date >> $FILE + echo " kodi Options: $SAVED_ARGS" >> $FILE + echo -n " Arch: " >> $FILE + uname -m >> $FILE + echo -n " Kernel: " >> $FILE + uname -rvs >> $FILE + echo -n " Release: " >> $FILE + . /etc/os-release + echo $NAME $VERSION >> $FILE + echo "############## END SYSTEM INFO ##############" >> $FILE + echo >> $FILE + echo "############### STACK TRACE #################" >> $FILE + if command_exists gdb; then + single_stacktrace /storage/.cache/cores + 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 + cat /storage/.kodi/temp/kodi.log >> $FILE + echo >> $FILE + echo "############### END LOG FILE ################" >> $FILE + echo >> $FILE + echo "############ END kodi CRASH LOG #############" >> $FILE + echo "Crash report available at $FILE" +} + +if command_exists gdb; then + ulimit -c unlimited +fi + +# clean up any stale cores. just in case +rm -f /storage/.cache/cores/* + +/usr/lib/kodi/kodi.bin $SAVED_ARGS +RET=$? + +if [ $(( ($RET >= 131 && $RET <= 136) || $RET == 139 )) = "1" ] ; then + # Crashed with core dump + print_crash_report +fi + +exit $RET diff --git a/packages/mediacenter/kodi/system.d/kodi.service b/packages/mediacenter/kodi/system.d/kodi.service index 9c1d214955..e34b9e8fd0 100644 --- a/packages/mediacenter/kodi/system.d/kodi.service +++ b/packages/mediacenter/kodi/system.d/kodi.service @@ -10,9 +10,8 @@ Environment=HOME=/storage EnvironmentFile=-/run/openelec/kodi.conf EnvironmentFile=-/run/openelec/debug/kodi.conf ExecStartPre=-/usr/lib/kodi/kodi-config -ExecStart=/bin/sh -c ". /etc/profile; exec /usr/lib/kodi/kodi.bin --standalone -fs $KODI_ARGS $KODI_DEBUG" -# keep KillMode=process unless there is no good reason to switch to cgroup -KillMode=process +ExecStart=/usr/lib/kodi/kodi.sh --standalone -fs $KODI_ARGS $KODI_DEBUG +ExecStop=/bin/kill -TERM $MAINPID TimeoutStopSec=5 Restart=always RestartSec=2 diff --git a/packages/sysutils/busybox/sysctl.d/99-coredump.conf b/packages/sysutils/busybox/sysctl.d/99-coredump.conf new file mode 100644 index 0000000000..aa33f5f593 --- /dev/null +++ b/packages/sysutils/busybox/sysctl.d/99-coredump.conf @@ -0,0 +1 @@ +kernel.core_pattern=/storage/.cache/cores/core.%E.%t.%p diff --git a/packages/sysutils/busybox/tmpfiles.d/z_01_busybox.conf b/packages/sysutils/busybox/tmpfiles.d/z_01_busybox.conf index 17364034d9..35f0305c6d 100644 --- a/packages/sysutils/busybox/tmpfiles.d/z_01_busybox.conf +++ b/packages/sysutils/busybox/tmpfiles.d/z_01_busybox.conf @@ -21,4 +21,5 @@ d /var/media 0755 root root - - f /var/run/utmp 1777 root root - - d /storage/.update 0755 root root - - +d /storage/.cache/cores 0755 root root - - d /storage/.cache/services 0755 root root - - diff --git a/projects/Generic/linux/linux.i386.conf b/projects/Generic/linux/linux.i386.conf index 20a7821950..b100832a40 100644 --- a/projects/Generic/linux/linux.i386.conf +++ b/projects/Generic/linux/linux.i386.conf @@ -173,6 +173,7 @@ CONFIG_KALLSYMS=y # CONFIG_KALLSYMS_ALL is not set CONFIG_PRINTK=y CONFIG_BUG=y +CONFIG_ELF_CORE=y # CONFIG_PCSPKR_PLATFORM is not set CONFIG_BASE_FULL=y CONFIG_FUTEX=y @@ -640,11 +641,12 @@ CONFIG_AMD_NB=y # CONFIG_BINFMT_ELF=y CONFIG_ARCH_BINFMT_ELF_RANDOMIZE_PIE=y +CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS=y CONFIG_BINFMT_SCRIPT=y CONFIG_HAVE_AOUT=y # CONFIG_BINFMT_AOUT is not set CONFIG_BINFMT_MISC=y -# CONFIG_COREDUMP is not set +CONFIG_COREDUMP=y CONFIG_HAVE_ATOMIC_IOMAP=y CONFIG_IOSF_MBI=m CONFIG_PMC_ATOM=y diff --git a/projects/Generic/linux/linux.x86_64.conf b/projects/Generic/linux/linux.x86_64.conf index eb69c379d2..e9520ccc12 100644 --- a/projects/Generic/linux/linux.x86_64.conf +++ b/projects/Generic/linux/linux.x86_64.conf @@ -187,6 +187,7 @@ CONFIG_KALLSYMS=y # CONFIG_KALLSYMS_ALL is not set CONFIG_PRINTK=y CONFIG_BUG=y +CONFIG_ELF_CORE=y # CONFIG_PCSPKR_PLATFORM is not set CONFIG_BASE_FULL=y CONFIG_FUTEX=y @@ -623,10 +624,11 @@ CONFIG_AMD_NB=y CONFIG_BINFMT_ELF=y CONFIG_COMPAT_BINFMT_ELF=y CONFIG_ARCH_BINFMT_ELF_RANDOMIZE_PIE=y +CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS=y CONFIG_BINFMT_SCRIPT=y # CONFIG_HAVE_AOUT is not set CONFIG_BINFMT_MISC=y -# CONFIG_COREDUMP is not set +CONFIG_COREDUMP=y CONFIG_IA32_EMULATION=y # CONFIG_IA32_AOUT is not set # CONFIG_X86_X32 is not set diff --git a/projects/RPi/linux/linux.arm.conf b/projects/RPi/linux/linux.arm.conf index 197163da2c..ad86a83c61 100644 --- a/projects/RPi/linux/linux.arm.conf +++ b/projects/RPi/linux/linux.arm.conf @@ -147,6 +147,7 @@ CONFIG_KALLSYMS=y # CONFIG_KALLSYMS_ALL is not set CONFIG_PRINTK=y CONFIG_BUG=y +CONFIG_ELF_CORE=y CONFIG_BASE_FULL=y CONFIG_FUTEX=y CONFIG_EPOLL=y @@ -482,10 +483,11 @@ CONFIG_VFP=y # CONFIG_BINFMT_ELF=y CONFIG_ARCH_BINFMT_ELF_RANDOMIZE_PIE=y +CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS=y CONFIG_BINFMT_SCRIPT=y # CONFIG_HAVE_AOUT is not set # CONFIG_BINFMT_MISC is not set -# CONFIG_COREDUMP is not set +CONFIG_COREDUMP=y # # Power management options diff --git a/projects/imx6/linux/linux.arm.conf b/projects/imx6/linux/linux.arm.conf index db3f148065..ce89ef8658 100644 --- a/projects/imx6/linux/linux.arm.conf +++ b/projects/imx6/linux/linux.arm.conf @@ -143,6 +143,7 @@ CONFIG_KALLSYMS=y # CONFIG_KALLSYMS_ALL is not set CONFIG_PRINTK=y CONFIG_BUG=y +CONFIG_ELF_CORE=y CONFIG_BASE_FULL=y CONFIG_FUTEX=y CONFIG_EPOLL=y @@ -584,10 +585,11 @@ CONFIG_KERNEL_MODE_NEON=y # CONFIG_BINFMT_ELF=y CONFIG_ARCH_BINFMT_ELF_RANDOMIZE_PIE=y +CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS=y CONFIG_BINFMT_SCRIPT=y # CONFIG_HAVE_AOUT is not set # CONFIG_BINFMT_MISC is not set -# CONFIG_COREDUMP is not set +CONFIG_COREDUMP=y # # Power management options