Re: gdbstub initial code, v7

2010-09-03 Thread Jan Kratochvil
On Thu, 02 Sep 2010 22:06:32 +0200, Oleg Nesterov wrote:
 I assume that qXfer:siginfo:read always mean Hg thread.

It seems so.

 It is not clear to me what should ugdb report if there is no a valid
 siginfo.  linux_xfer_siginfo() return E01, but gdbserver uses SIGSTOP to
 stop the tracee,

I find error more appropriate in such case.

 Likewise, it is not clear what should ugdb do if gdb sends
 $CSIG in this case.

Currently GDB does not do anything special, that is if there is siginfo for
signal SIGUSR1 but one does $C0B (SIGSEGV) does ptrace reset the siginfo or is
left the SIGUSR1 siginfo for SIGSEGV?

 But this all is minor, I think.

As this is being discussed for GDB I would find enough to just make $_siginfo
accessible without these details.


Thanks,
Jan



Re: gdbstub initial code, v7

2010-09-03 Thread Frank Ch. Eigler
Oleg Nesterov o...@redhat.com writes:

 [...]  To the point, I had to add printk's to utrace.c to understand
 what is wrong. Hopefully tomorrow.

You might wish to try out systemtap for such purposes.  It's easy to
insert printk-like tracing at almost any point; monitor variables for
changes, pretty-print structs, etc.  No recompilation/reboot.

- FChE



Re: gdbstub initial code, v7

2010-09-03 Thread Roland McGrath
 Currently GDB does not do anything special, that is if there is siginfo for
 signal SIGUSR1 but one does $C0B (SIGSEGV) does ptrace reset the siginfo or is
 left the SIGUSR1 siginfo for SIGSEGV?

The kernel considers this sloppy behavior on the debugger's part.  If
you inject a different signal, we expect you should PTRACE_SETSIGINFO
to something appropriate, or else that you really didn't care about
the bits being accurate.  If the resumption signal does not match the
siginfo_t.si_signo, then the kernel resets the siginfo as if the
debugger had just used kill with the new signal (i.e. si_pid, si_uid
point to the ptracer).


Thanks,
Roland



Re: gdbstub initial code, v7

2010-09-03 Thread Jan Kratochvil
On Fri, 03 Sep 2010 21:59:06 +0200, Roland McGrath wrote:
  Currently GDB does not do anything special, that is if there is siginfo for
  signal SIGUSR1 but one does $C0B (SIGSEGV) does ptrace reset the siginfo or 
  is
  left the SIGUSR1 siginfo for SIGSEGV?
 
 The kernel considers this sloppy behavior on the debugger's part.  If
 you inject a different signal, we expect you should PTRACE_SETSIGINFO
 to something appropriate, or else that you really didn't care about
 the bits being accurate.  If the resumption signal does not match the
 siginfo_t.si_signo, then the kernel resets the siginfo as if the
 debugger had just used kill with the new signal (i.e. si_pid, si_uid
 point to the ptracer).

OK, that seems to me as the best choice.  Sorry I did not test/read it.


Thanks,
Jan



Re: [PATCH 0/3] UTRACE_DETACH fixes

2010-09-03 Thread Roland McGrath
 Hmm. I am not sure I understand. If -report_signal != NULL, then
 you can't expect -report_quiesce() after utrace_control(INTERRUPT) ?

Sorry, I used report_quiesce as shorthand for either report_quiesce, or
report_signal with UTRACE_SIGNAL_REPORT.

  So, it is technically kosher enough to use UTRACE_INTERRUPT without
  UTRACE_EVENT(QUIESCE) set, if you really know the situation and are sure
  about all those caveats above.
 
 How? see below.

I mentioned the examples.

  But, it's only UTRACE_EVENT(QUIESCE) that
  gives you any expectation of an extra callback for no event from either
  UTRACE_REPORT or UTRACE_INTERRUPT.
 
 Yes, this is clear too.

Apparently not. ;-)

 So. Now I am even more confused. First of all, ugdb (at least currently)
 does not need report_quiesce() and UTRACE_EVENT(QUIESCE) at all. OK, this
 is not 100% true due to multitracing/etc, lets ignore this. Anyway it
 makes sense to clear QUIESCE after $c to avoid the unnecessary callbacks.
 
 All it needs is -report_signal(). But, the problem is, it is not called
 after utrace_control(INTERRUPT) ! You need QUIESCE to ensure report_signal()
 will be called, and this looks at least strange to me.

QUIESCE is the only event type for no event.  If you only asked for
signal events, then you only get a callback when there is an actual signal
event.  If you want an extra callback before dequeuing any signal, then
that is what QUIESCE is for.

 Once again, I am not asking to change utrace now, but could you explain
 what is wrong with the patch below?

That gives an extra unrequested report_signal callback to every engine that
is only interested in some signal event.  Consider a crash-catcher
engine.  It would only track UTRACE_EVENT(SIGNAL_CORE) (and perhaps CLONE
for its bookkeeping).  This engine never asked for a callback before each
and every attempt to dequeue any signal, which is what you would give it
with your change.


Thanks,
Roland