public inbox for gdb-patches@sourceware.org
 help / color / mirror / Atom feed
From: Simon Marchi <simark@simark.ca>
To: Andrew Burgess <aburgess@redhat.com>, gdb-patches@sourceware.org
Subject: Re: [PATCHv2 1/4] gdb: more debug output for displaced stepping
Date: Tue, 21 Mar 2023 10:45:14 -0400	[thread overview]
Message-ID: <46b9208a-f051-786d-76db-956a3362e26b@simark.ca> (raw)
In-Reply-To: <09efdbfc7f9f0bf0402c222237c85f837b011082.1678984664.git.aburgess@redhat.com>

On 3/16/23 12:39, Andrew Burgess via Gdb-patches wrote:
> While investigating a displaced stepping issue I wanted an easy way to
> see what GDB thought the original instruction was, and what
> instruction GDB replaced that with when performing the displaced step.
> 
> We do print out the address that is being stepped, so I can track down
> the original instruction.
> 
> And we do print out the bytes of the new instruction, so I can figure
> out what the replacement instruction was, but it's not really easy.
> 
> In this commit, within displaced_step_buffers::prepare, I add new
> debug output which disassembles both the original instruction, and the
> replacement instruction, and prints both these instructions, along
> with the bytes that make these instructions, to the debug output.
> 
> This new debug improved on some debug that was already present in
> infrun.c, however, the old infrun.c debug (a) didn't actually
> disassemble the instruction, it just printed the bytes, and (b) there
> was an assumption that all instructions are 4-bytes long, which
> clearly isn't correct.
> 
> I think it makes more sense to have all this debug in the
> displaced-stepping.c file, so I've removed the infrun.c code, and
> added my new debug in displaced-stepping.c.
> 
> Here's an example of what the output looks like on x86-64 (this is
> with 'set debug displaced on').  The two interesting lines contain the
> strings 'original insn' and 'replacement insn':
> 
>   (gdb) step
>   [displaced] displaced_step_prepare_throw: displaced-stepping 2073893.2073893.0 now
>   [displaced] prepare: selected buffer at 0x401052
>   [displaced] prepare: saved 0x401052: 1e fa 31 ed 49 89 d1 5e 48 89 e2 48 83 e4 f0 50
>   [displaced] prepare:    original insn 0x401030: ff 25 e2 2f 00 00	jmp    *0x2fe2(%rip)        # 0x404018 <puts@got.plt>
>   [displaced] fixup_riprel: %rip-relative addressing used.
>   [displaced] fixup_riprel: using temp reg 2, old value 0x7ffff7f8a578, new value 0x401036
>   [displaced] amd64_displaced_step_copy_insn: copy 0x401030->0x401052: ff a1 e2 2f 00 00 68 00 00 00 00 e9 e0 ff ff ff
>   [displaced] prepare: replacement insn 0x401052: ff a1 e2 2f 00 00	jmp    *0x2fe2(%rcx)
>   [displaced] displaced_step_prepare_throw: prepared successfully thread=2073893.2073893.0, original_pc=0x401030, displaced_pc=0x401052
>   [displaced] finish: restored 2073893.2073893.0 0x401052
>   [displaced] amd64_displaced_step_fixup: fixup (0x401030, 0x401052), insn = 0xff 0xa1 ...
>   [displaced] amd64_displaced_step_fixup: restoring reg 2 to 0x7ffff7f8a578
>   0x00007ffff7e402c0 in puts () from /lib64/libc.so.6
>   (gdb)
> 
> One final note.  For many targets that support displaced stepping (in
> fact all targets except ARM) the replacement instruction is always a
> single instruction.  But on ARM the replacement could actually be a
> series of instructions.  The debug code tries to handle this by
> disassembling the entire displaced stepping buffer.  Obviously this
> might actually print more than is necessary, but there's (currently)
> no easy way to know how many instructions to disassemble; that
> knowledge is all locked in the architecture specific code.  Still I
> don't think it really hurts, if someone is looking at this debug then
> hopefully they known what to expect.

The obvious idea (although maybe not obvious to implement) is for the
arch code to return the number of bytes it used in the buffer.

