On Wed, Feb 18, 2009 at 06:14:59AM +0100, Roland Mainz wrote: > Glenn Fowler wrote: > > On Fri, 13 Feb 2009 15:19:30 -0800 Edward Pilatowicz wrote: > > > > > > > > What does $ /usr/xpg4/bin/file /usr/bin/sleep /usr/bin/alias # say on > > > > the system where this fails ? > > > > well not mentioning libumem in the original message was quite an omission > > Erm... AFAIK libumem isn't the source of the problem. Solaris's libumem > is an alternative memory allocator which "overrides" the default > |libc::malloc()| and provides configurable debugging aids (in a similar > way as libast's internal memory corruption checks controlled via > VMDEBUG/VMCHECK/&co. - see > http://docs.sun.com/app/docs/doc/816-5168/umem-debug-3malloc?l=ja&a=view > for some documentation). AFAIK Edward was only using libumem to > track-down the source of the problem via libumem and the crash happens > with and without it. >
actually, i run everything with libumem all the time. the only time i don't pre-load libumem is when i know that application has memory corruption problems that will cause libumem to kill it. (and i usually file a bug on these issues before disabling libumem.) this means that i file a lot of memory corruption bugs against other programs. i don't think that you'll see this issue without libumem. > > we were careful in the solaris build to add an _ast_ prefix > > to any libast function that might interfere with solaris libc > > > > ast provides its own malloc/free, and those calls are mapped > > to _ast_malloc/_ast_free in the ksh/ast code for opensolaris builds > > so that call to free() in the stack trace was not done directly by > > any ksh/ast code > > Right... but it seems something has trashed the heap managed by > |libc::malloc()| - either something is writing randomly into areas where > it shouldn't write to... or maybe we hit bug in Solaris. > > > is there a description on how libumem allocates/frees physical memory? > > Uhm... good question... looking at > http://src.opensolaris.org/source/xref/onnv/onnv-gate/usr/src/lib/libumem/common/ > it seems to have at least support for |sbrk()| and |mmap()|. > libumem is a drop in place replace for libc malloc()/free(). so if an application never uses libc malloc()/free(), then it should never use libumem malloc/free. as you've noticed, it can be configured to use either sbrk() or mmap(). now, since libast has it's own malloc()/free() replacements, i would think that you need to somehow ensure that no-one (not even the linker) calls into libc malloc/free. otherwise you could end up with libc and libast allocating from the same heap... (which if you run with libumem, would be initialized to 0xdeadbeef.) ed