aboutsummaryrefslogtreecommitdiffstats
path: root/scripts/gdb
diff options
context:
space:
mode:
authorJan Kiszka <jan.kiszka@siemens.com>2015-02-17 16:47:04 -0500
committerLinus Torvalds <torvalds@linux-foundation.org>2015-02-17 17:34:53 -0500
commitae7dbaad23f0346dc4e2476be63a9a5a376ee472 (patch)
treebc4d9da95fd46b4f81ba437adb4e5344dca85809 /scripts/gdb
parent78e878172327b1b6aa6264b1d22f9a083f9ddaa6 (diff)
scripts/gdb: add lx-dmesg command
This pokes into the log buffer of the debugged kernel, dumping it to the gdb console. Helping in case the target should or can no longer execute dmesg itself. Signed-off-by: Jan Kiszka <jan.kiszka@siemens.com> Cc: Kay Sievers <kay@vrfy.org> Cc: Thomas Gleixner <tglx@linutronix.de> Cc: Jason Wessel <jason.wessel@windriver.com> Cc: Andi Kleen <andi@firstfloor.org> Cc: Ben Widawsky <ben@bwidawsk.net> Cc: Borislav Petkov <bp@suse.de> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'scripts/gdb')
-rw-r--r--scripts/gdb/linux/dmesg.py64
-rw-r--r--scripts/gdb/vmlinux-gdb.py1
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
14import gdb
15import string
16
17from linux import utils
18
19
20class 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
64LxDmesg()
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