Re: [ROOT] problem filling TTrees in a standalone program

From: Rene Brun (Rene.Brun@cern.ch)
Date: Mon Feb 17 2003 - 17:21:41 MET


Hi,

I cannot run your test program because there are missing pieces.
However, I see a huge bug in your program that explains very likely the problem.
You have a statement;
    sprintf(filename,"%s/electron_loss.dat",datapath);a2=..

You have declared 
  char* filename;
but never allocated space for this pointer. As a result, you overwrite
your program.

Rene Brun

FECHNER Maximilien wrote:
> 
> Dear ROOTers,
> 
> I use a linux computer with the following compiler
> 
> gcc version 2.96 20000731 (Red Hat Linux 7.1 2.96-81).
> 
> I have encountered segfaults crashes in the program enclosed in the
> attachment when I used the ROOT binaries present on the system (dec 2002
> version).
> THe program crashed in method TTree::Fill, TTree::Print and
> TObject::Write().
> So I decided to upgrade to ROOT 3.05.02.I have done so,the programs compiles
> fine, but it now segfaults
> almost immediately at a different location.
> 
> The stack trace is :
> *** Break *** segmentation violation
>  Generating stack trace...
>  0x4021338f in TUnixSystem::StackTrace(void) + 0x25b from
> /home/daplxa119/mnt/mfechner/root/lib/libCore.so
>  0x40211f82 in TUnixSystem::DispatchSignals(ESignals) + 0xb2 from
> /home/daplxa119/mnt/mfechner/root/lib/libCore.so
>  0x4021112b in TWebFile::GetSize(void) const + 0x9b from
> /home/daplxa119/mnt/mfechner/root/lib/libCore.so
>  0x40214c61 in TUnixSystem::GetSockOpt(int, int, int *) + 0x339 from
> /home/daplxa119/mnt/mfechner/root/lib/libCore.so
>  0x415b9935 in sigaction at
> /usr/src/bs/BUILD/glibc-2.2.2/linuxthreads/signals.c:97 from
> /lib/i686/libpthread.so.0
>  0x413bd648 in killpg at
> /usr/src/bs/BUILD/glibc-2.2.2/signal/../sysdeps/posix/killpg.c:34 from
> /lib/i686/libc.so.6
>  0x08048feb in main + 0xdb from ./Range.exe
>  0x413ac177 in __libc_start_main at
> /usr/src/bs/BUILD/glibc-2.2.2/csu/../sysdeps/generic/libc-start.c:129 from
> /lib/i686/libc.so.6
>  0x08048ad1 in _start + 0x21 from ./Range.exe
> Abandon (core dumped)
> 
> Analysis of the core dump gives the following output with gbd's
> 'backtrace' command :
> (gdb) bt
> #0  0x413bd801 in __kill () from /lib/i686/libc.so.6
> #1  0x413bd5da in raise (sig=6) at ../sysdeps/posix/raise.c:27
> #2  0x413bed82 in abort () at ../sysdeps/generic/abort.c:88
> #3  0x40213134 in TUnixSystem::StackTrace () from
> /home/daplxa119/mnt/mfechner/root/lib/libCore.so
> #4  0x40212028 in TUnixSystem::DispatchSignals () from
> /home/daplxa119/mnt/mfechner/root/lib/libCore.so
> #5  0x4021112b in SigHandler () from
> /home/daplxa119/mnt/mfechner/root/lib/libCore.so
> #6  0x40214c61 in sighandler () from
> /home/daplxa119/mnt/mfechner/root/lib/libCore.so
> #7  0x415b9935 in pthread_sighandler (signo=11, ctx=
>       {gs = 7, __gsh = 0, fs = 0, __fsh = 0, es = 43, __esh = 0, ds = 43,
> __dsh = 0, edi = 3221222460, esi = 1073834852, ebp = 3221222248, esp =
> 3221222080, ebx = 134522336, edx = 1635282324, ecx = 4, eax = 134517747,
> trapno = 14, err = 4, eip = 134516109, cs = 35, __csh = 0, eflags = 66050,
> esp_at_signal = 3221222080, ss = 43, __ssh = 0, fpstate = 0xbffff040,
> oldmask = 2147483648, cr2 = 1635282324}) at signals.c:97
> #8  <signal handler called>
> #9  0x08048d8d in DataFill (Arb=0x8698a40, typ=0x804938d "e") at
> Range.cpp:53
> #10 0x08048feb in main () at Range.cpp:77
> #11 0x413ac177 in __libc_start_main (main=0x8048f10 <main>, argc=1,
> ubp_av=0xbffff43c, init=0x8048930 <_init>, fini=0x8049290 <_fini>,
>     rtld_fini=0x4000e184 <_dl_fini>, stack_end=0xbffff42c) at
> ../sysdeps/generic/libc-start.c:129
> 
> My source code is ( see attachments) :
> 
> struct EnergyLossData {
>   double energy;
>   double dedx;
>   double range;
> };
> 
> void DataFill(TTree* Arb, const char* typ)
> {
>   static char* MCPATH = "MCPATH";
>   char* datapath = getenv(MCPATH);
>   char* filename;char line[45];
>   EnergyLossData ElData; double a1,a2;
>   FILE* dat;
> 
>   if (datapath == NULL) {
>     fprintf(stderr,"Environment variable %s is not defined.\n",MCPATH);
>     fprintf(stderr,"Make %s point to the directory which holds all data
> tables for de/dx, etc..\n",MCPATH);
>     exit(2);
>   }
>   if ( strcmp(typ,"e") == 0 ) {
>     sprintf(filename,"%s/electron_loss.dat",datapath);a2=
> ELEC_MASS;printf("%s\n",filename);fflush(stdout);}
>   else if ( strcmp(typ,"m")  == 0) {
>     sprintf(filename,"%s/muon_loss.dat",datapath);a2 =
> MUON_MASS;printf("%s\n",filename); fflush(stdout);}
>   else {
>     fprintf(stderr,"Option %s not recognized\n",typ);
>     fprintf(stderr,"Exiting to system\n");
>     exit(2);
>   }
>   dat = fopen(filename,"r");
>   Arb->Branch("Energy",&ElData.energy,"Energy/D");
>   Arb->Branch("Dedx",&ElData.dedx,"Dedx/D");
>   Arb->Branch("Range",&ElData.range,"Range/D");
>   if (dat != NULL)
>     {
>       while ( fgets(line,45,dat)) {
>         sscanf(&line[0],"%lG",&a1);
>         ElData.energy = a1 + a2;
>         sscanf(&line[9],"%lG",&ElData.dedx);
>         sscanf(&line[19],"%lG",&ElData.range);
>         printf("%lG %lG %lG\n",ElData.energy,ElData.dedx,ElData.range);
>         fflush(stdout);
>         Arb->Fill();
>       }
>       Arb->Print();
>       //Arb->Write();
>       fclose(dat);
>     }
> }
> 
> int main()
> {
>   TFile* f1 = new TFile("elec.root","recreate");
>   TTree* t1 = new TTree("elec_loss","Energy loss table for electrons");
>   DataFill(t1,"e");
>   t1->Write();
>   f1->Write();
>   f1->Close();
>   TFile* f2 = new TFile("muon.root","recreate");
>   TTree* t2 = new TTree("muon_loss","Energy loss table for muons");
>   DataFill(t2,"m");
>   t2->Write();
>   f2->Write();
>   f2->Close();
>   return 0;
> }
> 
> I am quite puzzled (problem with pthread ?).
> Do you have any idea what I am doing wrong ?
> 
> Thanking you in advance,
> 
> Yours
> 
> Maximilien Fechner
> 
>   --------------------------------------------------------------------------------
>              Name: Pb.tgz
>    Pb.tgz    Type: APPLICATION/x-gzip
>          Encoding: BASE64



This archive was generated by hypermail 2b29 : Thu Jan 01 2004 - 17:50:09 MET