colinux64/bin/mindump-repaint-labels.sh
2025-02-13 19:44:47 -07:00

118 lines
3.1 KiB
Bash
Executable File

#!/bin/sh
# Use this script to repaint BSOD files with coLinux label names. This Script
# reads text from "!analyze -v" and prints stack entries with label names.
#
# Usage:
# mindump-repaint-labels.sh [linux.sys] < minidump.txt > backtrace.txt
#
# Needs the file linux.sys with debugging information. This file exist
# in zip archive daemons-*.dbg.zip, or in project build directory
# src/colinux/os/winnt/build. The file must give as first parameter
# to the script, or should exist in currenty directory. Please use a file
# from exactly same build, that triggered the minidump.
#
# Input and outputs are stdin and stdout, please use redirections.
#
# Needs installed tools i686-pc-mingw32-nm from coLinux build system (native
# nm also usable), bc (command line calcualtor), sed, tr, cut, paste.
#
# Example from "!analyze -v" of minidump, before converted...
# STACK_TEXT:
# b090bb38 ad06a8a2 89ff9278 00000000 000000a2 nt!KeReleaseMutex+0x14
# b090bb58 ad063e6b 89ff9278 00000000 b090bb98 linux+0xa8a2
# b090bb78 ad06451e 87d2cea0 87e98f90 000000a2 linux+0x3e6b
#
# Converted into...
# b090bb38 ad06a8a2 89ff9278 00000000 000000a2 nt!KeReleaseMutex+0x14
# b090bb58 ad063e6b 89ff9278 00000000 b090bb98 linux!co_os_mutex_release+0x12 (linux+0xa8a2)
# b090bb78 ad06451e 87d2cea0 87e98f90 000000a2 linux!put_section+0x2B (linux+0x3e6b)
#
# Henry Nestler (c), 2007
# #######################
# Path to mingw32 binutils (i686-pc-mingw32-nm)
PATH="$HOME/colinux/mingw32/bin:$PATH"
# List symbols from object files
NM=i686-pc-mingw32-nm
# Fallback to localy NM, if cross nm is not usable
which $NM >/dev/null 2>&1 || NM=nm
# Base for tempfiles
NMFILE="/tmp/linux.sys.$$.nm"
if [ -n "$1" ]
then
LINUXSYS="$1"
else
LINUXSYS="linux.sys"
fi
if [ ! -f $LINUXSYS ]
then
echo "$LINUXSYS: Missing file linux.sys, please give such as first parameter." >&2
exit 1
fi
# Check installed bc
if ! which bc >/dev/null
then
echo "bc: Not installed or not found." >&2
exit 1
fi
# Create list with all labels (reverse sorted), remove ".text" and ".bss"
$NM -r -n -t d -C $LINUXSYS | grep -v -e ' \.' | uniq > $NMFILE
if [ ! -s $NMFILE ]
then
rm $NMFILE
exit 1
fi
# Search start address and label name for given offset
search_label()
{
while read address type name
do
if [ $address -le $1 ]
then
echo "$address $name"
return
fi
done < $NMFILE
}
# Serach and replace all "linux+0x..." with label names and offsets
start=false
sed -e 's/\r//' |\
while read s1 s2 s3 s4 s5 name
do
if [ "$s1" = "STACK_TEXT:" -o "$s1" = "ChildEBP" ]
then
start=true
elif [ -z "$s1" ]
then
start=false
elif $start
then
offset=`echo "$name" | sed -n -e 's/^linux+0x\(.*\)$/\1/p' | tr [[:lower:]] [[:upper:]]`
if [ -n "$offset" ]
then
# Add offset 0x10000 and convert from hex into decimal
value=`echo -e "ibase=16\n10000+$offset" | bc`
set -- `search_label $value`
address=$1
label=$2
diff=`echo -e "obase=16\n$value-$address" | bc`
echo "$s1 $s2 $s3 $s4 $s5 linux!$label+0x$diff ($name)"
else
echo "$s1 $s2 $s3 $s4 $s5 $name"
fi
fi
done
# Remove temp file
rm $NMFILE