You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
160 lines
3.5 KiB
160 lines
3.5 KiB
15 years ago
|
#! /usr/bin/env perl
|
||
|
#
|
||
|
# script to run gdb on return-addresses
|
||
|
# Usage: $0 malloc-log-file binary
|
||
|
#
|
||
|
# Copyright 1995 by Gray Watson
|
||
|
#
|
||
|
# This file is part of the dmalloc package.
|
||
|
#
|
||
|
# Permission to use, copy, modify, and distribute this software for
|
||
|
# any purpose and without fee is hereby granted, provided that the
|
||
|
# above copyright notice and this permission notice appear in all
|
||
|
# copies, and that the name of Gray Watson not be used in advertising
|
||
|
# or publicity pertaining to distribution of the document or software
|
||
|
# without specific, written prior permission.
|
||
|
#
|
||
|
# Gray Watson makes no representations about the suitability of the
|
||
|
# software described herein for any purpose. It is provided "as is"
|
||
|
# without express or implied warranty.
|
||
|
#
|
||
|
# The author may be contacted at gray.watson@letters.com
|
||
|
#
|
||
|
# $Id$
|
||
|
#
|
||
|
|
||
|
#
|
||
|
# Use this Perl script to run gdb and get information on the return-address
|
||
|
# (ra) addresses from a dmalloc logfile output. This will search for
|
||
|
# any ra= lines and will examine them and try to get the line number.
|
||
|
#
|
||
|
# NOTE: you may want to direct the output from the script to a file
|
||
|
# else gdb seems to prompt for a return like you are on the end of a
|
||
|
# page.
|
||
|
#
|
||
|
# Be sure to send me mail if there is an easier way to do all this.
|
||
|
#
|
||
|
|
||
|
###############################################################################
|
||
|
# usage message
|
||
|
#
|
||
|
if (@ARGV != 2 ) {
|
||
|
die "Usage: $0 dmalloc-log binary-that-generated-log\n";
|
||
|
}
|
||
|
|
||
|
$malloc = @ARGV[0];
|
||
|
$command = @ARGV[1];
|
||
|
|
||
|
@addresses = ();
|
||
|
|
||
|
open(malloc, $malloc);
|
||
|
while ( <malloc> ) {
|
||
|
if ($_ =~ m/ra=(0x[0-9a-fA-F]+)/) {
|
||
|
push(@addresses, $1);
|
||
|
}
|
||
|
}
|
||
|
close(malloc);
|
||
|
open(SORT, "|sort -u > $malloc.tmp");
|
||
|
|
||
|
foreach $address (@addresses) {
|
||
|
print SORT "$address\n";
|
||
|
}
|
||
|
close(SORT);
|
||
|
|
||
|
@addresses = ();
|
||
|
|
||
|
open(SORT, "< $malloc.tmp");
|
||
|
while ( <SORT> ) {
|
||
|
chomp $_;
|
||
|
push(@addresses, $_);
|
||
|
}
|
||
|
close(SORT);
|
||
|
unlink $malloc.tmp;
|
||
|
|
||
|
open (gdb, "|gdb -nx -q $command > $malloc.tmp") || die "Could not run gdb: $!\n";
|
||
|
$| = 1;
|
||
|
|
||
|
# get rid of the (gdb)
|
||
|
printf (gdb "set prompt\n");
|
||
|
printf (gdb "echo \\n\n");
|
||
|
|
||
|
# load in the shared libraries
|
||
|
printf (gdb "sharedlibrary\n");
|
||
|
|
||
|
# run the program to have _definitly_ the informations
|
||
|
# we need from the shared libraries. Unfortunatly gdb 4.18's
|
||
|
# version of sharedlibrary does nothing ;(
|
||
|
printf (gdb "b main\n");
|
||
|
printf (gdb "run\n");
|
||
|
|
||
|
foreach $address (@addresses) {
|
||
|
|
||
|
printf (gdb "echo -----------------------------------------------\\n\n");
|
||
|
# printf (gdb "echo Address = '%s'\n", $address);
|
||
|
printf (gdb "x %s\n", $address);
|
||
|
printf (gdb "info line *(%s)\n", $address);
|
||
|
}
|
||
|
printf (gdb "quit\ny\n");
|
||
|
# $| = 0;
|
||
|
|
||
|
close(gdb);
|
||
|
|
||
|
%lines = ();
|
||
|
|
||
|
open(malloc, "< $malloc.tmp");
|
||
|
|
||
|
$count = 0;
|
||
|
$address = "";
|
||
|
$line = "";
|
||
|
|
||
|
while ( <malloc> ) {
|
||
|
|
||
|
# ignore our own input
|
||
|
if ($_ =~ m/^x 0x/ || $_ =~ m/^echo ------/ || $_ =~ m/^info line/) {
|
||
|
next;
|
||
|
}
|
||
|
|
||
|
if ($_ =~ m/^--------/) {
|
||
|
if ($line) {
|
||
|
$lines{$address} = "$line";
|
||
|
}
|
||
|
$count = 0;
|
||
|
$address = "";
|
||
|
$line = "";
|
||
|
} else {
|
||
|
$count = $count + 1;
|
||
|
}
|
||
|
|
||
|
if ($count == 1 && $_ =~ m/(0x[0-9a-fA-F]+)\s*<(.*)>:\s*(\S+)/) {
|
||
|
$address = $1;
|
||
|
$line = "$2<$3>";
|
||
|
}
|
||
|
|
||
|
if ($count == 2 && $_ =~ m/Line ([0-9]+) of \"([^\"]*)\"/) {
|
||
|
$line = "$2:$1";
|
||
|
}
|
||
|
|
||
|
}
|
||
|
|
||
|
if ($line) {
|
||
|
$lines{$address} = "$line";
|
||
|
}
|
||
|
|
||
|
close(malloc);
|
||
|
|
||
|
open(malloc, $malloc);
|
||
|
|
||
|
while ( <malloc> ) {
|
||
|
if ($_ =~ m/ra=(0x[0-9a-fA-F]+)/) {
|
||
|
$address = $1;
|
||
|
if (defined($lines{$address})) {
|
||
|
$_ =~ s/ra=$address/$lines{$address}/;
|
||
|
print STDOUT $_;
|
||
|
} else {
|
||
|
print STDOUT $_;
|
||
|
}
|
||
|
} else {
|
||
|
print STDOUT $_;
|
||
|
}
|
||
|
}
|