From: Daniel Jacobowitz <drow@false.org>
To: gdb@sourceware.org
Subject: Re: Stepping off breakpoints in non-stop debugging mode
Date: Sat, 08 Dec 2007 17:04:00 -0000 [thread overview]
Message-ID: <20071208170359.GA8777@caradoc.them.org> (raw)
In-Reply-To: <m33audczfp.fsf@codesourcery.com>
On Sat, Dec 08, 2007 at 01:23:38AM -0800, Jim Blandy wrote:
> - The current implementation of gdbarch_displaced_step_location is
> pretty questionable, but I'm not sure where else would be better.
Ditto. This may do.
> - It seems that it is never necessary to have more than one thread
> doing displaced stepping at a time --- or else the assert in
> displaced_step_prepare would trigger --- but I don't see why this
> should be so.
Isn't this because you haven't been testing combined with Vladimir's
leave-breakpoints-inserted code? resume is still going to force only
the current thread to resume and wait, so the single step will finish
before anything else gets a chance to hit a new breakpoint. Combine
those two patches, this will start happening. Add non-stop debugging
and it will happen even more.
> +static int
> +i386_syscall_p (gdb_byte *insn, ULONGEST *lengthp)
> +{
> + if (insn[0] == 0xcd)
> + {
> + *lengthp = 2;
> + return 1;
> + }
> +
> + return 0;
> +}
That's int, I assume. May need sysenter / syscall, depending on the
platform.
> + /* The list of issues to contend with here is taken from
> + resume_execution in arch/i386/kernel/kprobes.c, Linux 2.6.20.
> + Yay for Free Software! */
> +
> + /* Clear the TF flag in EFLAGS, which will always be set. */
> + {
> + ULONGEST eflags;
> + regcache_cooked_read_unsigned (regs, I386_EFLAGS_REGNUM, &eflags);
> + eflags &= ~I386_TF_MASK;
> + regcache_cooked_write_unsigned (regs, I386_EFLAGS_REGNUM, eflags);
> + }
Does this manual adjustment of TF apply to GDB? The kernel is
supposed to handle TF entirely inside ptrace, and expose the original
%eflags to GDB (though various kernel versions have gotten this wrong,
I believe it is right at last). So if TF is set here, that means the
program being debugged had TF set already.
> + /* Relocate the %eip, if necessary. */
> +
> + /* In the case of absolute or indirect jump or call instructions, or
> + a return instruction, the new %eip needs no relocation. */
> + if (i386_absolute_jmp_p (insn)
> + || i386_absolute_call_p (insn)
> + || i386_ret_p (insn))
> + ;
> +
> + /* Except in the case of absolute or indirect jump or call
> + instructions, or a return instruction, the new eip is relative to
> + the displaced instruction; make it relative. Well, signal
> + handler returns don't need relocation either, but we use the
> + value of %eip to recognize those; see below. */
> + if (! i386_absolute_jmp_p (insn)
> + && ! i386_absolute_call_p (insn)
> + && ! i386_ret_p (insn))
These two if statements look quite strange together.
--
Daniel Jacobowitz
CodeSourcery
next prev parent reply other threads:[~2007-12-08 17:04 UTC|newest]
Thread overview: 8+ messages / expand[flat|nested] mbox.gz Atom feed top
2007-12-08 9:23 Jim Blandy
2007-12-08 17:04 ` Daniel Jacobowitz [this message]
2007-12-10 23:05 ` Jim Blandy
2007-12-10 23:17 ` Daniel Jacobowitz
2007-12-11 18:24 ` Jim Blandy
2007-12-11 18:44 ` Daniel Jacobowitz
2007-12-17 3:31 ` Thiago Jung Bauermann
2007-12-17 19:41 ` Jim Blandy
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=20071208170359.GA8777@caradoc.them.org \
--to=drow@false.org \
--cc=gdb@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