diff options
author | André Draszik <git@andred.net> | 2017-06-02 17:46:51 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2017-06-02 18:07:38 -0400 |
commit | d6c9708737c2107c38bd75f133d14d5801b8d6d5 (patch) | |
tree | 540fe3fe4ebfc3f2efdf1b21cce9f5f16e74f7b3 /scripts | |
parent | 864b9a393dcb5aed09b8fd31b9bbda0fdda99374 (diff) |
scripts/gdb: make lx-dmesg command work (reliably)
lx-dmesg needs access to the log_buf symbol from printk.c.
Unfortunately, the symbol log_buf also exists in BPF's verifier.c and
hence gdb can pick one or the other. If it happens to pick BPF's
log_buf, lx-dmesg doesn't work:
(gdb) lx-dmesg
Python Exception <class 'gdb.MemoryError'> Cannot access memory at address 0x0:
Error occurred in Python command: Cannot access memory at address 0x0
(gdb) p log_buf
$15 = 0x0
Luckily, GDB has a way to deal with this, see
https://sourceware.org/gdb/onlinedocs/gdb/Symbols.html
(gdb) info variables ^log_buf$
All variables matching regular expression "^log_buf$":
File <linux.git>/kernel/bpf/verifier.c:
static char *log_buf;
File <linux.git>/kernel/printk/printk.c:
static char *log_buf;
(gdb) p 'verifier.c'::log_buf
$1 = 0x0
(gdb) p 'printk.c'::log_buf
$2 = 0x811a6aa0 <__log_buf> ""
(gdb) p &log_buf
$3 = (char **) 0x8120fe40 <log_buf>
(gdb) p &'verifier.c'::log_buf
$4 = (char **) 0x8120fe40 <log_buf>
(gdb) p &'printk.c'::log_buf
$5 = (char **) 0x8048b7d0 <log_buf>
By being explicit about the location of the symbol, we can make lx-dmesg
work again. While at it, do the same for the other symbols we need from
printk.c
Link: http://lkml.kernel.org/r/20170526112222.3414-1-git@andred.net
Signed-off-by: André Draszik <git@andred.net>
Tested-by: Kieran Bingham <kieran@bingham.xyz>
Acked-by: Jan Kiszka <jan.kiszka@siemens.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'scripts')
-rw-r--r-- | scripts/gdb/linux/dmesg.py | 9 |
1 files changed, 5 insertions, 4 deletions
diff --git a/scripts/gdb/linux/dmesg.py b/scripts/gdb/linux/dmesg.py index f9b92ece7834..5afd1098e33a 100644 --- a/scripts/gdb/linux/dmesg.py +++ b/scripts/gdb/linux/dmesg.py | |||
@@ -23,10 +23,11 @@ class LxDmesg(gdb.Command): | |||
23 | super(LxDmesg, self).__init__("lx-dmesg", gdb.COMMAND_DATA) | 23 | super(LxDmesg, self).__init__("lx-dmesg", gdb.COMMAND_DATA) |
24 | 24 | ||
25 | def invoke(self, arg, from_tty): | 25 | def invoke(self, arg, from_tty): |
26 | log_buf_addr = int(str(gdb.parse_and_eval("log_buf")).split()[0], 16) | 26 | log_buf_addr = int(str(gdb.parse_and_eval( |
27 | log_first_idx = int(gdb.parse_and_eval("log_first_idx")) | 27 | "'printk.c'::log_buf")).split()[0], 16) |
28 | log_next_idx = int(gdb.parse_and_eval("log_next_idx")) | 28 | log_first_idx = int(gdb.parse_and_eval("'printk.c'::log_first_idx")) |
29 | log_buf_len = int(gdb.parse_and_eval("log_buf_len")) | 29 | log_next_idx = int(gdb.parse_and_eval("'printk.c'::log_next_idx")) |
30 | log_buf_len = int(gdb.parse_and_eval("'printk.c'::log_buf_len")) | ||
30 | 31 | ||
31 | inf = gdb.inferiors()[0] | 32 | inf = gdb.inferiors()[0] |
32 | start = log_buf_addr + log_first_idx | 33 | start = log_buf_addr + log_first_idx |