> @@ -43,6 +44,24 @@ show_debug_displaced (struct ui_file *file, int from_tty,
>    gdb_printf (file, _("Displace stepping debugging is %s.\n"), value);
>  }
>  
> +/* See displaced-stepping.h.  */
> +
> +std::string
> +displaced_step_dump_bytes (const gdb_byte *buf, size_t len)
> +{
> +  std::string ret;
> +
> +  for (size_t i = 0; i < len; i++)
> +    {
> +      if (i == 0)
> +	ret += string_printf ("%02x", buf[i]);
> +      else
> +	ret += string_printf (" %02x", buf[i]);
> +    }
> +
> +  return ret;
> +}

Kinda unrelated to your change, but if you feel like it: this function
isn't really specific to displaced stepping.  I could see it living in
some util file in gdbsupport, as "dump_bytes".  It could also take a
gdb::array_view.

Simon

  parent reply	other threads:[~2023-03-21 14:45 UTC|newest]

Thread overview: 36+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-02-23 15:46 [PATCH 0/3] AMD64 Displaced Stepping Fix Andrew Burgess
2023-02-23 15:46 ` [PATCH 1/3] gdb: more debug output for displaced stepping Andrew Burgess
2023-02-23 15:46 ` [PATCH 2/3] gdb: remove gdbarch_displaced_step_fixup_p Andrew Burgess
2023-02-23 15:46 ` [PATCH 3/3] gdb: fix reg corruption from displaced stepping on amd64 Andrew Burgess
2023-03-16 16:39 ` [PATCHv2 0/4] AMD64 Displaced Stepping Fix Andrew Burgess
2023-03-16 16:39   ` [PATCHv2 1/4] gdb: more debug output for displaced stepping Andrew Burgess
2023-03-21 12:29     ` Pedro Alves
2023-03-21 14:41       ` Simon Marchi
2023-03-22 21:17         ` [PATCHv2 0/2] displaced stepping debug improvements Andrew Burgess
2023-03-22 21:17           ` [PATCHv2 1/2] gdb: more debug output for displaced stepping Andrew Burgess
2023-03-22 21:17           ` [PATCHv2 2/2] gdb: move displaced_step_dump_bytes into gdbsupport (and rename) Andrew Burgess
2023-03-27 12:35           ` [PATCHv2 0/2] displaced stepping debug improvements Andrew Burgess
2023-03-21 14:45     ` Simon Marchi [this message]
2023-03-16 16:39   ` [PATCHv2 2/4] gdb: remove gdbarch_displaced_step_fixup_p Andrew Burgess
2023-03-21 13:10     ` Pedro Alves
2023-03-22 21:22       ` Andrew Burgess
2023-03-16 16:39   ` [PATCHv2 3/4] gdb: fix reg corruption from displaced stepping on amd64 Andrew Burgess
2023-03-21 13:23     ` Pedro Alves
2023-03-16 16:39   ` [PATCHv2 4/4] gdb: remove redundant signal passing Andrew Burgess
2023-03-27 12:32   ` [PATCHv3 0/3] AMD64 Displaced Stepping Fix Andrew Burgess
2023-03-27 12:32     ` [PATCHv3 1/3] gdb: more debug output for displaced stepping Andrew Burgess
2023-03-28 13:05       ` Simon Marchi
2023-03-28 15:08         ` Andrew Burgess
2023-03-28 15:11           ` Simon Marchi
2023-03-29  9:42             ` Andrew Burgess
2023-03-27 12:32     ` [PATCHv3 2/3] gdb: move displaced_step_dump_bytes into gdbsupport (and rename) Andrew Burgess
2023-03-28 13:10       ` Simon Marchi
2023-03-29  9:43         ` Andrew Burgess
2023-03-27 12:32     ` [PATCHv3 3/3] gdb: fix reg corruption from displaced stepping on amd64 Andrew Burgess
2023-03-29  9:43       ` Pedro Alves
2023-03-28 12:33     ` [PATCHv3 0/3] AMD64 Displaced Stepping Fix Simon Marchi
2023-03-28 15:29       ` Andrew Burgess
2023-03-29 13:46     ` [PATCHv4] gdb: fix reg corruption from displaced stepping on amd64 Andrew Burgess
2023-04-04 13:03       ` Pedro Alves
2023-04-06 13:29         ` Andrew Burgess
2023-04-06 15:38           ` Andrew Burgess

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=46b9208a-f051-786d-76db-956a3362e26b@simark.ca \
    --to=simark@simark.ca \
    --cc=aburgess@redhat.com \
    --cc=gdb-patches@sourceware.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).