From: Pedro Alves <pedro@codesourcery.com>
To: gdb@sourceware.org
Cc: Mark Kettenis <mark.kettenis@xs4all.nl>, drow@false.org
Subject: Re: Regression
Date: Tue, 10 Feb 2009 18:00:00 -0000 [thread overview]
Message-ID: <200902101800.35832.pedro@codesourcery.com> (raw)
In-Reply-To: <200902101606.23591.pedro@codesourcery.com>
Opps, my logs didn't show something as clearly as I indended:
> $1 = (void (*)()) 0xa43a633 <printf+19>
vs
> infrun: stop_pc = 0xeff4636
> Here, it seems like telling BSD to single-step, and, to deliver
> a signal at the same time, just single-steps, resulting in a SIGTRAP.
Errr, here it tells that I re-ran the inferior to get first PC, after
having pased the stop_pc bit already, from a previous run. Different runs,
different PCs, notice the randomization affecting the first bytes of the
addresses. Sorry for any confusion it may have caused.
Here's a run, to show how OpenBSD forgets to single-step into
the handler:
(gdb) p $pc
$1 = (void (*)()) 0x51b0633 <printf+19>
(gdb) signal SIGUSR1
Continuing with signal SIGUSR1.
infrun: clear_proceed_status_thread (process 18606)
infrun: proceed (addr=0xffffffff, signal=30, step=0)
infrun: resume (step=1, signal=30), trap_expected=1
infrun: wait_for_inferior (treat_exec_as_sigtrap=0)
infrun: target_wait (-1, status) = 18606, status->kind = stopped, signal = SIGTRAP
infrun: infwait_normal_state
infrun: TARGET_WAITKIND_STOPPED
infrun: stop_pc = 0x51b0636
Then, I've added a printf in the signal handler itself, to see
if it runs at all:
(gdb) signal SIGUSR1
Continuing with signal SIGUSR1.
infrun: clear_proceed_status_thread (process 1505)
infrun: proceed (addr=0xffffffff, signal=30, step=0)
infrun: resume (step=1, signal=30), trap_expected=1
infrun: wait_for_inferior (treat_exec_as_sigtrap=0)
handle_USR1
^^^^^^^^^^^ (1)
infrun: target_wait (-1, status) = 1505, status->kind = stopped, signal = SIGTRAP
infrun: infwait_normal_state
infrun: TARGET_WAITKIND_STOPPED
infrun: stop_pc = 0x6919636
infrun: no stepping, continue
infrun: resume (step=0, signal=0), trap_expected=0
^^^^^^^^^^^^^^ (2)
infrun: prepare_to_wait
my_array[2] is 3
infrun: target_wait (-1, status) = 1505, status->kind = exited, status = 0
infrun: infwait_normal_state
infrun: TARGET_WAITKIND_EXITED
So, it does run, according to (1) above, but, since we were stepping
over a breakpoint notice (trap_expected=1), GDB had removed breakpoints
from the inferior. They're only inserted on the following resume, at (2).
That's why you miss the breakpoint in the signal handler.
Without Daniel's patch, "signal FOO" *would not remove breakpoints*, since
it was calling `proceed' like if it was a "jump".
Here's the same on i386-linux:
Breakpoint 1, 0x00007ffff784ae40 in printf () from /lib/libc.so.6
(gdb) set debug infrun 1
(gdb) signal SIGUSR1
Continuing with signal SIGUSR1.
infrun: clear_proceed_status_thread (process 17569)
infrun: proceed (addr=0xffffffffffffffff, signal=30, step=0)
infrun: resume (step=1, signal=30), trap_expected=1
infrun: wait_for_inferior (treat_exec_as_sigtrap=0)
infrun: target_wait (-1, status) = 17569, status->kind = stopped, signal = SIGTRAP
infrun: infwait_normal_state
infrun: TARGET_WAITKIND_STOPPED
infrun: stop_pc = 0x400528
^^^^^^^^^^^^^^^^^^
infrun: no stepping, continue
infrun: resume (step=0, signal=0), trap_expected=0
infrun: prepare_to_wait
infrun: target_wait (-1, status) = 17569, status->kind = stopped, signal = SIGTRAP
infrun: infwait_normal_state
infrun: TARGET_WAITKIND_STOPPED
infrun: stop_pc = 0x40052f
infrun: BPSTAT_WHAT_STOP_NOISY
infrun: stop_stepping
Breakpoint 2, handle_USR1 (sig=10) at ../../../src/gdb/testsuite/gdb.base/annota1.c:19
19 }
That stop was a finished single-step to the start of the signal handler:
(gdb) disassemble 0x400528 (0x400528 + 100)
Dump of assembler code from 0x400528 to 0x40058c:
0x0000000000400528 <handle_USR1+0>: push %rbp
0x0000000000400529 <handle_USR1+1>: mov %rsp,%rbp
0x000000000040052c <handle_USR1+4>: mov %edi,-0x4(%rbp)
0x000000000040052f <handle_USR1+7>: leaveq
0x0000000000400530 <handle_USR1+8>: retq
(...)
So, linux can single-step into a signal handler, OpenBSD doesn't.
--
Pedro Alves
next prev parent reply other threads:[~2009-02-10 18:00 UTC|newest]
Thread overview: 12+ messages / expand[flat|nested] mbox.gz Atom feed top
2009-02-10 15:17 Regression Mark Kettenis
2009-02-10 15:27 ` Regression Daniel Jacobowitz
2009-02-10 15:47 ` Regression Mark Kettenis
2009-02-10 16:06 ` Regression Pedro Alves
2009-02-10 16:18 ` Regression Tristan Gingold
2009-02-10 18:00 ` Pedro Alves [this message]
2009-02-10 18:40 ` Regression Mark Kettenis
2009-02-10 19:05 ` Regression Pedro Alves
2009-02-10 19:18 ` Regression Pedro Alves
2009-02-10 19:27 ` Regression Pedro Alves
2009-02-11 15:50 ` Regression Daniel Jacobowitz
-- strict thread matches above, loose matches on Subject: below --
2009-02-10 15:14 Regression Mark Kettenis
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=200902101800.35832.pedro@codesourcery.com \
--to=pedro@codesourcery.com \
--cc=drow@false.org \
--cc=gdb@sourceware.org \
--cc=mark.kettenis@xs4all.nl \
/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