summaryrefslogtreecommitdiff
path: root/oops2line.py
blob: c6c8f57a386b2202ffee399fd421bba0f79b3e10 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
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()