118 lines
3.1 KiB
Bash
Executable File
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
|