Hi Robert.

This is what makes these lists worth it. People like you. Thank you very much for the effort you have taken writing this tutorial. Of course I am putting it into practice right now. Problem is, rGADEM looks like a big monster to me. ;)

Regards,
Gus


On 26/03/13 16:51, Robert Castelo wrote:
hi Gustavo,

just in case it helps, here is a one-minute crash course on valgrind. a way that helped me in the past to learn interpreting valgrind output was to make a toy example with memory leaks and then see how valgrind was detecting them. code the following C program under the name memleaks.c:

======================memleaks.c======================
#include <stdio.h>
#include <stdlib.h>

/* two typical memory leaks in C */

int main(void) {
  char* p;
  char* q;
  char  t[2];

p = (char *) malloc(10 * sizeof(char)); /* allocate memory for 10 characters */

  /* leak number 1 */
  p[10] = 'x'; /* position 10 is not valid */

  /* leak number 2 */
free(q); /* try to free memory from a pointer to which we didn't allocate any */
           /* or which as already freed before */

  return 0;
}
======================================================

compile it this way:

$ gcc -g -o memleaks memleaks.c

execute it with valgrind including the options i'm specifying:

$ valgrind --tool=memcheck --leak-check=yes --show-reachable=yes ./memleaks

you should get this output:

==26496== Memcheck, a memory error detector
==26496== Copyright (C) 2002-2009, and GNU GPL'd, by Julian Seward et al.
==26496== Using Valgrind-3.5.0 and LibVEX; rerun with -h for copyright info
==26496== Command: ./memleaks
==26496==
==26496== Invalid write of size 1
==26496==    at 0x400522: main (memleaks.c:14)
==26496==  Address 0x4c3804a is 0 bytes after a block of size 10 alloc'd
==26496==    at 0x4A0515D: malloc (vg_replace_malloc.c:195)
==26496==    by 0x400515: main (memleaks.c:11)
==26496==
==26496== Conditional jump or move depends on uninitialised value(s)
==26496==    at 0x4A04D25: free (vg_replace_malloc.c:325)
==26496==    by 0x400530: main (memleaks.c:17)
==26496==
==26496==
==26496== HEAP SUMMARY:
==26496==     in use at exit: 10 bytes in 1 blocks
==26496==   total heap usage: 1 allocs, 0 frees, 10 bytes allocated
==26496==
==26496== 10 bytes in 1 blocks are definitely lost in loss record 1 of 1
==26496==    at 0x4A0515D: malloc (vg_replace_malloc.c:195)
==26496==    by 0x400515: main (memleaks.c:11)
==26496==
==26496== LEAK SUMMARY:
==26496==    definitely lost: 10 bytes in 1 blocks
==26496==    indirectly lost: 0 bytes in 0 blocks
==26496==      possibly lost: 0 bytes in 0 blocks
==26496==    still reachable: 0 bytes in 0 blocks
==26496==         suppressed: 0 bytes in 0 blocks
==26496==
==26496== For counts of detected and suppressed errors, rerun with: -v
==26496== Use --track-origins=yes to see where uninitialised values come from
==26496== ERROR SUMMARY: 3 errors from 3 contexts (suppressed: 6 from 6)

now notice the lines of the source file (memleaks.c) that valgrind is identifying and just try to match with the errors the program contains. i'm showing you now the lines of memleaks.c that valgrind reports in the order they are being reported:

$ sed --quiet '14,14p' memleaks.c
  p[10] = 'x'; /* position 10 is not valid */

$ sed --quiet '11,11p' memleaks.c
p = (char *) malloc(10 * sizeof(char)); /* allocate memory for 10 characters */

$ sed --quiet '17,17p' memleaks.c
free(q); /* try to free memory from a pointer to which we didn't allocate any */

so next and final step is to run valgrind on your package with the same options which i usually do this way:

$ R -d "valgrind --tool=memcheck --leak-check=yes --show-reachable=yes" --vanilla < run4memoryleaks.R &> memoryleaks.txt

where 'run4memoryleaks.R' would contain the lines below that potentially produce memory leaks and 'memoryleaks.txt' would contain the output from valgrind.

and finally try to match at least the error messages you saw on the toy examples to what valgrind is saying about your package on memoryleaks.txt

good luck!!
robert.


On 03/26/2013 04:24 PM, Gustavo Fernández Bayón wrote:
Hi everybody.

I am experiencing problems with rGADEM. Say I have the following script,
which I have written trying to replicate the error:

library(FDb.InfiniumMethylation.hg19)
library(BSgenome.Hsapiens.UCSC.hg19)
library(rGADEM)
annot <- get450k()
rois <- keepSeqlevels(annot[1:10], paste0('chr', c(1:22, 'X', 'Y')))
rois <- resize(rois, 300, fix='center')
seqs <- getSeq(BSgenome.Hsapiens.UCSC.hg19, rois)
gad <- GADEM(seqs, verbose=1)

