Created
September 20, 2019 17:50
-
-
Save mellery451/567ae5bf29910f4b14468845146b1083 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/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