GDB and libthr

Daniel Eischen eischen at vigrid.com
Mon Oct 13 04:54:38 PDT 2003


On 13 Oct 2003, Doug Rabson wrote:

> I just upgraded one of my systems to the latest current and I came
> across some problems with libthr. A program which I was working on
> suddenly found itself linked against libthr (presumably because of a new
> version of libmap.conf or similar) and I found myself completely unable
> to debug it. This was not a threaded application, merely one which had
> linked against libthr.
> 
> The symtoms are that when running the application under gdb, it quickly
> hangs and starts consuming as much CPU time as it can. I looked into
> things carefully and at the bottom of things, I discovered that when a
> libthr mutex is held, the process blocks out SIGTRAP (among other
> things). If the application hits a breakpoint while the mutex is held,
> everything quickly goes pear shaped since the application doesn't get
> the SIGTRAP. Basically it gets into a tight loop of hitting the
> breakpoint, getting a signal, ignoring it and then trying to execute the
> breakpoint instruction again.
> 
> Since this also happens when dlopen is called (there is always a
> breakpoint inside the dynamic linker to keep GDB's list of shared
> libraries up to date) and since comon apis such as getpwuid end up in
> dlopen via nsdispatch, it becomes impossible to run many applications
> even without setting breakpoints.
> 
> The simplest change which fixed things for me was to remove SIGTRAP from
> the list of signals blocked on mutex entry:

I don't maintain libthr, but this looks OK to me.

> 
> Index: thr_kern.c
> ===================================================================
> RCS file: /home/ncvs/src/lib/libthr/thread/thr_kern.c,v
> retrieving revision 1.13
> diff -u -r1.13 thr_kern.c
> --- thr_kern.c	8 Jul 2003 09:58:23 -0000	1.13
> +++ thr_kern.c	12 Oct 2003 12:05:39 -0000
> @@ -80,6 +80,7 @@
>  #ifdef _PTHREADS_INVARIANTS
>  	SIGDELSET(set, SIGABRT);
>  #endif
> +	SIGDELSET(set, SIGTRAP);
>  
>  	/* If we have already blocked signals, just up the refcount */
>  	if (++curthread->signest > 1)
> 
> 
> 

-- 
Dan Eischen



More information about the freebsd-threads mailing list