Skip to content

Instantly share code, notes, and snippets.

@mellery451
Created September 20, 2019 17:50
Show Gist options
  • Save mellery451/567ae5bf29910f4b14468845146b1083 to your computer and use it in GitHub Desktop.
Save mellery451/567ae5bf29910f4b14468845146b1083 to your computer and use it in GitHub Desktop.
#!/usr/bin/env bash
set -eu
# verify running as root
if [[ $(id -u) -ne 0 ]] ; then
echo "Script must be run as root/sudo" 2>&1
exit 1
fi
ORIG_CORE=$(cat /proc/sys/kernel/core_pattern)
cp /lib/systemd/system/rippled.service /lib/systemd/system/rippled.service.bak
function cleanup {
echo "${ORIG_CORE}" | tee /proc/sys/kernel/core_pattern
mv /lib/systemd/system/rippled.service.bak /lib/systemd/system/rippled.service
systemctl daemon-reload
}
trap cleanup EXIT
source /etc/os-release
# check package: gdb
EXTRA_PKGS=""
if ! command -v gdb >/dev/null 2>&1 ; then
EXTRA_PKGS+="gdb"
fi
echo "installing packages..."
if [[ "$ID" == "ubuntu" || "$ID" == "debian" ]] ; then
eval apt-get -y -qq install rippled-dbgsym ${EXTRA_PKGS}
elif [[ "$ID" == "fedora" || "$ID" == "centos" || "$ID" == "rhel" || "$ID" == "scientific" ]] ; then
eval yum install -y --enablerepo=ripple-stable rippled-debuginfo ${EXTRA_PKGS}
else
echo "unsupported distro!"
exit 1
fi
# setup cores
NEW_COREDIR='/var/log/rippled/cores'
mkdir -p -m 0777 ${NEW_COREDIR}
CORE_BEFORE=$(ls -A1 ${NEW_COREDIR})
echo "/var/log/rippled/cores/%e.%p" | tee /proc/sys/kernel/core_pattern
sed -i '/LimitNOFILE=/a LimitCORE=infinity' /lib/systemd/system/rippled.service
systemctl daemon-reload
echo "**************************************************"
echo " The service file for rippled has been modified.
echo " PLEASE START/RESTART THE rippled SERVICE.
echo "**************************************************"
# poll for corefiles
echo "waiting for corefiles - ctrl-c to interrupt..."
while true; do
CORE_NOW=$(ls -A1 ${NEW_COREDIR})
ORIG_IFS="${IFS}"
IFS=$'\n\r'
FOUND_CORE=false
for l in $(diff -w --suppress-common-lines <(echo "${CORE_BEFORE}") <(echo "${CORE_NOW}")) ; do
if [[ "$l" =~ ^[[:space:]]*\>[[:space:]]*(.+)$ ]] ; then
COREFILE="${BASH_REMATCH[1]}"
if [[ "$COREFILE" =~ ^rippled ]] ; then
FOUND_CORE=true
echo "FOUND core dump file at '${NEW_COREDIR}/${COREFILE}'"
GDB_OUTPUT=$(/bin/mktemp /tmp/gdb_output_XXXXXXXXXX.txt)
gdb \
-ex "set height 0" \
-ex "set logging file ${GDB_OUTPUT}" \
-ex "set logging on" \
-ex "print 'ripple::BuildInfo::versionString'" \
-ex "thread apply all backtrace full" \
-ex "info inferiors" \
-ex quit \
"/opt/ripple/bin/rippled" \
"${NEW_COREDIR}/${COREFILE}" &> /dev/null
echo -e "CORE INFO: \n\n $(cat ${GDB_OUTPUT}) \n\n)"
echo "*******************************************************************"
echo "please save/send file ${GDB_OUTPUT}"
echo "*******************************************************************"
chmod a+rw ${GDB_OUTPUT}
exit 0
fi
fi
done
IFS="${ORIG_IFS}"
if [[ ${FOUND_CORE} == true ]]; then
exit 0
fi
sleep 10
done
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment