PaperWM/debug
2018-07-06 13:22:19 +02:00

102 lines
2.7 KiB
Bash
Executable File
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/usr/bin/env zsh
indent=" "
# Ref: https://gitlab.gnome.org/GNOME/gnome-shell/issues/1
function skip-crap {
local crap_start="^Object [^ ]+ \(.*\), has been already finalized. Impossible to \w* any property \w* it.*"
local crap_continue=(
"^== Stack trace for context.*"
"^#[0-9]+\s*0x.*"
)
local skip=0
local skipped=0
local begin_skip_date
# Could probably be done more elegantly with awk/sed ?
while read -r date; do
read -r line
if [[ $line =~ $crap_start ]]; then
# echo setting skip
skip=1
begin_skip_date=$date
((skipped += 1))
continue
fi
if [[ $skip == 1 ]]; then
if [[ ($line =~ $crap_continue[1]) ||
($line =~ $crap_continue[2]) ]]; then
((skipped += 1))
continue
else
# echo reset skip
printf "%s\n" $begin_skip_date
printf "${indent}Skipped \"already finalized\" crap ($skipped lines)\n"
skip=0
skipped=0
fi
fi
printf "%s\n%s\n" $date $line
done
}
function group-stack-traces {
local addr="0x[0-9a-z]+"
local start_pattern="== Stack trace for context ${addr} =="
local stackframe="^#[0-9]+\s*${addr}"
local in_group=0
while read -r date; do
read -r line;
if [[ $line =~ $start_pattern ]]; then
in_group=1
elif ! [[ $line =~ $stackframe ]]; then
in_group=0
fi
if [[ $in_group == 0 ]]; then
printf "%s\n" $date
fi
printf "${indent}%s\n" $line
done
}
function date-on-separate-line {
# Use line buffering to be able to interactively grep the output
# (sed use line buffering when stdout is tty, but doesn't detect this
# transiently so `debug | grep foobar` will run without line buffering
# without the stdbuf stuff)
stdbuf -oL sed -e "s|\]:|]:\n${indent}|"
}
# We use non-breaking space to encode newlines in multiline messages
function decode-multiline-message {
stdbuf -oL sed -e 's| |\n |g'
}
function gnome-shell-exe-path {
if uname -a | grep --silent "NixOS"; then
echo $(dirname =gnome-shell(:A))/.gnome-shell-wrapped
else
echo =gnome-shell
fi
}
# Skip journalctl "logs start at.." to not disrupt date,line,date,line stream
function skip-header {
stdbuf -oL tail -n +2
}
journalctl --follow --lines 400 $@ $(gnome-shell-exe-path) \
| skip-header \
| date-on-separate-line \
| skip-crap \
| group-stack-traces \
| decode-multiline-message