📄 checkstack
字号:
#!/bin/bash## Written by Keith Owens, modified by Arjan van de Ven to output in deciman## Usage : check-stack.sh vmlinux $(/sbin/modprobe -l)## Run a compiled ix86 kernel and print large local stack usage.## />:/{s/[<>:]*//g; h; } On lines that contain '>:' (headings like# c0100000 <_stext>:), remove <, > and : and hold the line. Identifies# the procedure and its start address.## /subl\?.*\$0x[^,][^,][^,].*,%esp/{ Select lines containing# subl\?...0x...,%esp but only if there are at least 3 digits between 0x and# ,%esp. These are local stacks of at least 0x100 bytes.## s/.*$0x\([^,]*\).*/\1/; Extract just the stack adjustment# /^[89a-f].......$/d; Ignore line with 8 digit offsets that are# negative. Some compilers adjust the stack on exit, seems to be related# to goto statements# G; Append the held line (procedure and start address).# s/\(.*\)\n.* \(.*\)/\1 \2/; Remove the newline and procedure start# address. Leaves just stack size and procedure name.# p; }; Print stack size and procedure name.## /subl\?.*%.*,%esp/{ Selects adjustment of %esp by register, dynamic# arrays on stack.# G; Append the held line (procedure and start address).# s/\(.*\)\n\(.*\)/Dynamic \2 \1/; Reformat to "Dynamic", procedure# start address, procedure name and the instruction that adjusts the# stack, including its offset within the proc.# p; }; Print the dynamic line.### Leading spaces in the sed string are required.## first check if it's x86, since only that arch works for nowuname -m | grep -q 86$ > /dev/null || exit#objdump --disassemble "$@" | \sed -ne '/>:/{s/[<>:]*//g; h; } /subl\?.*\$0x[^,][^,][^,].*,%esp/{ s/.*\$0x\([^,]*\).*/\1/; /^[89a-f].......$/d; G; s/\(.*\)\n.* \(.*\)/\1 \2/; p; }; /subl\?.*%.*,%esp/{ G; s/\(.*\)\n\(.*\)/Dynamic \2 \1/; p; }; ' | \ sort | \perl -e 'while (<>) { if (/^([0-9a-f]+)(.*)/) { $decn = hex("0x" . $1); if ($decn > 400) { print "$decn $2\n";} } }'
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -