blob: 3364ce89197e8508179dbdad67e3aed55ae56831 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
|
#!/bin/sh
# Open the latest core file for program with gdb
# 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
if [ "$#" -lt 1 ]; then
>&2 printf 'usage: gdbcore <program>\n'
fi
prog="$1"
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 [ "$2" = "-r" ]; then
recent="$(find "$coredir" -name 'core.assert*' -printf '%Ts %f\n' |
sort -n |
head -n 1 |
cut -f 2- -d' ')"
corefile="$coredir"/"$recent"
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 -k 2 -k 3 -r |
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 "$prog" "$tmp"
rm -f "$tmp"
|