summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-xfindoops.sh11
-rw-r--r--oops2line.py54
2 files changed, 65 insertions, 0 deletions
diff --git a/findoops.sh b/findoops.sh
new file mode 100755
index 0000000..2d18c33
--- /dev/null
+++ b/findoops.sh
@@ -0,0 +1,11 @@
+#!/bin/sh
+
+# Copyright (c) 2014 Intel Corporation
+# Author: Mika Kuoppala <mika.kuoppala@intel.com>
+
+if [ $# -ne 1 ]] ; then
+ echo "usage: $0 <function+offset>"
+ exit
+fi
+
+gdb -x ./oops2line.py -ex "oops2line $1" -ex quit
diff --git a/oops2line.py b/oops2line.py
new file mode 100644
index 0000000..c6c8f57
--- /dev/null
+++ b/oops2line.py
@@ -0,0 +1,54 @@
+# Copyright (c) 2014 Intel Corporation
+# Author: Mika Kuoppala <mika.kuoppala@intel.com>
+
+import sys
+import gdb
+
+def print(message):
+ sys.stderr.write("%s\n" % message);
+ sys.stderr.flush()
+
+
+def read_section(module_name, sec):
+ f = open("/sys/module/" + module_name + "/sections/." + sec);
+ return f.readline().rstrip()
+
+def add_module(module_root, module_path, module_name):
+ gdb.execute( "add-symbol-file " + module_root + module_path + module_name +
+ ".ko " + read_section(module_name, "text") +
+ " -s .data " + read_section(module_name, "data") +
+ " -s .bss " + read_section(module_name, "bss") );
+
+def find_kernel_version():
+ with open ("/proc/version", 'r') as f:
+ line = f.read()
+ return line.split(" ")[2]
+
+def find_kernel():
+ return '/boot/vmlinuz-' + str(find_kernel_version())
+
+def find_module_root():
+ return '/lib/modules/' + str(find_kernel_version() + '/kernel/')
+
+class PrintOops(gdb.Command):
+ """print oops2line:
+ Translate IP in kernel oops to a file/line"""
+
+ def __init__(self):
+ super (PrintOops, self).__init__("oops2line", gdb.COMMAND_USER)
+
+ def invoke(self, arg, from_tty):
+ arg_list = gdb.string_to_argv(arg)
+ if len(arg_list) < 1:
+ print("usage: oops2line <function+offset>")
+ return
+
+ print("Searching for %s" % arg_list[0])
+ print("Kernel: " + find_kernel())
+ print("Modules: " + find_module_root())
+ add_module(find_module_root(), "drivers/gpu/drm/i915/", "i915");
+ add_module(find_module_root(), "drivers/gpu/drm/", "drm");
+
+ gdb.execute('l *' + arg_list[0])
+
+PrintOops()