Memory trouble (?) with TChain::GetMaximum()

When I call GetMaximum() and/or GetMinimum() on a TChain in a loop over the branches in the TTree, the first iteration of the loop always goes fine, but then it crashes on the second iteration:

Processing get_binning.C...

Thread 6 (Thread 0x7f83b0112700 (LWP 31856)):
#0  0x00007f83c8eaa1c3 in epoll_wait () from /lib64/libc.so.6
#1  0x00007f83b0c5c377 in XrdSys::IOEvents::PollE::Begin (this=0x744a790, syncsem=<optimized out>, retcode=<optimized out>, eTxt=<optimized out>) at /var/build/jenkins/workspace/lcg_release_tar/BUILDTYPE/Release/COMPILER/gcc49/LABEL/slc6-physical/build/externals/xrootd-4.5.0/src/xrootd/4.5.0/src/./XrdSys/XrdSysIOEventsPollE.icc:213
#2  0x00007f83b0c58ba5 in XrdSys::IOEvents::BootStrap::Start (parg=0x7ffe683c8cf0) at /var/build/jenkins/workspace/lcg_release_tar/BUILDTYPE/Release/COMPILER/gcc49/LABEL/slc6-physical/build/externals/xrootd-4.5.0/src/xrootd/4.5.0/src/XrdSys/XrdSysIOEvents.cc:131
#3  0x00007f83b0c57318 in XrdSysThread_Xeq (myargs=0x744df70) at /var/build/jenkins/workspace/lcg_release_tar/BUILDTYPE/Release/COMPILER/gcc49/LABEL/slc6-physical/build/externals/xrootd-4.5.0/src/xrootd/4.5.0/src/XrdSys/XrdSysPthread.cc:86
#4  0x00007f83c915caa1 in start_thread () from /lib64/libpthread.so.0
#5  0x00007f83c8ea9bcd in clone () from /lib64/libc.so.6

Thread 5 (Thread 0x7f83af711700 (LWP 31857)):
#0  0x00007f83c916400d in nanosleep () from /lib64/libpthread.so.0
#1  0x00007f83b0c57ae3 in XrdSysTimer::Wait (mills=<optimized out>) at /var/build/jenkins/workspace/lcg_release_tar/BUILDTYPE/Release/COMPILER/gcc49/LABEL/slc6-physical/build/externals/xrootd-4.5.0/src/xrootd/4.5.0/src/XrdSys/XrdSysTimer.cc:239
#2  0x00007f83b06f0ce2 in XrdCl::TaskManager::RunTasks (this=0x7444390) at /var/build/jenkins/workspace/lcg_release_tar/BUILDTYPE/Release/COMPILER/gcc49/LABEL/slc6-physical/build/externals/xrootd-4.5.0/src/xrootd/4.5.0/src/XrdCl/XrdClTaskManager.cc:244
#3  0x00007f83b06f0e69 in RunRunnerThread (arg=<optimized out>) at /var/build/jenkins/workspace/lcg_release_tar/BUILDTYPE/Release/COMPILER/gcc49/LABEL/slc6-physical/build/externals/xrootd-4.5.0/src/xrootd/4.5.0/src/XrdCl/XrdClTaskManager.cc:37
#4  0x00007f83c915caa1 in start_thread () from /lib64/libpthread.so.0
#5  0x00007f83c8ea9bcd in clone () from /lib64/libc.so.6

