# Copyright (c) 2014 Intel Corporation # Author: Mika Kuoppala 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 ") 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()