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()
|