Approximately, a third of the the times I execute the previous code from
the command line by using either R or Rscript, it crashes with a core
dumped. It is not always the same error. For example, this is the last
error message I have seen:

*** Running an unseeded analysis ***
GADEM cycle 1: enumerate and count k-mers... top 3 4, 5-mers: 2 2 2
Done.
Initializing GA... Done.
*** glibc detected *** /usr/lib/R/bin/exec/R: double free or corruption
(!prev): 0x00007fee0c135da0 ***
======= Backtrace: =========
/lib/x86_64-linux-gnu/libc.so.6(+0x7eb96)[0x7fee5b3ffb96]
/lib/x86_64-linux-gnu/libc.so.6(+0x81cc0)[0x7fee5b402cc0]
/lib/x86_64-linux-gnu/libc.so.6(realloc+0xee)[0x7fee5b40476e]
/usr/local/lib/R/site-library/rGADEM/libs/rGADEM.so(get_llr_pv+0xc1)[0x7fee4da65eb1]

/usr/local/lib/R/site-library/rGADEM/libs/rGADEM.so(E_value+0x180)[0x7fee4da66c90]

/usr/local/lib/R/site-library/rGADEM/libs/rGADEM.so(populationCalculation+0x47b)[0x7fee4da5674b]

/usr/local/lib/R/site-library/rGADEM/libs/rGADEM.so(+0x4a67)[0x7fee4da56a67]

/usr/local/lib/R/site-library/rGADEM/libs/rGADEM.so(GADEM_Analysis+0xf6e)[0x7fee4da57f1e]

/usr/lib/R/lib/libR.so(+0xb8b87)[0x7fee5ba15b87]
/usr/lib/R/lib/libR.so(Rf_eval+0x73d)[0x7fee5ba50b1d]
/usr/lib/R/lib/libR.so(+0xf56b0)[0x7fee5ba526b0]
/usr/lib/R/lib/libR.so(Rf_eval+0x51f)[0x7fee5ba508ff]
/usr/lib/R/lib/libR.so(+0xf5830)[0x7fee5ba52830]
/usr/lib/R/lib/libR.so(Rf_eval+0x51f)[0x7fee5ba508ff]
/usr/lib/R/lib/libR.so(Rf_applyClosure+0x34d)[0x7fee5ba53d1d]
/usr/lib/R/lib/libR.so(Rf_eval+0x400)[0x7fee5ba507e0]
/usr/lib/R/lib/libR.so(+0xf56b0)[0x7fee5ba526b0]
/usr/lib/R/lib/libR.so(Rf_eval+0x51f)[0x7fee5ba508ff]
/usr/lib/R/lib/libR.so(Rf_ReplIteration+0x1e3)[0x7fee5ba8ce63]
/usr/lib/R/lib/libR.so(+0x1300f0)[0x7fee5ba8d0f0]
/usr/lib/R/lib/libR.so(run_Rmainloop+0x5a)[0x7fee5ba8d18a]
/usr/lib/R/bin/exec/R(main+0x1b)[0x40078b]
/lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xed)[0x7fee5b3a276d]
/usr/lib/R/bin/exec/R[0x4007bd]

Sometimes it also gives a 'memory not mapped' error.

My current guess is that the error is related to some bad memory
allocation in the C code, but I am not able to spot where. I have tried
to run it with valgrind, and it complains about memory leaks, but I have
to admit that I have no idea of how I could solve this. Hope somebody
can help or give a hint.

Output from my sessionInfo():

 > sessionInfo()
R version 2.15.2 (2012-10-26)
Platform: x86_64-pc-linux-gnu (64-bit)

locale:
[1] LC_CTYPE=es_ES.UTF-8 LC_NUMERIC=C
[3] LC_TIME=es_ES.UTF-8 LC_COLLATE=es_ES.UTF-8
[5] LC_MONETARY=es_ES.UTF-8 LC_MESSAGES=es_ES.UTF-8
[7] LC_PAPER=C LC_NAME=C
[9] LC_ADDRESS=C LC_TELEPHONE=C
[11] LC_MEASUREMENT=es_ES.UTF-8 LC_IDENTIFICATION=C

attached base packages:
[1] stats graphics grDevices utils datasets methods base

other attached packages:
[1] BiocInstaller_1.8.3

loaded via a namespace (and not attached):
[1] tcltk_2.15.2 tools_2.15.2

Regards,
Gus

_______________________________________________
Bioc-devel@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/bioc-devel



_______________________________________________
Bioc-devel@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/bioc-devel

Reply via email to