#!/bin/sh ### Rozhuk Ivan 2020-2022 ### coredumper.sh ### APP_CORE_IGNORE='conftest jmtpfs' _CORES_DIR=`sysctl -n kern.corefile | xargs dirname` # Look for lldb in system. for __LLDB in '/usr/bin/lldb' /usr/local/bin/lldb1* /usr/local/bin/lldb2* ; do if [ -e "${__LLDB}" ]; then break; fi done # Process core files. for __FILE in `find "${_CORES_DIR}" -name '*.core*' -maxdepth 1 -type f | sort -u`; do echo '==========================================================' echo -n "Found core: ${__FILE}: " date -r "${__FILE}" # Skip files from app ignore list. # Will return 'python2' for 'python2.7'... _CORE_APP_NAME_PART=`basename "${__FILE}" | cut -f1 -d '.'` if echo "${APP_CORE_IGNORE}" | grep -q "${_CORE_APP_NAME_PART}" ; then echo "SKIP for ${__FILE}" rm -f "${__FILE}" continue fi # Upack if required. _CORE_FILE_EXT=`basename "${__FILE}" | rev | cut -f1 -d '.' | rev` if [ 'gz' == "${_CORE_FILE_EXT}" ]; then echo -n "Unpacking..." gunzip --force --keep --decompress "${__FILE}" echo "done" _UNPACKED_FILE=`echo -n "${__FILE}" | sed -e "s|\.${_CORE_FILE_EXT}$||"` _CORE_FILE="${_UNPACKED_FILE}" else _UNPACKED_FILE='' _CORE_FILE="${__FILE}" fi # Extract app file name. _CORE_APP_FILE=`procstat -b "${_CORE_FILE}" | tail -1 | xargs | cut -d' ' -f4-` if [ -z ${_CORE_APP_FILE} ]; then echo "procstat failed, skip core file: ${_CORE_FILE}." rm -f "${_UNPACKED_FILE}" continue fi if [ "${_CORE_APP_FILE}" == '-' ]; then echo "procstat failed get app file name, fallback to old code." _CORE_APP_FILE=`strings ${_CORE_FILE} | grep ^/ | grep ${_CORE_APP_NAME_PART} | tail -1` fi #_CORE_APP_FILE=`file "${_CORE_FILE}" | sed -e 's|.*, from .||' -e 's| .*$||'` echo "App file name: ${_CORE_APP_FILE}" # Command line. echo -n "Command line: " procstat -c "${_CORE_FILE}" | tail -1 | xargs | cut -d' ' -f3- # Enviroment. echo -n "Env: " procstat -e "${_CORE_FILE}" | tail -1 | xargs | cut -d' ' -f3- echo # Resource usage. echo "Resource usage" procstat -r "${_CORE_FILE}" echo # Extract info. while true; do if [ ! -r "${_CORE_APP_FILE}" ]; then echo "App file name: ${_CORE_APP_FILE} - not found." break; fi if [ -e "${__LLDB}" ]; then echo "lldb: ${__LLDB}" ${__LLDB} --no-use-colors --batch --one-line 'bt all' -c "${_CORE_FILE}" "${_CORE_APP_FILE}" 2> /dev/null break; fi if [ -e '/usr/local/bin/gdb' ]; then echo "gdb: /usr/local/bin/gdb" /usr/local/bin/gdb "${_CORE_APP_FILE}" --batch --core="${_CORE_FILE}" -ex "bt" -ex "thread apply all bt full" 2> /dev/null break; fi rm -f "${_UNPACKED_FILE}" echo 'No debugger in system.' exit 1 break; done rm -f "${_UNPACKED_FILE}" # Delete file only if it analyzed. if [ -r "${_CORE_APP_FILE}" ]; then rm -f "${__FILE}" fi echo '==========================================================' done exit 0