Dear listers,

 

a few days ago I asked a question about a problem I had with a C function programmed by myself to be called from R. Thanks to your help, I have been able to look a bit further into it, so now I can be a bit more specific when telling what happens.

 

The fact is that, when my C function finishes its execution (after calling it via the ".C" interface), R seems ok but then crashes when the garbage collector executes, giving a segmentation fault.

 

As some of you suggested, I have executed my function with valgrind, and I get no memory errors, but some memory leaks (which I am not able to locate although compiling my program with the -c flag), and I also get the memory error from RunGenCollect: (which I suppose is causes the segmentation fault). You can see a small piece of the valgrind output below

 

Using gctorture to make the garbage collector crash inside the execution of my program didn't work (my program finished). The question is: what are the typical programming errors that can make R garbage collector crash? Could it be because of these memory leaks? If so, how could I trace them? I have tried it, but running my program with gdb is not an easy task to do, as it performs a huge number of iterations.

 

Thank you very much in advance for your help. I would appreciate any hint that could help me solve this tricky problem.

 

Best regards,

 

Xavier Solé.

 

-----------

### This is one of the memory leaks

==9370== 162 (160 direct, 2 indirect) bytes in 1 blocks are definitely lost in loss record 11 of 42

==9370==    at 0x4A19D35: malloc (vg_replace_malloc.c:149)

==9370==    by 0x84490E0: ???

==9370==    by 0x844D346: ???

==9370==    by 0x4BBE1A2: do_dotCode (in /usr/lib64/R/lib/libR.so)

==9370==    by 0x4BE9035: Rf_eval (in /usr/lib64/R/lib/libR.so)

==9370==    by 0x4BEBA3F: do_set (in /usr/lib64/R/lib/libR.so)

==9370==    by 0x4BE8E5E: Rf_eval (in /usr/lib64/R/lib/libR.so)

==9370==    by 0x4BEAF0D: do_begin (in /usr/lib64/R/lib/libR.so)

==9370==    by 0x4BE8E5E: Rf_eval (in /usr/lib64/R/lib/libR.so)

==9370==    by 0x4BE9711: Rf_applyClosure (in /usr/lib64/R/lib/libR.so)

==9370==    by 0x4BE9107: Rf_eval (in /usr/lib64/R/lib/libR.so)

==9370==    by 0x4BEBA3F: do_set (in /usr/lib64/R/lib/libR.so)

 

### This is the RunGenCollect memory error

==9370== Invalid write of size 8

==9370==    at 0x4C1F73A: RunGenCollect (in /usr/lib64/R/lib/libR.so)

==9370==    by 0x4C23E55: R_gc_internal (in /usr/lib64/R/lib/libR.so)

==9370==    by 0x4C22DC3: Rf_cons (in /usr/lib64/R/lib/libR.so)

==9370==    by 0x4C23AE1: Rf_allocList (in /usr/lib64/R/lib/libR.so)

==9370==    by 0x4B6926B: installAttrib (in /usr/lib64/R/lib/libR.so)

==9370==    by 0x4B69961: Rf_classgets (in /usr/lib64/R/lib/libR.so)

==9370==    by 0x4B68DC1: Rf_setAttrib (in /usr/lib64/R/lib/libR.so)

==9370==    by 0x4B69A40: do_classgets (in /usr/lib64/R/lib/libR.so)

==9370==    by 0x4BE908E: Rf_eval (in /usr/lib64/R/lib/libR.so)

==9370==    by 0x4BEB6FD: applydefine (in /usr/lib64/R/lib/libR.so)

==9370==    by 0x4BEBAE3: do_set (in /usr/lib64/R/lib/libR.so)

==9370==    by 0x4BE8E5E: Rf_eval (in /usr/lib64/R/lib/libR.so)

==9370==  Address 0x10 is not stack'd, malloc'd or (recently) free'd

 


	[[alternative HTML version deleted]]

