Commit | Line | Data |
---|---|---|
ae7dbaad JK |
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 | |
ae7dbaad JK |
15 | |
16 | from linux import utils | |
17 | ||
18 | ||
19 | class LxDmesg(gdb.Command): | |
20 | """Print Linux kernel log buffer.""" | |
21 | ||
22 | def __init__(self): | |
23 | super(LxDmesg, self).__init__("lx-dmesg", gdb.COMMAND_DATA) | |
24 | ||
25 | def invoke(self, arg, from_tty): | |
26 | log_buf_addr = int(str(gdb.parse_and_eval("log_buf")).split()[0], 16) | |
27 | log_first_idx = int(gdb.parse_and_eval("log_first_idx")) | |
28 | log_next_idx = int(gdb.parse_and_eval("log_next_idx")) | |
29 | log_buf_len = int(gdb.parse_and_eval("log_buf_len")) | |
30 | ||
31 | inf = gdb.inferiors()[0] | |
32 | start = log_buf_addr + log_first_idx | |
33 | if log_first_idx < log_next_idx: | |
34 | log_buf_2nd_half = -1 | |
35 | length = log_next_idx - log_first_idx | |
36 | log_buf = inf.read_memory(start, length) | |
37 | else: | |
38 | log_buf_2nd_half = log_buf_len - log_first_idx | |
39 | log_buf = inf.read_memory(start, log_buf_2nd_half) + \ | |
40 | inf.read_memory(log_buf_addr, log_next_idx) | |
41 | ||
42 | pos = 0 | |
43 | while pos < log_buf.__len__(): | |
44 | length = utils.read_u16(log_buf[pos + 8:pos + 10]) | |
45 | if length == 0: | |
46 | if log_buf_2nd_half == -1: | |
47 | gdb.write("Corrupted log buffer!\n") | |
48 | break | |
49 | pos = log_buf_2nd_half | |
50 | continue | |
51 | ||
52 | text_len = utils.read_u16(log_buf[pos + 10:pos + 12]) | |
276d97d9 | 53 | text = log_buf[pos + 16:pos + 16 + text_len] |
ae7dbaad JK |
54 | time_stamp = utils.read_u64(log_buf[pos:pos + 8]) |
55 | ||
276d97d9 | 56 | for line in memoryview(text).tobytes().splitlines(): |
ae7dbaad JK |
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() |