1# $NetBSD: stack,v 1.2 2000/06/08 14:42:11 jhawk Exp $ 2 3# Copyright (c) 2000 The NetBSD Foundation, Inc. 4# All rights reserved. 5# 6# This code is derived from software contributed to The NetBSD Foundation 7# by John A. Hawkinson. 8# 9# Redistribution and use in source and binary forms, with or without 10# modification, are permitted provided that the following conditions 11# are met: 12# 1. Redistributions of source code must retain the above copyright 13# notice, this list of conditions and the following disclaimer. 14# 2. Redistributions in binary form must reproduce the above copyright 15# notice, this list of conditions and the following disclaimer in the 16# documentation and/or other materials provided with the distribution. 17# 3. All advertising materials mentioning features or use of this software 18# must display the following acknowledgement: 19# This product includes software developed by the NetBSD 20# Foundation, Inc. and its contributors. 21# 4. Neither the name of The NetBSD Foundation nor the names of its 22# contributors may be used to endorse or promote products derived 23# from this software without specific prior written permission. 24# 25# THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS 26# ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 27# TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 28# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 29# BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 30# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 31# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 32# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 33# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 34# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 35# POSSIBILITY OF SUCH DAMAGE. 36 37 38# Follow an i386 kernel stack trace. 39# This code makes presumptions about the way frames look, consistent 40# with arch/i386/i386/db_trace.c. It also steals algorithms from there. 41 42# Output looks like: 43# 44# 0xc03049cb <cpu_reboot+99>(0x100,0x0,0xc04fd728,0x0,0x6) 45# at 0xc01bc97d <panic+197> (frame at 0xc5633bd0) 46# 47# In this case, the initial hex number and offset should be disregarded, 48# and it should be interprted as if it were: 49# 50# cpu_reboot(0x100,0x0,0xc04fd728,0x0,0x6) 51# at 0xc01bc97d <panic+197> (frame at 0xc5633bd0) 52# 53# due to limitations of gdb scripting. 54 55define stacktrace 56 set $frame=$arg0 57 set $retaddr=$arg1 58 59 while ($frame != 0) 60 set $callpc = $retaddr 61 set $retaddr = *(long*)($frame+sizeof(long*)) 62 63 set $inst=*(long*)$retaddr 64 if (($inst & 0xff) == 0x59) 65# (popl %ecx) 66 set $narg=1 67 else if (($inst & 0xffff) == 0xc483) 68# (addl %n, %esp) 69 set $narg = (($inst >> 16) & 0xff) / 4 70 else 71 set $narg = 5 72 end 73 74 set $argp = $frame+sizeof(long*)+sizeof(int) 75 printf " " 76 output/a $callpc 77 printf "(" 78 while ($narg != 0) 79 printf "0x%lx", *(long*)$argp 80 set $argp = $argp+sizeof(long*) 81 set $narg = $narg-1 82 if ($narg != 0) 83 printf "," 84 end 85 end 86 printf ")\n at " 87 output/a $retaddr 88 printf " (frame at %#x)\n", $frame 89 90 set $frame=*(long*)$frame 91 end 92end 93 94document stacktrace 95 ==> (gdb) stacktrace FP IP 96 print a backtrace of all stack frames, starting at frame pointer FP, 97 and instruction pointer IP. 98end 99 100define stack 101 stacktrace $ebp $eip 102end 103 104document stack 105 => (gdb) stack 106 Print a backtrace of all strack frames, starting at the current $ebp 107 and $eip. 108end 109