Changeset View
Changeset View
Standalone View
Standalone View
libexec/corestop/corestop.sh
- This file was added.
Property | Old Value | New Value |
---|---|---|
svn:eol-style | null | native \ No newline at end of property |
svn:executable | null | * \ No newline at end of property |
svn:keywords | null | FreeBSD=%H \ No newline at end of property |
svn:mime-type | null | text/plain \ No newline at end of property |
#!/bin/sh | |||||
die() { | |||||
echo "$*; exiting" 1>&2 | |||||
exit 1 | |||||
} | |||||
PID="$1" | |||||
EUID="$2" | |||||
if [ "$3" != "su-done" ]; then | |||||
# Reexecute ourselves as user $EUID. | |||||
LOGIN=$(getent passwd "${EUID}" | cut -f 1 -d ':') | |||||
if [ -z "${LOGIN}" ]; then | |||||
die "cannot retrieve login name for EUID ${EUID}" | |||||
exit 1 | |||||
fi | |||||
exec su -l ${LOGIN} -c "${0} ${PID} ${EUID} su-done" | |||||
# This cannot happen, but hey, what if there's a bug in sh(1)? | |||||
exit 1 | |||||
fi | |||||
# From this point on we're running as user $EUID. | |||||
if [ "${EUID}" -ne $(id -u) ]; then | |||||
# Make extra sure it doesn't happen. | |||||
die "not running as EUID ${EUID}" | |||||
fi | |||||
# Get the process working directory. | |||||
CWD=$(procstat -f "${PID}" | awk '$3 == "cwd" { print $10 }') | |||||
[ -n "${CWD}" ] || die "unable to query working directory" | |||||
# Get process name. | |||||
COMM=$(procstat -b "${PID}" | awk 'NR == 2 { print $2 }') | |||||
[ -n "${CWD}" ] || die "unable to query process name" | |||||
CORETMP=$(mktemp -d -t corestop.XXXXXX) | |||||
if [ $? -ne 0 -o -z "${CORETMP}" ]; then | |||||
die "mktemp failed" | |||||
fi | |||||
cd "${CORETMP}" | |||||
show() { | |||||
echo "\$ $@" | |||||
$@ | |||||
echo | |||||
} | |||||
{ | |||||
echo bt | show /usr/bin/lldb -p "${PID}" | |||||
#echo bt | show /usr/local/bin/gdb -q -p "${PID}" | |||||
show procstat arguments "${PID}" | |||||
show procstat environment "${PID}" | |||||
show procstat vm "${PID}" | |||||
show procstat files "${PID}" | |||||
show procstat threads "${PID}" | |||||
show procstat basic "${PID}" | |||||
show procstat binary "${PID}" | |||||
show procstat credentials "${PID}" | |||||
show procstat auxv "${PID}" | |||||
show procstat signal "${PID}" | |||||
show procstat tsignal "${PID}" | |||||
show procstat kstack "${PID}" | |||||
show procstat rlimit "${PID}" | |||||
# XXX: The one below doesn't seem to work. | |||||
#show procstat ptlwpinfo "${PID}" | |||||
show procstat rusage "${PID}" | |||||
show procstat cpuset "${PID}" | |||||
} > "${CORETMP}/core.txt" 2>&1 | |||||
# Get list of files mapped as executable into the process virtual memory, | |||||
# ie the main executable and its shared libraries. | |||||
FILES=$(procstat -v "${PID}" | awk '$4 ~ /x/ && $10 == "vn" {print $11 }' | sort -u | xargs) | |||||
gcore -c "${COMM}.core" "${PID}" | |||||
COREDIR="${COMM}.${PID}.coredir" | |||||
CORETAR="${CWD}/${COREDIR}.tar.gz" | |||||
tar -c -z -L -s ",^,${COREDIR}/," -f "${CORETAR}" * ${FILES} | |||||
rc=$? | |||||
rm -rf "${CORETMP}" | |||||
if [ $rc -eq 0 ]; then | |||||
echo "${CORETAR} created for pid ${PID} (${COMM}), euid ${EUID}" | |||||
fi |