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