8.2 + apache == a LOT of sigprocmask
Kostik Belousov
kostikbel at gmail.com
Sun Nov 20 18:34:39 UTC 2011
On Fri, Nov 18, 2011 at 12:07:51PM -0800, Doug Barton wrote:
> On 11/18/2011 01:19, Kostik Belousov wrote:
> > On Fri, Nov 18, 2011 at 12:00:57AM -0800, Doug Barton wrote:
> >> On 11/17/2011 02:57, Kostik Belousov wrote:
> >>>>> It's not catching there though:
> >>>>>
> >>>>> Reading symbols from /libexec/ld-elf.so.1...done.
> >>>>> Loaded symbols for /libexec/ld-elf.so.1
> >>>>> 0x28183b2d in accept () at accept.S:3
> >>>>> 3 RSYSCALL(accept)
> >>>>> (gdb) c
> >>>>> Continuing.
> >>>>> no thread to satisfy query
> >>>>> 0x28183b2d in accept () at accept.S:3
> >>>>> 3 RSYSCALL(accept)
> >>>>> (gdb) info threads
> >>>>> Cannot get thread info: invalid key
> >>>>> (gdb)
> >>> Err, the other part of my message was that you shall set the breakpoint
> >>> on sigprocmask.
> >>
> >> I'm sorry I'm not making myself clear. We are setting the breakpoint on
> >> sigprocmask. But, maybe I'm doing it wrong. Can you give precise
> >> instructions as to what you want me to do, from the beginning? Sorry to
> >> be so dense.
> > Find the pid of the process issuing excessive number of sigprocmask
> > calls. Do
> > $ gdb /usr/local/bin/httpd
> > (gdb) attach <pid>
> > (gdb) b _sigprocmask
> > (gdb) c
> > Bah ! Breakpoint fired.
> > (gdb) bt
> > (gdb) c
> > <... Repeat ... >
>
> Right, so we're on the same page at least. I've been abbreviating the
> output of gdb to make it easier to see the problem, but here is a
> (nearly) complete transcript:
>
> gdb /usr/local/bin/httpd
> Copyright 2004 Free Software Foundation, Inc.
> GDB is free software, covered by the GNU General Public License, and you are
> welcome to change it and/or distribute copies of it under certain
> conditions.
> Type "show copying" to see the conditions.
> There is absolutely no warranty for GDB. Type "show warranty" for details.
> This GDB was configured as "i386-marcel-freebsd"...
> (gdb) attach 1380
> Attaching to program: /usr/local/bin/httpd, process 1380
> Reading symbols from .... (lots of symbol-reading snipped)
> 3 RSYSCALL(accept)
> Current language: auto; currently asm
> (gdb) b _sigprocmask
> Breakpoint 1 at 0x282d9055: file /usr/src/lib/libthr/thread/thr_sig.c,
> line 210.
> (gdb) c
> Continuing.
> no thread to satisfy query
> 0x28183b2d in accept () at accept.S:3
> 3 RSYSCALL(accept)
> (gdb) c
> Continuing.
> no thread to satisfy query
> 0x28183b2d in accept () at accept.S:3
> 3 RSYSCALL(accept)
> (gdb) c
> Continuing.
> no thread to satisfy query
> 0x28183b2d in accept () at accept.S:3
> 3 RSYSCALL(accept)
>
> .... etc.
This is an issue with either your environment or your gdb, or bug in gdb.
It seems that 'continue' did not worked for you at all. I tried to reproduce
this locally, but was not able to.
And, I am unable to hit sigprocmask for my apache anywhere except rtld.
I also have libthr linked in.
So the way forward to catch sigprocmask callers is one of
- figure out why your gdb does not work and fix it; might be, try to use
gdb from ports.
- or add libunwind backtraces into sigprocmask
- or use dtrace (I doubt that 8.2 has neccessary usermode bits, and
seriously doubt its stability).
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 196 bytes
Desc: not available
Url : http://lists.freebsd.org/pipermail/freebsd-stable/attachments/20111120/adfff708/attachment.pgp
More information about the freebsd-stable
mailing list