diff options
Diffstat (limited to 'oops2line.py')
-rw-r--r-- | oops2line.py | 54 |
1 files changed, 54 insertions, 0 deletions
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() |