[Rcpp-devel] Memory not mapped

Hideyoshi Maeda hideyoshi.maeda at gmail.com
Thu Feb 20 19:34:17 CET 2014


Such a rookie C++ error! I thought I would have caught something like that!

oh well! Thanks!

On 20 Feb 2014, at 18:30, Kevin Ushey <kevinushey at gmail.com> wrote:

> Hi Hideyoshi,
> 
> At this line:
> 
> if(x(i,exit_col)==1){
> 
> I see that exit_col is equal to the number of columns in the matrix,
> thereby indexing outside the matrix if 'i' is large enough. Do you
> want 'exit_col - 1' instead? Be careful when going from R's 1-based
> indexing to C++'s 0-based indexing.
> 
> Cheers,
> Kevin
> 
> On Thu, Feb 20, 2014 at 10:16 AM, Hideyoshi Maeda
> <hideyoshi.maeda at gmail.com> wrote:
>> Thanks for the suggestion to keep adding one line at a time, but annoyingly
>> the error has not become apparent...when i add everything but the last section
>> of code it works...but when adding in simple statements at the end, it no
>> longer works
>> 
>> here is the full test.cpp that WORKS
>> 
>> 
>> #include <Rcpp.h>
>> using namespace Rcpp;
>> 
>> // [[Rcpp::export]]
>> List entryexitclock( SEXP xts_obj_,int ent_col, int exit_col, double
>> clock_limit, int init_pos) {
>>  // function takes in xts_obj_ (an xts object from R) and converts to a
>> NumericMatrix
>>  Rcpp::NumericMatrix x(xts_obj_);
>>  // Get the index and call v
>>  DatetimeVector v(NumericVector(RObject(xts_obj_).attr("index")));
>>  // The dimensions of rtn_xts are extracted
>>  int nr = x.nrow();
>> 
>>  int pos = init_pos;
>>  Rcpp::NumericVector pos_vec(nr);
>>  Rcpp::NumericVector clock_vec(nr);
>>  Rcpp::NumericVector real_entry(nr);
>>  Rcpp::NumericVector signal_exit(nr);
>>  Rcpp::NumericVector time_exit(nr);
>> 
>>  for(int i=0; i<nr; i++){
>>    if(pos==0){
>>      // No position before period i
>>      if(x(i,ent_col)==0){
>>        // No position and no entry
>>      } else {
>>        //No position and entry signal
>>        pos = 1;
>>        pos_vec[i] = 1;
>>        real_entry[i] = 1;
>>      }
>>    } else{
>>      // Exisiting position i.e. pos==1
>>      // Add the gap difference to the timer
>>      // time is in seconds...
>>      double gap_diff = (v[i]-v[i-1]);
>>      double time_in_trade = clock_vec[i-1]+gap_diff;
>>      clock_vec[i] = time_in_trade;
>>      pos_vec[i] = 1;
>>      if(time_in_trade>=clock_limit){
>>        //When holding an existing position, exit due to time given
>>        pos = 0;
>>        time_exit[i] = 1;
>>      } else {
>>        //If time based exit hasnt triggered...check for signal
>>        if(x(i,exit_col)==1){
>>          // Exit signal given with existing position
>>        } else{
>>          // No exit signal, so keep position
>>        }
>>      }
>>    }
>>  }
>> 
>>  List l;
>>  return (l);
>> 
>> }
>> 
>> but when changing the last section (starting from the penultimate else) to
>> something like this...
>> 
>>      } else {
>>        //If time based exit hasnt triggered...check for signal
>>        if(x(i,exit_col)==1){
>>          // Exit signal given with existing position
>>          pos = 0;
>>          signal_exit[i] = 1;
>>        } else{
>>          // No exit signal, so keep position
>>        }
>>      }
>>    }
>>  }
>> return List::create(_["pos_vec"] = pos_vec,
>>                     _["clock_vec"] = clock_vec,
>>                     _["real_entry"] = real_entry,
>>                     _["signal_exit"] = signal_exit,
>>                     _["time_exit"] = time_exit);
>> }
>> 
>> It no longer works...and I can't tell why. To me at least it doesn't look like
>> I'm doing anything crazy...
>> 
>> And to test the code I am running the following....
>> 
>> require(xts)
>> require(Rcpp)
>> # 500 days
>> n <- 60*24*500
>> 
>> # minutely standard dev
>> sd_m <- 0.003
>> 
>> #minutely mean
>> mu_m <- 5e-6
>> 
>> # Rate at which entry/exits triggered
>> entry_rate <- 0.002
>> exit_rate <- 0.002
>> 
>> # set seed
>> set.seed(1)
>> 
>> x <- xts(100*cumprod(1+rnorm(n,mu_m,sd_m)),
>>         as.POSIXct(Sys.Date())+(60*c(1:n)))
>> x <- round(to.minutes5(x,name="ABC"),2)
>> x$rand_entry <- rpois(nrow(x),entry_rate)
>> x$rand_exit <- rpois(nrow(x),exit_rate)
>> 
>> Rcpp::sourceCpp('test.cpp')
>> 
>> init_pos <- 0
>> 
>> clock_time_mins <- 120
>> 
>> res <- lapply(1:100, function(z) {
>>  entryexitclock(x,match("rand_entry",colnames(x)),
>>                 match("rand_exit",colnames(x)),
>>                 clock_time_mins*60,init_pos)
>> })
>> 
>> The error obtained when adding in the last part of code is:
>> 
>> *** caught segfault ***
>> address 0x10d0cfc40, cause 'memory not mapped'
>> 
>> Traceback:
>> 1: .Primitive(".Call")(<pointer: 0x10155d2e0>, xts_obj_, ent_col,
>> exit_col, clock_limit, init_pos)
>> 2: entryexitclock(x, match("rand_entry", colnames(x)), match("rand_exit",
>> colnames(x)), clock_time_mins * 60, init_pos)
>> 3: FUN(1:100[[3L]], ...)
>> 4: lapply(1:100, function(z) {    entryexitclock(x, match("rand_entry",
>> colnames(x)), match("rand_exit",         colnames(x)), clock_time_mins * 60,
>> init_pos)})
>> 
>> Possible actions:
>> 1: abort (with core dump, if enabled)
>> 2: normal R exit
>> 3: exit R without saving workspace
>> 4: exit R saving workspace
>> 
>> Interestingly, from the traceback it suggests it fails on the third attempt
>> (z=3) rather than the first or second...
>> 
>> Any suggestions to help fix this issue would be greatly be appreciated...
>> 
>> hlm
>> 
>> 
>> 
>> 
>> 
>> On 20 Feb 2014, at 16:48, Sameer D'Costa <sameerdcosta at gmail.com> wrote:
>> 
>> One thing you can do is start with a little test case and run multiple times
>> it to see if the segfault is really coming from where you think it is.
>> 
>> /*  test.cpp */
>> #include <Rcpp.h>
>> using namespace Rcpp;
>> 
>> // [[Rcpp::export]]
>> List entryexitclock( SEXP xts_obj_,int ent_col, int exit_col, double
>> clock_limit, int init_pos) {
>>  // function takes in xts_obj_ (an xts object from R) and converts to a
>> NumericMatrix
>>  Rcpp::NumericMatrix x(xts_obj_);
>>  // Get the index and call v
>>  DatetimeVector v(NumericVector(RObject(xts_obj_).attr("index")));
>>  // The dimensions of rtn_xts are extracted
>>  int nr = x.nrow();
>>  List l;
>>  return (l);
>> }
>> 
>> Then on the R side you can test it out
>> library(Rcpp)
>> library(xts)
>> sourceCpp("test.cpp")
>> n <- 10000
>> k <- xts(as.numeric(1:n), Sys.time()+1:n)
>> res <- lapply(1:10000, function(z) entryexitclock(k, 12, 12, 60*60,0))
>> 
>> This code does not seem to segfault for me using R 2.15.3 on Ubuntu with
>> Rcpp 0.10.4. Does it segfault for you?
>> 
>> If I were you I would keep adding code to the test example till it segfaults
>> reliably. If you do this one line at a time you will have a good idea of
>> which line is causing the segfault. Usually the "user error" becomes
>> apparent :).  If you are unsure you could winnow down the test case to a
>> small reproducible  test case that crashes reliably and then post it to the
>> list.
>> 
>> Regards
>> Sameer
>> 
>> 
>> On Thu, Feb 20, 2014 at 9:50 AM, Hideyoshi Maeda <hideyoshi.maeda at gmail.com>
>> wrote:
>>> 
>>> Hi I am trying to run a function I created in Rcpp, which is then
>>> sourced/compiled and executed in R.
>>> 
>>> The function is called "entryexitclock".
>>> 
>>> and starts off as follows:
>>> 
>>> #include <Rcpp.h>
>>> using namespace Rcpp;
>>> 
>>> // [[Rcpp::export]]
>>> List entryexitclock( SEXP xts_obj_,int ent_col, int exit_col, double
>>> clock_limit, int init_pos) {
>>>  // function takes in xts_obj_ (an xts object from R) and converts to a
>>> NumericMatrix
>>>  Rcpp::NumericMatrix x(xts_obj_);
>>>  // Get the index and call v
>>>  DatetimeVector v(NumericVector(RObject(xts_obj_).attr("index")));
>>>  // The dimensions of rtn_xts are extracted
>>>  int nr = x.nrow();
>>> 
>>> There is more code but I'm starting to doubt if its related to the rest of
>>> the code. I have a feeling it might be my use of SEXP but I'm not sure...
>>> 
>>> The compilation works fine, however "sometimes" the code works and
>>> sometimes the code doesn't...
>>> 
>>> The error when it doesn't is as follows:
>>> 
>>> 
>>> *** caught segfault ***
>>> address 0x11a9783c8, cause 'memory not mapped'
>>> 
>>> Traceback:
>>> 1: .Primitive(".Call")(<pointer: 0x1044dde70>, xts_obj_, ent_col,
>>> exit_col, clock_limit, init_pos)
>>> 2: entryexitclock(k, 11, 12, 60 * 60, 0)
>>> 
>>> Possible actions:
>>> 1: abort (with core dump, if enabled)
>>> 2: normal R exit
>>> 3: exit R without saving workspace
>>> 4: exit R saving workspace
>>> 
>>> Any suggestions as to what I can do to make sure that this function works
>>> every time rather than just sometimes?
>>> 
>>> HLM
>>> 
>>> 
>>> 
>>> _______________________________________________
>>> Rcpp-devel mailing list
>>> Rcpp-devel at lists.r-forge.r-project.org
>>> https://lists.r-forge.r-project.org/cgi-bin/mailman/listinfo/rcpp-devel
>> 
>> 
>> 
>> 
>> _______________________________________________
>> Rcpp-devel mailing list
>> Rcpp-devel at lists.r-forge.r-project.org
>> https://lists.r-forge.r-project.org/cgi-bin/mailman/listinfo/rcpp-devel



More information about the Rcpp-devel mailing list