Thread 4 (Thread 0x7f83aed10700 (LWP 31858)):
#0  0x00007f83c8ea6419 in syscall () from /lib64/libc.so.6
#1  0x00007f83b0751e80 in XrdSys::LinuxSemaphore::Wait (this=0x451faf0) at /var/build/jenkins/workspace/lcg_release_tar/BUILDTYPE/Release/COMPILER/gcc49/LABEL/slc6-physical/build/externals/xrootd-4.5.0/src/xrootd/4.5.0/src/./XrdSys/XrdSysLinuxSemaphore.hh:161
#2  XrdCl::SyncQueue<XrdCl::JobManager::JobHelper>::Get (this=0x74444e8) at /var/build/jenkins/workspace/lcg_release_tar/BUILDTYPE/Release/COMPILER/gcc49/LABEL/slc6-physical/build/externals/xrootd-4.5.0/src/xrootd/4.5.0/src/./XrdCl/XrdClSyncQueue.hh:67
#3  XrdCl::JobManager::RunJobs (this=0x74444d0) at /var/build/jenkins/workspace/lcg_release_tar/BUILDTYPE/Release/COMPILER/gcc49/LABEL/slc6-physical/build/externals/xrootd-4.5.0/src/xrootd/4.5.0/src/XrdCl/XrdClJobManager.cc:146
#4  0x00007f83b0752009 in RunRunnerThread (arg=<optimized out>) at /var/build/jenkins/workspace/lcg_release_tar/BUILDTYPE/Release/COMPILER/gcc49/LABEL/slc6-physical/build/externals/xrootd-4.5.0/src/xrootd/4.5.0/src/XrdCl/XrdClJobManager.cc:33
#5  0x00007f83c915caa1 in start_thread () from /lib64/libpthread.so.0
#6  0x00007f83c8ea9bcd in clone () from /lib64/libc.so.6

Thread 3 (Thread 0x7f83ae30f700 (LWP 31859)):
#0  0x00007f83c8ea6419 in syscall () from /lib64/libc.so.6
#1  0x00007f83b0751e80 in XrdSys::LinuxSemaphore::Wait (this=0x451faf0) at /var/build/jenkins/workspace/lcg_release_tar/BUILDTYPE/Release/COMPILER/gcc49/LABEL/slc6-physical/build/externals/xrootd-4.5.0/src/xrootd/4.5.0/src/./XrdSys/XrdSysLinuxSemaphore.hh:161
#2  XrdCl::SyncQueue<XrdCl::JobManager::JobHelper>::Get (this=0x74444e8) at /var/build/jenkins/workspace/lcg_release_tar/BUILDTYPE/Release/COMPILER/gcc49/LABEL/slc6-physical/build/externals/xrootd-4.5.0/src/xrootd/4.5.0/src/./XrdCl/XrdClSyncQueue.hh:67
#3  XrdCl::JobManager::RunJobs (this=0x74444d0) at /var/build/jenkins/workspace/lcg_release_tar/BUILDTYPE/Release/COMPILER/gcc49/LABEL/slc6-physical/build/externals/xrootd-4.5.0/src/xrootd/4.5.0/src/XrdCl/XrdClJobManager.cc:146
#4  0x00007f83b0752009 in RunRunnerThread (arg=<optimized out>) at /var/build/jenkins/workspace/lcg_release_tar/BUILDTYPE/Release/COMPILER/gcc49/LABEL/slc6-physical/build/externals/xrootd-4.5.0/src/xrootd/4.5.0/src/XrdCl/XrdClJobManager.cc:33
#5  0x00007f83c915caa1 in start_thread () from /lib64/libpthread.so.0
#6  0x00007f83c8ea9bcd in clone () from /lib64/libc.so.6

