#!/bin/sh # Open the latest core file for program $1 with gdb # If no program supplied then use the most recent one # RETURN VALUES # 0 - success # 1 - if the program was not found or not executable # 2 - if the user did aborted # 3 - zstd failed # 4 - wrong usage cache="$HOME/.cache/gdbcore_prog" if [ "$#" -lt 1 ]; then >&2 printf 'usage: gdbcore [-r] \n' fi if [ "$1" = "-r" ]; then recent=1 shift fi if [ "$1" ]; then prog="$1" printf '%s\n' "$prog" > "$cache" else prog="$(cat "$cache")" fi if [ ! -x "$prog" ]; then prog="$(which "$prog" 2>/dev/null)" [ -x "$prog" ] || exit 1 fi # Directory where corefiles are located coredir=/var/lib/systemd/coredump # Temporary file listing core files location, later used as location for the corefile tmp="$(mktemp)" if [ "$recent" ]; then file="$(find "$coredir" -name "core.${prog##*/}*" -printf '%Ts %f\n' | sort -n -r | head -n 1 | cut -f 2- -d' ')" corefile="$coredir"/"$file" else find "$coredir" -name "core.${prog##*/}*" -printf '%f %TF %TT\n' > "$tmp" choice="$(sed \ -e 's/\.[0-9]\+$//' \ -e 's/^core\.//' \ -e 's/\.[0-9]\+\.[0-9a-f]\+\.[0-9]\+\.[0-9]\+\.zst / /' \ "$tmp" | awk '{print NR ".", "[" $3,$2"]", $1}' | sort -r -k 3 -k 2 | fzf -0 --with-nth=2..)" if [ -z "$choice" ]; then rm "$tmp" exit 2 fi nr="${choice%%.*}" line="$(sed -n "${nr}p" "$tmp")" corefile="$coredir"/"${line%% *}" fi if [ ! -f "$corefile" ]; then rm -f "$tmp" exit 1 fi if ! zstd -d "$corefile" -f -o "$tmp" 2>/dev/null; then rm -f "$tmp" exit 3 fi gdb -q "$prog" "$tmp" rm -f "$tmp"