FW: [ROOT] exception on delete in win32 debug dll.

From: Faine, Valeri (fine@bnl.gov)
Date: Wed Oct 16 2002 - 22:19:34 MEST


-----Original Message-----
From: Ed Oltman [mailto:eoltman@imago.com] 
Sent: Wednesday, October 16, 2002 3:25 PM
To: Faine, Valeri
Subject: RE: [ROOT] exception on delete in win32 debug dll.

Hi Valeri,

[NOTE: My last message bounced back from cern because "The domain
choiceone.net or
external relay through this domain is banned by the CERN." - we just
switched
to choiceone.net today.  This is why I cannot seem to post to
roottalk...]

1. Stack question:  The pushbutton calls CAnalysis::Reopen(), a class
method
in
my dll that clears out some objects (including the call to delete
m_pDeltaTof)
prior to reading in a new file.

2. break in dtor.  I set a breakpoint in TH1::~TH1() and saw every TH1
object
that got deleted.  m_pDeltaTof did not appear untill I hit the line
  delete m_pDeltaTof
in response to the toolbar button press.  Here is the trace at that
point:

TH1::~TH1() line 472
TH1F::~TH1F() line 5632 + 50 bytes
LIBHIST! TH1F::`vector deleting destructor'(unsigned int) + 84 bytes
CCuts::Reset() line 85 + 36 bytes
CAnalysis::Reopen() line 344
CManage::Reopen() line 156
G__CManage_Reopen_4_0(G__value * 0x01d63c9c, const char * 0x00000000,
G__param * 0x01d60f90, int 0) line 4758

So, it is a TH1F that I'm deleting.  The crash occurs in the dtor when
it
tries to
delete the TList *fFunctions.  The first is a "TF1" - the function
associated with
a gaus fit - that gets deleted just fine.  The other item in the
fFunctions
list is a
"TPaveStats" object.  It crashes when it attempts to delete this second
object.

The reason I suspected debug dll is because the program does not give an
exception
when it built in release mode.

Ed


> -----Original Message-----
> From: Faine, Valeri [mailto:fine@bnl.gov]
> Sent: Wednesday, October 16, 2002 1:21 PM
> To: 'Ed Oltman'
> Cc: roottalk@pcroot.cern.ch
> Subject: RE: [ROOT] exception on delete in win32 debug dll.
>
>
> Hi Ed,
>
> The bottom line:
>
> ---------------
> I don't think the problem you faced is related to "win32 debug dll".
> I'd like to call your attention TH1 objects are special.
>  ROOT keeps it in its internal lists and may delete when it finds it
is
> "appropriated".
> Probably you should set break point within that class dtor too see
when
> and where this dtor was called from.
> ---------------
>
> Your call stacks indicates you used some sort of "ToolBar" class
> and pushed some "toolbar" button. The last sends the "Cint statement
to
> be performed. That ends up somewhere within CINT with the exception.
> Can you tell us what this "PushButton" really does, which C++
statements
> it emits.  It looks like this Pushbutton tried to call some method of
> your class
> G__CManage_Reopen_4_0.
>
> I wondering if this is very place where you call your
>
>             delete m_pDeltaTof;
> from.
>
> Can you set a break point just before "delete" investigating the
object
> the m_pDeltaTof points to. Very likely this object has been killed
> already
> or R__b >> m_pDeltaTof made object of not TH1F type.
>
> I want to call you attention then when object is deleted it is that
> object class destructor job clean the memory the object occupied. If
> dtor doesn't clean the memory (why bother?) all data that belonged to
> the object are still there and you can see it with debugger but you
can
> not access any method of the class anymore.
>
> I mean you mentioned
>
> > > > At the time I delete m_pDeltaTof, I can examine it from the
> debugger -
> > > its intact -its got a title, name, bins, bin contents, etc..]
>
> This DOESN'T mean the object was not deleted. This simply means the
> object WAS there and may or may not there now. This means the memory
the
> object occupied has not been reused yet by another object.
>
>
> This should help
>
>                               Valeri
>
> > -----Original Message-----
> > From: Ed Oltman [mailto:eoltman@imago.com]
> > Sent: Wednesday, October 16, 2002 1:05 PM
> > To: Faine, Valeri
> > Cc: roottalk@pcroot.cern.ch
> > Subject: RE: [ROOT] exception on delete in win32 debug dll.
> >
> > Valeri,
> >   Yes, I can debug my program, but not the way you describe.  I use
> > Projects-->Settings-->Debug to point to the version of root I built
> > using cygwin w/export ROOTBUILD='debug'.  When I start the debugger,
> > I get a root window and I load my dll and start using it.
> >
> > Here's the line that causes the exception:
> >
> >      delete m_pDeltaTof;
> >
> > (called from with an object that earlier did
> >
> >      R__b >> m_pDeltaTof;
> >
> > where m_pDeltaTof is an object of type  TH1F*)
> >
> >
> > I'm wondering if there are any other switches that need to be
> > set when I build a debug version of root with cygwin.
> >
> > I am not using libNew.lib  - here is the list of libraries I link
> with:
> >
> > root libraries:
> > libCore.lib libCint.lib libHist.lib libMinuit.lib libGraf.lib
> > libGraf3d.lib
> > libGpad.lib libTree.lib libRint.lib libPostscript.lib libMatrix.lib
> > libPhysics.lib
> >
> > my own library (not code gets called from this)
> > rfftw2dll.lib
> >
> > windoze libraries:
> > kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib
> advapi32.lib
> > shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib
> >
> > Thanks..
> >
> > Ed
> >
> >
> >
> > Here are my call stacks:
> >
> > --------Thread that prints out exception warning  (its name is
> > $L19241)---------------
> >
> > G__ExceptionWrapper(int (G__value *, const char *, G__param *, int)*
> > 0x06158560 G__CManage_Reopen_4_0(G__value *, const char *, G__param
*,
> > int),
> > G__value * 0x01d63c9c, char * 0x00000000, G__param * 0x01d60f90, int
> > 0x00000000) line 357
> > G__call_cppfunc() line 440 + 21 bytes
> > G__interpret_func() line 5997 + 24 bytes
> > G__getfunction() line 1627 + 68 bytes
> > G__getitem() line 1925 + 22 bytes
> > G__getexpr() line 1386 + 42 bytes
> > G__exec_function() line 505 + 13 bytes
> > G__exec_statement() line 4381 + 42 bytes
> > G__exec_tempfile() line 379 + 12 bytes
> > G__process_cmd() line 3551 + 19 bytes
> > TCint::ProcessLine(const char * 0x01925044, TInterpreter::EErrorCode
*
> > 0x00000000) line 248 + 29 bytes
> > TApplication::ProcessLine(const char * 0x01925044, unsigned char
0x00,
> int
> > *
> > 0x00000000) line 657
> > TControlBarButton::Action() line 63
> > TWin32ControlBarImp::ExecThreadCB(TWin32SendClass * 0x018cf888) line
> 136
> > TWin32HookViaThread::ExecuteEvent(void * 0x01d6ff5c, unsigned char
> 0x01,
> > unsigned int 0x0000040c) line 121
> > ROOT_CmdLoop(void * 0x000001ac) line 68 + 24 bytes
> > MSVCRT! 780060ce()
> >
> > --------Another thread  (its name is ROOT_MsgLoop)---------------
> >
> > USER32! 77e11b80()
> > ROOT_MsgLoop(void * 0x000001ac) line 122 + 16 bytes
> > MSVCRT! 780060ce()
> > KERNEL32! 77e96523()
> >
> > --------Another thread  (its name is gl_getc)---------------
> > NTDLL! 77f8224d()
> > KERNEL32! 77ec618e()
> > KERNEL32! 77ec6288()
> > gl_getc() line 607 + 5 bytes
> > Getlinem(int 0x00000001, const char * 0x00000000) line 794 + 5 bytes
> > TRint::HandleTermInput() line 348 + 9 bytes
> > TWinNTSystem::DispatchOneEvent(unsigned char 0x00) line 679 + 23
bytes
> > TSystem::InnerLoop() line 292
> > TWinNTSystem::InnerLoop() line 765
> > TSystem::Run() line 260
> > TApplication::Run(unsigned char 0x00) line 821
> > TRint::Run(unsigned char 0x00) line 246
> > main(int 0x00000001, char * * 0x01304d40) line 31
> > ROOT! mainCRTStartup + 227 bytes
> > KERNEL32! 77e8d326()
> >
> >
> >
> > > -----Original Message-----
> > > From: Faine, Valeri [mailto:fine@bnl.gov]
> > > Sent: Tuesday, October 15, 2002 10:00 PM
> > > To: 'Ed Oltman'
> > > Cc: roottalk@pcroot.cern.ch
> > > Subject: RE: [ROOT] exception on delete in win32 debug dll.
> > >
> > >
> > > He Ed,
> > > Can you debug your problem?
> > >
> > >  To do that:
> > >
> > >    1. START root session
> > >    2. From MS Studio say:
> > >       "Build" -> "Start debug" -> "Attach to process"
> > >    3. Go ahead with your DLL. It should catch the exceptions and
you
> > > will see        the "call stack" (probably)
> > >
> > > Be aware you should see as many as 3 (or 4) call stacks. You may
> want to
> > > investigate all of them. To do that you may select the target
thread
> via
> > >
> > > "Debug" ->Threads" menu.
> > > Make sure you did not link against of %ROOTSYS%/lib/libNew.lib
> library.
> > >
> > > Hope this helps.
> > >                           Valeri
> > >
> > >
> > >
> > >
> > > > -----Original Message-----
> > > > From: owner-roottalk@pcroot.cern.ch
> > > [mailto:owner-roottalk@pcroot.cern.ch]
> > > > On Behalf Of Ed Oltman
> > > > Sent: Tuesday, October 15, 2002 6:14 PM
> > > > To: Roottalk@Pcroot. Cern. Ch
> > > > Subject: [ROOT] exception on delete in win32 debug dll.
> > > >
> > > > Hello,
> > > >  I am using root v 3.03/9 on win2k.   I'm using root with a set
of
> > > > compiled
> > > > classes in a dll - I'm using rootcint and a makefile that is on
> > > > makefile.win32.
> > > > Everything on the root end seems to work fine (yay!)  However, I
> do
> > > have
> > > > bugs
> > > > in my code and need to use the debugger.  I use the VC++
> environment
> > > to
> > > > build.
> > > >
> > > >
> > > > Everything works fine until I try to delete an object that was
> created
> > > by
> > > > root:
> > > > I get an exception -- its some sort of memory management issue.
> (Note
> > > when
> > > > I
> > > > build my debug version of my dll, I use the non-debug
> multithreaded
> > > > version
> > > > of
> > > > the runtime library (LIBCMT.LIB) just to make sure the there is
no
> > > heap
> > > > conflict.
> > > > [The object I tried to delete is a TH1F* that was read in with a
> > > > customized
> > > > streamer
> > > > using:
> > > >
> > > >       R__b >> m_pDeltaTof;
> > > >
> > > > At the time I delete m_pDeltaTof, I can examine it from the
> debugger -
> > > its
> > > > intact -
> > > > its got a title, name, bins, bin contents, etc..]
> > > >
> > > > So, I decided to build a debug version of root from the tar file
> using
> > > > cygwin tools.
> > > > Here's what I do to build it (in cygwin bash)
> > > >
> > > >
> > > > export ROOTBUILD='debug'
> > > > ./configure win32
> > > > make
> > > >
> > > > Then, I tried to use the libraries and root.exe that I built but
> does
> > > not
> > > > help - I still
> > > > get the same exception when I delete an object that root
created.
> Any
> > > > help
> > > > would
> > > > be greatly appreciated..
> > > >
> > > > Ed
> > >
> > >
> > >
> > >
>
>
>
>



This archive was generated by hypermail 2b29 : Sat Jan 04 2003 - 23:51:14 MET