Thread 2 (Thread 0x7f83ad90e700 (LWP 31860)):
#0  0x00007f83c8ea6419 in syscall () from /lib64/libc.so.6
#1  0x00007f83b0751e80 in XrdSys::LinuxSemaphore::Wait (this=0x451faf0) at /var/build/jenkins/workspace/lcg_release_tar/BUILDTYPE/Release/COMPILER/gcc49/LABEL/slc6-physical/build/externals/xrootd-4.5.0/src/xrootd/4.5.0/src/./XrdSys/XrdSysLinuxSemaphore.hh:161
#2  XrdCl::SyncQueue<XrdCl::JobManager::JobHelper>::Get (this=0x74444e8) at /var/build/jenkins/workspace/lcg_release_tar/BUILDTYPE/Release/COMPILER/gcc49/LABEL/slc6-physical/build/externals/xrootd-4.5.0/src/xrootd/4.5.0/src/./XrdCl/XrdClSyncQueue.hh:67
#3  XrdCl::JobManager::RunJobs (this=0x74444d0) at /var/build/jenkins/workspace/lcg_release_tar/BUILDTYPE/Release/COMPILER/gcc49/LABEL/slc6-physical/build/externals/xrootd-4.5.0/src/xrootd/4.5.0/src/XrdCl/XrdClJobManager.cc:146
#4  0x00007f83b0752009 in RunRunnerThread (arg=<optimized out>) at /var/build/jenkins/workspace/lcg_release_tar/BUILDTYPE/Release/COMPILER/gcc49/LABEL/slc6-physical/build/externals/xrootd-4.5.0/src/xrootd/4.5.0/src/XrdCl/XrdClJobManager.cc:33
#5  0x00007f83c915caa1 in start_thread () from /lib64/libpthread.so.0
#6  0x00007f83c8ea9bcd in clone () from /lib64/libc.so.6

Thread 1 (Thread 0x7f83ca557920 (LWP 20366)):
#0  0x00007f83c8e6d86d in waitpid () from /lib64/libc.so.6
#1  0x00007f83c8dff479 in do_system () from /lib64/libc.so.6
#2  0x00007f83c8dff7b0 in system () from /lib64/libc.so.6
#3  0x00007f83c9df05ba in TUnixSystem::StackTrace() () from /cvmfs/lhcb.cern.ch/lib/lcg/releases/ROOT/6.08.06-c8fb4/x86_64-slc6-gcc49-opt/lib/libCore.so
#4  0x00007f83c5748895 in cling::MultiplexInterpreterCallbacks::PrintStackTrace() () from /cvmfs/lhcb.cern.ch/lib/lcg/releases/ROOT/6.08.06-c8fb4/x86_64-slc6-gcc49-opt/lib/libCling.so
#5  0x00007f83c5748257 in cling_runtime_internal_throwIfInvalidPointer () from /cvmfs/lhcb.cern.ch/lib/lcg/releases/ROOT/6.08.06-c8fb4/x86_64-slc6-gcc49-opt/lib/libCling.so
#6  0x00007f83b11b66f2 in ?? ()
#7  0x000000000769af50 in ?? ()
#8  0x00007ffe683ca380 in ?? ()
#9  0x00007ffe683c0103 in ?? ()
#10 0x0000000007699c50 in ?? ()
#11 0x0000000000000020 in ?? ()
#12 0x00007ffe683ca4a8 in ?? ()
#13 0x632e72632e626368 in ?? ()
#14 0x00000000061392c0 in ?? ()
#15 0x0000000006f37440 in ?? ()
#16 0x00007ffe683ca7e0 in ?? ()
#17 0x00007ffe683ca7e0 in ?? ()
#18 0x00007ffe683ca7e0 in ?? ()
#19 0x4041e773409c87f3 in ?? ()
#20 0x00007ffe683ca4b1 in ?? ()
#21 0x00007ffe683ca4b1 in ?? ()
#22 0x00007ffe683ca4a8 in ?? ()
#23 0x00007ffe683ca7e0 in ?? ()
#24 0x00007ffe683ca7e0 in ?? ()
#25 0x00007ffe683ca7e0 in ?? ()
#26 0x0000000000000003 in ?? ()
#27 0x0000000000000000 in ?? ()
Error in <HandleInterpreterException>: Trying to access a pointer that points to an invalid memory address..
Execution of your code was aborted.
In file included from input_line_8:1:
/afs/cern.ch/user/m/mwilkins/bfraction13TeV/Bm2DsKmunu/Analysis/misc./get_binning.C:21:22: warning: invalid memory pointer passed to a callee:
      TString ibname=ibvar->GetName();
                     ^~~~~

I should note that if I simply cout<<ibname<<endl; in the loop, there are no problems, leading me to believe there is some memory-handling issue. Is there a suggested workaround for this? Script is below.

