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).
pgplBF5ytqHkR.pgp
Description: PGP signature