diff options
Diffstat (limited to 'scripts')
| -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 | ||
