| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455 | #!/bin/bash# This script can be used for analyzing a crash report.# It tries to find a matching binary .elf either locally# or from github releases.## Usage:#    utils/analyze_crashlog.sh                # paste log to console, press ctrl-D to end#    utils/analyze_crashlog.sh log.txt        # read log from file#    utils/analyze_crashlog.sh log.txt path   # read log from file and find firmware at pathif [ "x$1" = "x" ]; then    logfile=$(mktemp /tmp/crashlog-XXXXXXX)    cat - > $logfileelse    logfile=$1firepo="BlueSCSI/BlueSCSI-v2"# Find firmware compilation timefwtime=$(grep 'FW Version' $logfile | tail -n 1 | egrep -o '[A-Z][a-z][a-z] [0-9]+ [0-9]+ [0-9:]+')# Check if the firmware file is available locallyecho "Searching for firmware compiled at $fwtime"scriptdir=$( dirname -- "${BASH_SOURCE[0]}" )fwfile=$(find $scriptdir/.. $2 -name '*.elf' -exec grep -q "$fwtime" {} \; -print -quit)# Search Github for artifacts uploaded within few minutes of the compilation timeif [ "x$fwfile" = "x" ]; then    echo "Searching on Github"    enddate=$(date "+%Y-%m-%dT%H:%M" -d "$fwtime 180 seconds")    runid=$(gh api repos/$repo/actions/artifacts \        --jq ".artifacts[] | select(.created_at <= \"$enddate\") | .workflow_run.id" | head -n 1)    if [ "x$runid" != "x" ]; then        tmpdir=$(mktemp -d /tmp/crashlog-XXXXXXX)        echo "Workflow run: https://github.com/$repo/actions/runs/$runid"        echo "Downloading artifact to $tmpdir (if permission denied, use 'gh auth' to login)"        (cd $tmpdir; gh run download -R $repo $runid)        fwfile=$(find $tmpdir -name '*.elf' -exec grep -q "$fwtime" {} \; -print -quit)    fifiif [ "x$fwfile" = "x" ]; then    echo "Did not find firmware built at $fwtime!"    exit 1else    echo "Found firmware at $fwfile"fi# Get crash addressesechofor addr in $(egrep -o '[ x][0-9a-fA-Z]{8}' $logfile | tr -d 'x'); do    arm-none-eabi-addr2line -Cafsip -e "$fwfile" $addr | grep -v ?done
 |