|  | @@ -0,0 +1,55 @@
 | 
											
												
													
														|  | 
 |  | +#!/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 zululog.txt        # read log from file
 | 
											
												
													
														|  | 
 |  | +#    utils/analyze_crashlog.sh zululog.txt path   # read log from file and find firmware at path
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +if [ "x$1" = "x" ]; then
 | 
											
												
													
														|  | 
 |  | +    logfile=$(mktemp /tmp/crashlog-XXXXXXX)
 | 
											
												
													
														|  | 
 |  | +    cat - > $logfile
 | 
											
												
													
														|  | 
 |  | +else
 | 
											
												
													
														|  | 
 |  | +    logfile=$1
 | 
											
												
													
														|  | 
 |  | +fi
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +repo="ZuluSCSI/ZuluSCSI-firmware"
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +# Find firmware compilation time
 | 
											
												
													
														|  | 
 |  | +fwtime=$(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 locally
 | 
											
												
													
														|  | 
 |  | +echo "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 time
 | 
											
												
													
														|  | 
 |  | +if [ "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)
 | 
											
												
													
														|  | 
 |  | +    fi
 | 
											
												
													
														|  | 
 |  | +fi
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +if [ "x$fwfile" = "x" ]; then
 | 
											
												
													
														|  | 
 |  | +    echo "Did not find firmware built at $fwtime!"
 | 
											
												
													
														|  | 
 |  | +    exit 1
 | 
											
												
													
														|  | 
 |  | +else
 | 
											
												
													
														|  | 
 |  | +    echo "Found firmware at $fwfile"
 | 
											
												
													
														|  | 
 |  | +fi
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +# Get crash addresses
 | 
											
												
													
														|  | 
 |  | +echo
 | 
											
												
													
														|  | 
 |  | +for 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
 |