summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFrans Kaashoek <[email protected]>2012-08-22 20:51:29 -0400
committerFrans Kaashoek <[email protected]>2012-08-22 20:51:29 -0400
commitc2d393df13cd14762af650c78a7c960b820c4660 (patch)
tree035d6c26fb7ed9b0b92c2fa9e93c5e5944fe06b5
parent95692c4a8cf38765bac15b05d7a898e4ac8946e8 (diff)
downloadxv6-labs-c2d393df13cd14762af650c78a7c960b820c4660.tar.gz
xv6-labs-c2d393df13cd14762af650c78a7c960b820c4660.tar.bz2
xv6-labs-c2d393df13cd14762af650c78a7c960b820c4660.zip
Decode getcallerpcs() (thanks to Peter Froehlich)
-rw-r--r--depcs48
1 files changed, 48 insertions, 0 deletions
diff --git a/depcs b/depcs
new file mode 100644
index 0000000..6dfb888
--- /dev/null
+++ b/depcs
@@ -0,0 +1,48 @@
+#!/usr/bin/env python
+
+# Decode a stack trace from getcallerpcs() to kernel symbols.
+# Peter H. Froehlich <[email protected]>, 600.318/418, Spring 2011
+#
+# $ ./depcs 1072fa 1073c4 106d4a 103024 102fdd 0 0 0 0 0
+# 1078010 ['mappages']
+# 1078212 ['setupkvm']
+# 1076554 ['kvmalloc']
+# 1060900 ['mainc']
+# 1060829 ['jmpkstack']
+
+import sys
+
+# read the symbols, mapping each address to all known names
+
+raw = {}
+with open("kernel.sym") as f:
+ for s in f:
+ adr, sym = s.strip().split()
+ adr = int(adr, 16)
+ if adr in raw:
+ raw[adr].append(sym)
+ else:
+ raw[adr] = [sym]
+
+# for a given address, we need to determine what range it
+# lies in; there are fancy data structures or this, which
+# we ignore; let's just sort the keys instead
+
+sort = sorted(raw.keys())
+
+# now we can find the least key greater than an address;
+# if there's none, we use the last address we know; doh!
+
+def least(x):
+ for i in range(len(sort)-1):
+ if sort[i] <= x < sort[i+1]:
+ return sort[i]
+ return sort[-1]
+
+# therefore we can decode a backtrace (ignoring address
+# 0 since it's useless for xv6)
+
+for adr in sys.argv[1:]:
+ adr = int(adr, 16)
+ if adr != 0:
+ print adr, raw[least(adr)]