This is the mail archive of the cygwin-developers@sourceware.cygnus.com mailing list for the Cygwin project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]

efence problems - answered


Hi Chris,

	I was messing around with efence because of the discussions in the
developers list.  Here is what I have discovered...  All the following
occurs during cygwin1.dll startup.  The program was a simple hello world
program with a malloc(1000) thrown in.

1) during DLL initialization, a call to malloc is made.  Since I am
linked with efence, the efence malloc gets called.  In
efence.c:initialize() a call to getenv() is made to find is there is an
environment variable EF_ALIGNMENT.  

Program received signal SIGSEGV, Segmentation fault.
0x61006f92 in _findenv (name=0x401663 "EF_ALIGNMENT", offset=0x258fd70)
    at /d/src/winsup/environ.cc:147
147       return NULL;
(gdb) where
#0  0x61006f92 in _findenv (name=0x401663 "EF_ALIGNMENT",
offset=0x258fd70)
    at /d/src/winsup/environ.cc:147
#1  0x61006fb7 in getenv (name=0x401663 "EF_ALIGNMENT")
    at /d/src/winsup/environ.cc:161
#2  0x4016e0 in initialize () at efence.c:326
#3  0x402435 in malloc (size=16) at efence.c:892
#4  0x6101da9e in malloc (size=16) at /d/src/winsup/malloc.cc:42
#5  0x6101ddff in malloc_init () at /d/src/winsup/malloc.cc:156
#6  0x6101bf9a in heap_init () at /d/src/winsup/heap.cc:46
#7  0x610041d3 in dll_crt0_1 () at /d/src/winsup/dcrt0.cc:616
#8  0x610045d7 in dll_crt0 (uptr=0x4040e0) at /d/src/winsup/dcrt0.cc:770
#9  0x402b6a in cygwin_crt0 (f=0x40152c <main>) at
/d/src/winsup/libccrt0.cc:82
(gdb)

However, It looks like the 'environ' variable which holds the
environment is not inited yet.  Hence, a seg-fault.
(The following is in environ.cc)

(gdb) n
137           len++;
(gdb) n
140       for (p = environ; *p; ++p)
(gdb) p environ
$1 = (char **) 0x0
(gdb) p *p
$2 = 0x258fe0c "\034_X\002j+@"
(gdb) whatis p
type = char **
(gdb) whatis *p
type = char *
(gdb) p (short)(char *)p
$3 = 16608
(gdb) whatis p
type = char **
(gdb) n

Program received signal SIGSEGV, Segmentation fault.
0x61006f92 in _findenv (name=0x401663 "EF_ALIGNMENT", offset=0x258fd70)
    at /d/src/winsup/environ.cc:147
147       return NULL;

I modified efence not to use the environment variables, and this
behavior stopped.  Then the following occurred...


2)  in efence.c:initialize() it calls page.c:Page_Create(). 
Page_Create() calls mmap().

(mmap.cc:175)   mmapped_areas = new map;
     	 	if (mmapped_areas == 0)
        	{
        	  	set_errno (ENOMEM);
          		syscall_printf ("-1 = mmap(): ENOMEM");
          		return (caddr_t) -1;
        	}
    		

mmap() uses the C++ new method for allocating memory.  However, when we
look at the stack trace we see that 
'new' eventually uses malloc(), which call efence.c:malloc which calls
efence.c:initialize() which calls page.c:Page_Create() which calls
mmap().........  This continues until a seg-fault occurs.  I don't know
a solution for this one.

Thanks,
John Fortin

(gdb) run
The program being debugged has been started already.
Start it from the beginning? (y or n) y
Starting program: /e/efence/hello.exe
GDI32.DLL (symbols previously loaded)
USER32.DLL (symbols previously loaded)
KERNEL32.DLL (symbols previously loaded)
ADVAPI32.DLL (symbols previously loaded)
CYGWIN1.DLL (symbols previously loaded)

Program received signal SIGSEGV, Segmentation fault.
write (fd=4198520, buf=0x59205c, cnt=0)
    at /d/src/newlib/libc/syscalls/syswrite.c:11
11      {
(gdb) where
#0  write (fd=4198520, buf=0x59205c, cnt=0)
    at /d/src/newlib/libc/syscalls/syswrite.c:11
#1  0x402465 in EF_Print (
    pattern=0x401078 "\n  Electric Fence 2.2.0 Copyright (C) 1987-1999
Bruce Per
ens <bruce@perens.com>\n") at print.c:182
#2  0x40113d in initialize () at efence.c:297
#3  0x401ead in malloc (size=12) at efence.c:892
#4  0x6101da9e in malloc (size=12) at /d/src/winsup/malloc.cc:42
#5  0x6105ffbb in new_eh_context ()
#6  0x6106003d in eh_context_static ()
#7  0x6105fffa in __get_eh_context ()
#8  0x61060eb9 in __builtin_new (sz=12)
#9  0x6101e324 in mmap (addr=0x0, len=1048576, prot=3, flags=34, fd=-1,
off=0)
    at /d/src/winsup/mmap.cc:175
#10 0x401f8d in Page_Create (size=1048576) at page.c:71
#11 0x40139c in initialize () at efence.c:395
#12 0x401ead in malloc (size=12) at efence.c:892
#13 0x6101da9e in malloc (size=12) at /d/src/winsup/malloc.cc:42
#14 0x6105ffbb in new_eh_context ()
#15 0x6106003d in eh_context_static ()
#16 0x6105fffa in __get_eh_context ()
#17 0x61060eb9 in __builtin_new (sz=12)
#18 0x6101e324 in mmap (addr=0x0, len=1048576, prot=3, flags=34, fd=-1,
off=0)
    at /d/src/winsup/mmap.cc:175
#19 0x401f8d in Page_Create (size=1048576) at page.c:71
#20 0x40139c in initialize () at efence.c:395
#21 0x401ead in malloc (size=12) at efence.c:892
#22 0x6101da9e in malloc (size=12) at /d/src/winsup/malloc.cc:42
#23 0x6105ffbb in new_eh_context ()
#24 0x6106003d in eh_context_static ()
#25 0x6105fffa in __get_eh_context ()
#26 0x61060eb9 in __builtin_new (sz=12)
#27 0x6101e324 in mmap (addr=0x0, len=1048576, prot=3, flags=34, fd=-1,
off=0)
    at /d/src/winsup/mmap.cc:175
#28 0x401f8d in Page_Create (size=1048576) at page.c:71
#29 0x40139c in initialize () at efence.c:395
#30 0x401ead in malloc (size=12) at efence.c:892
#31 0x6101da9e in malloc (size=12) at /d/src/winsup/malloc.cc:42
#32 0x6105ffbb in new_eh_context ()
#33 0x6106003d in eh_context_static ()
#34 0x6105fffa in __get_eh_context ()
#35 0x61060eb9 in __builtin_new (sz=12)
#36 0x6101e324 in mmap (addr=0x0, len=1048576, prot=3, flags=34, fd=-1,
off=0)
    at /d/src/winsup/mmap.cc:175
#37 0x401f8d in Page_Create (size=1048576) at page.c:71
#38 0x40139c in initialize () at efence.c:395

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]