From: Steve Tuckner Date: 2003-10-30T01:56:29+09:00 Subject: Re: Win32OLE again Ok here are some bizarre results. When I reduce my script to just a require and a new call, and I reduce the extension to defining one real method, then I can make it fail depending on how many other methods I define. In my Init_win32ole2 function, I define n dummy methods. If I define 35 or below of them, it will get through the new call. If I define 36 or above of them it will segfault. I found this by discovering that if I commented out some of the method, class, etc, definitions in the real Init_win32ole function, then it started to work. My build environment is Visual C++ 6. The makefile was generated by the extconf.rb that came with win32ole. I just modified it to use win32ole2 instead. Does anyone have any ideas what is going wrong here or how I should proceed further? I feel that I have reduced it down to the bare minimum so there must be something simple that is not being done for 1.8. This test works in 1.6 with values as high as 1000. Thanks, Steve Tuckner > -----Original Message----- > From: ts [mailto:decoux@moulon.inra.fr] > Sent: Wednesday, October 29, 2003 5:35 AM > To: ruby-talk ML > Cc: ruby-talk@ruby-lang.org > Subject: Re: Win32OLE again > > > >>>>> "S" == Steve Tuckner writes: > > S> Please anyone who has written C extensions or the author > of Win32OLE, > S> let me know what is wrong with calling free on pointers > allocated with > S> ALLOC_N. > > Well there is nothing wrong with calling free with ALLOC_N > because like > you've found ALLOC_N is just a call to malloc(). > > But if it exist an error in the C extensions (bad memory management > *elsewhere*) then the memory pool can be corrupted and this > can explain > the crash. > > Perhaps the error is in the extension Win32OLE (well, I > don't know what > do this extension and I've not looked at the source) > > > Guy Decoux > > > > > > > > =0A= SHELL =3D /bin/sh=0A= =0A= #### Start of system configuration section. ####=0A= =0A= srcdir =3D .=0A= topdir =3D $(rubylibdir)/$(arch)=0A= hdrdir =3D $(rubylibdir)/$(arch)=0A= VPATH =3D $(srcdir)=0A= =0A= DESTDIR =3D d:=0A= prefix =3D $(DESTDIR)/a/ruby180=0A= exec_prefix =3D $(prefix)=0A= bindir =3D $(exec_prefix)/bin=0A= sitelibdir =3D $(sitedir)/$(ruby_version)=0A= datadir =3D $(prefix)/share=0A= sitedir =3D $(prefix)/lib/ruby/site_ruby=0A= sharedstatedir =3D $(DESTDIR)/etc=0A= archdir =3D $(rubylibdir)/$(arch)=0A= localstatedir =3D $(DESTDIR)/var=0A= infodir =3D $(prefix)/info=0A= oldincludedir =3D $(DESTDIR)/usr/include=0A= libexecdir =3D $(exec_prefix)/libexec=0A= compile_dir =3D = $(DESTDIR)/pp/ruby/installer/ruby180/download/ruby/win32=0A= sbindir =3D $(exec_prefix)/sbin=0A= includedir =3D $(prefix)/include=0A= sysconfdir =3D $(prefix)/etc=0A= sitearchdir =3D $(sitelibdir)/$(sitearch)=0A= mandir =3D $(prefix)/man=0A= libdir =3D $(exec_prefix)/lib=0A= rubylibdir =3D $(libdir)/ruby/$(ruby_version)=0A= =0A= CC =3D cl -nologo=0A= LIBRUBY =3D $(RUBY_SO_NAME).lib=0A= LIBRUBY_A =3D $(RUBY_SO_NAME)-static.lib=0A= LIBRUBYARG_SHARED =3D $(LIBRUBY)=0A= LIBRUBYARG_STATIC =3D $(LIBRUBY_A)=0A= =0A= CFLAGS =3D /W3 =0A= CPPFLAGS =3D -I. -I$(topdir) -I$(hdrdir) -I$(srcdir) -I. -I./.. = -I./../missing=0A= CXXFLAGS =3D $(CFLAGS) =0A= DLDFLAGS =3D -link -incremental:no -pdb:none -dll $(LIBPATH) = -def:$(DEFFILE) =0A= LDSHARED =3D cl -nologo -LD=0A= AR =3D lib -nologo=0A= EXEEXT =3D .exe=0A= =0A= RUBY_INSTALL_NAME =3D ruby=0A= RUBY_SO_NAME =3D msvcrt-ruby18=0A= arch =3D i386-mswin32=0A= sitearch =3D i386-msvcrt=0A= ruby_version =3D 1.8=0A= RUBY =3D ruby=0A= RM =3D $(RUBY) -rftools -e "File::rm_f(*ARGV.map = do|x|Dir[x]end.flatten.uniq)"=0A= MAKEDIRS =3D $(RUBY) -r ftools -e 'File::makedirs(*ARGV)'=0A= INSTALL_PROG =3D $(RUBY) -r ftools -e 'File::install(ARGV[0], ARGV[1], = 0755, true)'=0A= INSTALL_DATA =3D $(RUBY) -r ftools -e 'File::install(ARGV[0], ARGV[1], = 0644, true)'=0A= =0A= #### End of system configuration section. ####=0A= =0A= =0A= LIBPATH =3D -libpath:"$(libdir)"=0A= DEFFILE =3D win32ole2.def=0A= =0A= CLEANFILES =3D =0A= DISTCLEANFILES =3D =0A= =0A= target_prefix =3D =0A= LOCAL_LIBS =3D =0A= LIBS =3D $(LIBRUBYARG_SHARED) advapi32.lib user32.lib uuid.lib = oleaut32.lib ole32.lib oldnames.lib user32.lib advapi32.lib = wsock32.lib =0A= OBJS =3D win32ole2.obj=0A= TARGET =3D win32ole2=0A= DLLIB =3D $(TARGET).so=0A= =0A= RUBYCOMMONDIR =3D $(sitedir)$(target_prefix)=0A= RUBYLIBDIR =3D $(sitelibdir)$(target_prefix)=0A= RUBYARCHDIR =3D $(sitearchdir)$(target_prefix)=0A= =0A= CLEANLIBS =3D "$(TARGET).{lib,exp,il?,tds,map}" $(DLLIB)=0A= CLEANOBJS =3D "*.{obj,lib,s[ol],pdb,bak}"=0A= =0A= all: $(DLLIB)=0A= =0A= clean:=0A= @$(RM) $(CLEANLIBS) $(CLEANOBJS) $(CLEANFILES)=0A= =0A= distclean: clean=0A= @$(RM) Makefile extconf.h conftest.* mkmf.log=0A= @$(RM) core ruby$(EXEEXT) *~ $(DISTCLEANFILES)=0A= =0A= realclean: distclean=0A= install: $(RUBYARCHDIR)=0A= install: $(RUBYARCHDIR)/$(DLLIB)=0A= $(RUBYARCHDIR)/$(DLLIB): $(DLLIB) $(RUBYARCHDIR)=0A= @$(INSTALL_PROG) $(DLLIB) $(RUBYARCHDIR)=0A= install: $(RUBYLIBDIR)=0A= install: $(RUBYLIBDIR)/oleproperty.rb=0A= $(RUBYLIBDIR)/oleproperty.rb: $(srcdir)/lib/oleproperty.rb = $(RUBYLIBDIR)=0A= @$(INSTALL_DATA) $(srcdir)/lib/oleproperty.rb $(RUBYLIBDIR)=0A= $(RUBYARCHDIR):=0A= @$(MAKEDIRS) $(RUBYARCHDIR)=0A= $(RUBYLIBDIR):=0A= @$(MAKEDIRS) $(RUBYLIBDIR)=0A= =0A= site-install: install=0A= =0A= .SUFFIXES: .c .cc .m .cxx .cpp .C .obj=0A= =0A= {$(srcdir)}.cc{}.obj:=0A= $(CXX) $(CXXFLAGS) $(CPPFLAGS) -c -Tp$(<:\=3D/)=0A= =0A= .cc.obj:=0A= $(CXX) $(CXXFLAGS) $(CPPFLAGS) -c -Tp$(<:\=3D/)=0A= =0A= {$(srcdir)}.cpp{}.obj:=0A= $(CXX) $(CXXFLAGS) $(CPPFLAGS) -c -Tp$(<:\=3D/)=0A= =0A= .cpp.obj:=0A= $(CXX) $(CXXFLAGS) $(CPPFLAGS) -c -Tp$(<:\=3D/)=0A= =0A= {$(srcdir)}.cxx{}.obj:=0A= $(CXX) $(CXXFLAGS) $(CPPFLAGS) -c -Tp$(<:\=3D/)=0A= =0A= .cxx.obj:=0A= $(CXX) $(CXXFLAGS) $(CPPFLAGS) -c -Tp$(<:\=3D/)=0A= =0A= {$(srcdir)}.C{}.obj:=0A= $(CXX) $(CXXFLAGS) $(CPPFLAGS) -c -Tp$(<:\=3D/)=0A= =0A= .C.obj:=0A= $(CXX) $(CXXFLAGS) $(CPPFLAGS) -c -Tp$(<:\=3D/)=0A= =0A= {$(srcdir)}.c{}.obj:=0A= $(CC) $(CFLAGS) $(CPPFLAGS) -c -Tc$(<:\=3D/)=0A= =0A= .c.obj:=0A= $(CC) $(CFLAGS) $(CPPFLAGS) -c -Tc$(<:\=3D/)=0A= =0A= $(DLLIB): $(OBJS)=0A= @-$(RM) $@=0A= @-$(RM) $(TARGET).lib=0A= $(LDSHARED) -Fe$(@) $(OBJS) $(LIBS) $(LOCAL_LIBS) $(DLDFLAGS)=0A= =0A= ###=0A= win32ole2.obj : $(hdrdir)/ruby.h $(hdrdir)/config.h = $(hdrdir)/defines.h=0A= #include "ruby.h" static VALUE fev_s_new(argc, argv, klass) int argc; VALUE *argv; VALUE klass; { char *pstr; printf("In WIN32OLE_EVENT.new\n"); pstr = ALLOC_N(char, 11); printf("pstr = %8.8lx\n", pstr); printf("In WIN32OLE_EVENT.new 1\n"); free(pstr); printf("In WIN32OLE_EVENT.new 2\n"); } static VALUE dummy_method(VALUE self) { } VALUE cWIN32OLE_EVENT; void Init_win32ole2() { int i; char s[100]; cWIN32OLE_EVENT = rb_define_class("WIN32OLE_EVENT", rb_cObject); for (i = 0; i < 35; i++) { sprintf(s, "default%d", i); rb_define_method(cWIN32OLE_EVENT, s, dummy_method, 0); } rb_define_singleton_method(cWIN32OLE_EVENT, "new", fev_s_new, -1); } EXPORTS=0A= Init_win32ole2=0A= require "win32ole2" ev = WIN32OLE_EVENT.new()