#include "../job412.C"

void get_binning(){
  ofstream myfile;
  myfile.open ("myfile.txt");
  TChain ch("Tuple_b2DsKMuX/DecayTree","");
  for(const auto& nm : outdict) ch.Add((TString)nm.second.back());
  TIterator * ibit =  ch.GetListOfBranches()->MakeIterator();
  TObject * ibvar = ibit->Next();
  while(ibvar){
    TString ibname=ibvar->GetName();
    if(ibname.Contains("IP")||(ibname.Contains("PV")&&ibname.Contains("CHI2"))||(ibname.Contains("VX")&&ibname.Contains("CHI2"))){
	myfile<<"{\""<<ibname<<"\","<<ch.GetMaximum(ibname)<<"}"<<endl;
    }
    ibvar = ibit->Next();}
  myfile.close();
}
TIterator * ibit =  ch.GetListOfBranches()->MakeIterator();

What is actually returned by this call is actually the list of branch of the first TTree. As soon as the second TTree in the chain is loaded, it becomes invalid. To do what you want/need you will need to copy/cache the branch names is you own string collection before starting to return the data.

Cheers,
Philippe.

1 Like

I tried storing the names in a TString vector, following your suggestion, but that didn’t work any better. I ended up moving my script to python and doing:

    def GetListOfBranches(self):
        temp = []
        for nm in self.thething.GetListOfBranches():
            temp.append(nm.GetName())
        return temp

where self.thething is either a TChain or a TTree from a TFile. I can then loop over the values in the list of branches and pass each of them to GetMaximum and GetMinimum without any issues.

but that didn’t work any better.

That does not sound right. Especially in view of

moving my script to python … pass each of them to GetMaximum and GetMinimum without any issues.

The same pattern should have worked in C++ too (i.e. likely the attempt made was still not ‘quite’ right).

Cheers,
Philippe.

You are probably right. For the record, this is the script I tried:

#include "../job412.C"

void get_binning(){
  TChain ch("Tuple_b2DsKMuX/DecayTree");
  ofstream maxfile;
  maxfile.open ("maxfile.txt");
  ofstream minfile;
  minfile.open ("minfile.txt");
  maxfile<<f[ifile].tname[0]<<endl;
  minfile<<f[ifile].tname[0]<<endl;
  for(const auto& nm : outdict) ch.Add((TString)nm.second.back());
  TIterator * ibit =  ch.GetListOfBranches()->MakeIterator();
  TObject * ibvar = ibit->Next();
  vector<TString> ibnames(0);
  while(ibvar) {
    ibnames.push_back(ibvar->GetName());
    ibvar = ibit->Next();
  }
  for(vector<TString>::iterator ibname = ibnames.begin(); ibname != ibnames.end(); ibname++)
    if(ibname->Contains("IP")||(ibname->Contains("PV")&&ibname->Contains("CHI2"))||(ibname->Contains("VX")&&ibname->Contains("CHI2"))){
      maxfile<<"{\""<<*ibname<<"\","<<f[ifile].GetMaximum(*ibname)<<"}"<<endl;
      minfile<<"{\""<<*ibname<<"\","<<f[ifile].GetMaximum(*ibname)<<"}"<<endl;
    }
  maxfile.close();
  minfile.close();
}

Where outdict is a map of ROOT file locations defined in ../job412.C. I suspect the trouble is that my vector stores pointers instead of actual strings. Changing to ibnames.push_back(*(ibvar->GetName())); does not resolve the issue (it appears to store a pointer to the first character in the branch name), and I decided to just move to python rather than continue debugging.

 Changing to ibnames.push_back(*(ibvar->GetName()));

that is indeed wrong.

I am curious out the script you last shown is failing …

Cheers,
Philippe.

Well, I don’t know what happened, but it works now. So I have two good scripts I guess.

Thanks for the help.

This topic was automatically closed 14 days after the last reply. New replies are no longer allowed.