diff options
-rw-r--r-- | scripts/gdb/linux/dmesg.py | 64 | ||||
-rw-r--r-- | scripts/gdb/vmlinux-gdb.py | 1 |
2 files changed, 65 insertions, 0 deletions
diff --git a/scripts/gdb/linux/dmesg.py b/scripts/gdb/linux/dmesg.py new file mode 100644 index 000000000000..7650f240ebcc --- /dev/null +++ b/scripts/gdb/linux/dmesg.py | |||
@@ -0,0 +1,64 @@ | |||
1 | # | ||
2 | # gdb helper commands and functions for Linux kernel debugging | ||
3 | # | ||
4 | # kernel log buffer dump | ||
5 | # | ||
6 | # Copyright (c) Siemens AG, 2011, 2012 | ||
7 | # | ||
8 | # Authors: | ||
9 | # Jan Kiszka <jan.kiszka@siemens.com> | ||
10 | # | ||
11 | # This work is licensed under the terms of the GNU GPL version 2. | ||
12 | # | ||
13 | |||
14 | import gdb | ||
15 | import string | ||
16 | |||
17 | from linux import utils | ||
18 | |||
19 | |||
20 | class LxDmesg(gdb.Command): | ||
21 | """Print Linux kernel log buffer.""" | ||
22 | |||
23 | def __init__(self): | ||
24 | super(LxDmesg, self).__init__("lx-dmesg", gdb.COMMAND_DATA) | ||
25 | |||
26 | def invoke(self, arg, from_tty): | ||
27 | log_buf_addr = int(str(gdb.parse_and_eval("log_buf")).split()[0], 16) | ||
28 | log_first_idx = int(gdb.parse_and_eval("log_first_idx")) | ||
29 | log_next_idx = int(gdb.parse_and_eval("log_next_idx")) | ||
30 | log_buf_len = int(gdb.parse_and_eval("log_buf_len")) | ||
31 | |||
32 | inf = gdb.inferiors()[0] | ||
33 | start = log_buf_addr + log_first_idx | ||
34 | if log_first_idx < log_next_idx: | ||
35 | log_buf_2nd_half = -1 | ||
36 | length = log_next_idx - log_first_idx | ||
37 | log_buf = inf.read_memory(start, length) | ||
38 | else: | ||
39 | log_buf_2nd_half = log_buf_len - log_first_idx | ||
40 | log_buf = inf.read_memory(start, log_buf_2nd_half) + \ | ||
41 | inf.read_memory(log_buf_addr, log_next_idx) | ||
42 | |||
43 | pos = 0 | ||
44 | while pos < log_buf.__len__(): | ||
45 | length = utils.read_u16(log_buf[pos + 8:pos + 10]) | ||
46 | if length == 0: | ||
47 | if log_buf_2nd_half == -1: | ||
48 | gdb.write("Corrupted log buffer!\n") | ||
49 | break | ||
50 | pos = log_buf_2nd_half | ||
51 | continue | ||
52 | |||
53 | text_len = utils.read_u16(log_buf[pos + 10:pos + 12]) | ||
54 | time_stamp = utils.read_u64(log_buf[pos:pos + 8]) | ||
55 | |||
56 | for line in log_buf[pos + 16:pos + 16 + text_len].splitlines(): | ||
57 | gdb.write("[{time:12.6f}] {line}\n".format( | ||
58 | time=time_stamp / 1000000000.0, | ||
59 | line=line)) | ||
60 | |||
61 | pos += length | ||
62 | |||
63 | |||
64 | LxDmesg() | ||
diff --git a/scripts/gdb/vmlinux-gdb.py b/scripts/gdb/vmlinux-gdb.py index cf2e7161b280..fa66d23ea563 100644 --- a/scripts/gdb/vmlinux-gdb.py +++ b/scripts/gdb/vmlinux-gdb.py | |||
@@ -25,3 +25,4 @@ else: | |||
25 | import linux.utils | 25 | import linux.utils |
26 | import linux.symbols | 26 | import linux.symbols |
27 | import linux.modules | 27 | import linux.modules |
28 | import linux.dmesg | ||