[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-devel] [PATCH v11 07/20] gdbstub: Implement breakpoint command
From: |
Alex Bennée |
Subject: |
Re: [Qemu-devel] [PATCH v11 07/20] gdbstub: Implement breakpoint commands (Z/z pkt) with new infra |
Date: |
Mon, 27 May 2019 10:52:02 +0100 |
User-agent: |
mu4e 1.3.2; emacs 26.1 |
Jon Doron <address@hidden> writes:
> Signed-off-by: Jon Doron <address@hidden>
With the fix to avoid double responses this commit still regresses:
10:46 address@hidden/x86_64 [linux.git/address@hidden >gdb
./builds/arm64/vmlinux -x ~/lsrc/qemu.git/tests/guest-debug/test-gdbstub.py
GNU gdb (GDB) 8.3.50.20190424-git
Copyright (C) 2019 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
Type "show copying" and "show warranty" for details.
This GDB was configured as "x86_64-pc-linux-gnu".
Type "show configuration" for configuration details.
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>.
Find the GDB manual and other documentation resources online at:
<http://www.gnu.org/software/gdb/documentation/>.
For help, type "help".
Type "apropos word" to search for commands related to "word"...
Executed .gdbinit
Reading symbols from ./builds/arm64/vmlinux...
Traceback (most recent call last):
File "/home/alex/lsrc/linux.git/builds/arm64/vmlinux-gdb.py", line 30, in
<module>
import linux.config
ImportError: No module named config
Connecting to remote
0x0000000040000000 in ?? ()
Checking we can step the first few instructions
0x0000000040000004 in ?? ()
0x0000000040000008 in ?? ()
0x000000004000000c in ?? ()
PASS: single step in boot code
Checking HW breakpoint works
Hardware assisted breakpoint 1 at 0xffffff8010778f0c: file
/home/alex/lsrc/linux.git/init/main.c, line 1068.
Cannot remove breakpoints because program is no longer writable.
Further execution is probably impossible.
Thread 1 hit Breakpoint 1, kernel_init (unused=0x0) at
/home/alex/lsrc/linux.git/init/main.c:1068
warning: Source file is more recent than executable.
1068 } else
0xffffff8010778f0c <kernel_init> == {int (void *)} 0xffffff8010778f0c
<kernel_init>
warning: Error removing breakpoint 1
PASS: hbreak @ kernel_init
Something might be broken here due to the BP type?
Setup catch-all for run_init_process
Breakpoint 2 at 0xffffff8010083dc4: file /home/alex/lsrc/linux.git/init/main.c,
line 1009.
Breakpoint 3 at 0xffffff8010083e10: file /home/alex/lsrc/linux.git/init/main.c,
line 1020.
Checking Normal breakpoint works
Breakpoint 4 at 0xffffff801077b300: file
/home/alex/lsrc/linux.git/kernel/sched/completion.c, line 136.
Thread 1 received signal SIGTRAP, Trace/breakpoint trap.
Cannot remove breakpoints because program is no longer writable.
Further execution is probably impossible.
kernel_init (unused=0x0) at /home/alex/lsrc/linux.git/init/main.c:1068
1068 } else
0xffffff8010778f0c <kernel_init> == {void (struct completion *)}
0xffffff801077b300 <wait_for_completion> 0
warning: Error removing breakpoint 4
FAIL: break @ wait_for_completion
Checking watchpoint works
Hardware access (read/write) watchpoint 5: *(enum system_states
*)(&system_state)
Thread 1 received signal SIGTRAP, Trace/breakpoint trap.
Cannot remove breakpoints because program is no longer writable.
Further execution is probably impossible.
kernel_init (unused=0x0) at /home/alex/lsrc/linux.git/init/main.c:1068
1068 } else
FAIL: awatch for system_state (SYSTEM_BOOTING)
Hardware read watchpoint 6: *(enum system_states *)(&system_state)
Thread 1 received signal SIGTRAP, Trace/breakpoint trap.
Cannot remove breakpoints because program is no longer writable.
Further execution is probably impossible.
kernel_init (unused=0x0) at /home/alex/lsrc/linux.git/init/main.c:1068
1068 } else
FAIL: rwatch for system_state (SYSTEM_BOOTING)
Hardware watchpoint 7: *(enum system_states *)(&system_state)
Thread 1 received signal SIGTRAP, Trace/breakpoint trap.
Cannot remove breakpoints because program is no longer writable.
Further execution is probably impossible.
kernel_init (unused=0x0) at /home/alex/lsrc/linux.git/init/main.c:1068
1068 } else
FAIL: watch for system_state (SYSTEM_BOOTING)
[Inferior 1 (process 1) killed]
> ---
> gdbstub.c | 84 +++++++++++++++++++++++++++++++++++++++++++------------
> 1 file changed, 66 insertions(+), 18 deletions(-)
>
> diff --git a/gdbstub.c b/gdbstub.c
> index 129a47230f..c59a6765cd 100644
> --- a/gdbstub.c
> +++ b/gdbstub.c
> @@ -950,7 +950,7 @@ static inline int xlat_gdb_type(CPUState *cpu, int
> gdbtype)
> }
> #endif
>
> -static int gdb_breakpoint_insert(target_ulong addr, target_ulong len, int
> type)
> +static int gdb_breakpoint_insert(int type, target_ulong addr, target_ulong
> len)
> {
> CPUState *cpu;
> int err = 0;
> @@ -1591,6 +1591,52 @@ static void handle_set_thread(GdbCmdContext *gdb_ctx,
> void *user_ctx)
> }
> }
>
> +static void handle_insert_bp(GdbCmdContext *gdb_ctx, void *user_ctx)
> +{
> + int res;
> +
> + if (gdb_ctx->num_params != 3) {
> + put_packet(gdb_ctx->s, "E22");
> + return;
> + }
> +
> + res = gdb_breakpoint_insert(gdb_ctx->params[0].val_ul,
> + gdb_ctx->params[1].val_ull,
> + gdb_ctx->params[2].val_ull);
> + if (res >= 0) {
> + put_packet(gdb_ctx->s, "OK");
> + return;
> + } else if (res == -ENOSYS) {
> + put_packet(gdb_ctx->s, "");
> + return;
> + }
> +
> + put_packet(gdb_ctx->s, "E22");
> +}
> +
> +static void handle_remove_bp(GdbCmdContext *gdb_ctx, void *user_ctx)
> +{
> + int res;
> +
> + if (gdb_ctx->num_params != 3) {
> + put_packet(gdb_ctx->s, "E22");
> + return;
> + }
> +
> + res = gdb_breakpoint_remove(gdb_ctx->params[0].val_ul,
> + gdb_ctx->params[1].val_ull,
> + gdb_ctx->params[2].val_ull);
> + if (res >= 0) {
> + put_packet(gdb_ctx->s, "OK");
> + return;
> + } else if (res == -ENOSYS) {
> + put_packet(gdb_ctx->s, "");
> + return;
> + }
> +
> + put_packet(gdb_ctx->s, "E22");
> +}
> +
> static int gdb_handle_packet(GDBState *s, const char *line_buf)
> {
> CPUState *cpu;
> @@ -1846,24 +1892,26 @@ static int gdb_handle_packet(GDBState *s, const char
> *line_buf)
> put_packet(s, "OK");
> break;
> case 'Z':
> + {
> + static const GdbCmdParseEntry insert_bp_cmd_desc = {
> + .handler = handle_insert_bp,
> + .cmd = "Z",
> + .cmd_startswith = 1,
> + .schema = "l?L?L0"
> + };
> + cmd_parser = &insert_bp_cmd_desc;
> + }
> + break;
> case 'z':
> - type = strtoul(p, (char **)&p, 16);
> - if (*p == ',')
> - p++;
> - addr = strtoull(p, (char **)&p, 16);
> - if (*p == ',')
> - p++;
> - len = strtoull(p, (char **)&p, 16);
> - if (ch == 'Z')
> - res = gdb_breakpoint_insert(addr, len, type);
> - else
> - res = gdb_breakpoint_remove(addr, len, type);
> - if (res >= 0)
> - put_packet(s, "OK");
> - else if (res == -ENOSYS)
> - put_packet(s, "");
> - else
> - put_packet(s, "E22");
> + {
> + static const GdbCmdParseEntry remove_bp_cmd_desc = {
> + .handler = handle_remove_bp,
> + .cmd = "z",
> + .cmd_startswith = 1,
> + .schema = "l?L?L0"
> + };
> + cmd_parser = &remove_bp_cmd_desc;
> + }
> break;
> case 'H':
> {
--
Alex Bennée
- [Qemu-devel] [PATCH v11 02/20] gdbstub: Implement deatch (D pkt) with new infra, (continued)
- [Qemu-devel] [PATCH v11 04/20] gdbstub: Implement continue (c pkt) with new infra, Jon Doron, 2019/05/24
- [Qemu-devel] [PATCH v11 06/20] gdbstub: Implement set_thread (H pkt) with new infra, Jon Doron, 2019/05/24
- [Qemu-devel] [PATCH v11 05/20] gdbstub: Implement continue with signal (C pkt) with new infra, Jon Doron, 2019/05/24
- [Qemu-devel] [PATCH v11 03/20] gdbstub: Implement thread_alive (T pkt) with new infra, Jon Doron, 2019/05/24
- [Qemu-devel] [PATCH v11 08/20] gdbstub: Implement set register (P pkt) with new infra, Jon Doron, 2019/05/24
- [Qemu-devel] [PATCH v11 07/20] gdbstub: Implement breakpoint commands (Z/z pkt) with new infra, Jon Doron, 2019/05/24
- Re: [Qemu-devel] [PATCH v11 07/20] gdbstub: Implement breakpoint commands (Z/z pkt) with new infra,
Alex Bennée <=
- [Qemu-devel] [PATCH v11 01/20] gdbstub: Add infrastructure to parse cmd packets, Jon Doron, 2019/05/24
- [Qemu-devel] [PATCH v11 09/20] gdbstub: Implement get register (p pkt) with new infra, Jon Doron, 2019/05/24
- [Qemu-devel] [PATCH v11 11/20] gdbstub: Implement read memory (m pkt) with new infra, Jon Doron, 2019/05/24
- [Qemu-devel] [PATCH v11 12/20] gdbstub: Implement write all registers (G pkt) with new infra, Jon Doron, 2019/05/24
- [Qemu-devel] [PATCH v11 13/20] gdbstub: Implement read all registers (g pkt) with new infra, Jon Doron, 2019/05/24
- [Qemu-devel] [PATCH v11 10/20] gdbstub: Implement write memory (M pkt) with new infra, Jon Doron, 2019/05/24
- [Qemu-devel] [PATCH v11 19/20] gdbstub: Clear unused variables in gdb_handle_packet, Jon Doron, 2019/05/24
- [Qemu-devel] [PATCH v11 16/20] gdbstub: Implement v commands with new infra, Jon Doron, 2019/05/24
- [Qemu-devel] [PATCH v11 18/20] gdbstub: Implement target halted (? pkt) with new infra, Jon Doron, 2019/05/24
- [Qemu-devel] [PATCH v11 15/20] gdbstub: Implement step (s pkt) with new infra, Jon Doron, 2019/05/24