[Rcpp-devel] Rcpp Module problem: R crash
该走了
gaizoule at gmail.com
Tue Jan 22 03:45:25 CET 2013
Thanks for your advice, I'll try it.
2013/1/22 John Merrill <john.merrill at gmail.com>
> Have you tried running your code within a debugger? It's pretty
> straightforward to do that, either by building a package and loading the
> resulting library or by using sourceCpp. Here's a simple standard session
> using the following file (named '/tmp/zero_ref.cc' on my system) as input:
>
> #include <Rcpp.h>
> using namespace Rcpp;
>
> // This next routine is guaranteed to cause an invalid pointer access
> // error (e.g. an access violation in Windows, or a segmentation
> // violation on a UNIX box.) Calling it will crash R.
> //
> // [[Rcpp::export]]
>
> double CrashMe() {
> return *((double *) NULL);
> }
>
> Here are the results, both without the debugger and inside the debugger.
>
> jwlm at d442:~$ R -q
> > library(Rcpp)
> > sourceCpp('/tmp/zero_ref.cc')
> > CrashMe()
>
> *** caught segfault ***
> address (nil), cause 'memory not mapped'
>
> Traceback:
> 1: .Primitive(".Call")(<pointer: 0x7fa7d5309e00>)
> 2: CrashMe()
>
> Possible actions:
> 1: abort (with core dump, if enabled)
> 2: normal R exit
> 3: exit R without saving workspace
> 4: exit R saving workspace
> Selection: 3
> jwlm at d442:~$ R -q -d gdb
> GNU gdb (GDB) 7.1-ubuntu
> Copyright (C) 2010 Free Software Foundation, Inc.
> License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
> This is free software: you are free to change and redistribute it.
> There is NO WARRANTY, to the extent permitted by law. Type "show copying"
> and "show warranty" for details.
> This GDB was configured as "x86_64-linux-gnu".
> For bug reporting instructions, please see:
> <http://www.gnu.org/software/gdb/bugs/>...
> Reading symbols from /usr/lib/R/bin/exec/R...(no debugging symbols found)...done.
> (gdb) r
> Starting program: /usr/lib/R/bin/exec/R -q
> [Thread debugging using libthread_db enabled]
> > library(Rcpp)
> > sourceCpp('/tmp/zero_ref.cc')
> > CrashMe()
>
> Program received signal SIGSEGV, Segmentation fault.
> CrashMe () at zero_ref.cc:12
> 12 }
> (gdb) l
> 7 // violation on a UNIX box.) Calling it will crash R.
> 8 //
> 9 // [[Rcpp::export]]
> 10 double CrashMe() {
> 11 return *((double *) NULL);
> 12 }
> 13
> 14
> 15 #include <Rcpp.h>
> 16
> (gdb)
>
>
>
> On Mon, Jan 21, 2013 at 9:55 AM, 该走了 <gaizoule at gmail.com> wrote:
>
>> I am tring to use Rcpp Module to export C++ class to R, but meet some
>> problem.
>> Here is my code:
>>
>> ###########################################################################################
>> /* file PL modules.cpp */
>> using namespace Rcpp;
>> using namespace std;
>>
>> class SymPL {
>> public:
>> SymPL(vector<double> close);
>> void update(int idx,
>> double txnqty,
>> double txnprc);
>> DataFrame toDF();
>>
>>
>> int nrow;
>> vector<double> txn_qty, txn_prc, txn_fee;
>> vector<double> pos_qty, close_prc, PL;
>> };
>>
>> SymPL::SymPL(vector<double> close) {
>> nrow = close.size();
>> txn_qty = vector<double>(nrow);
>> txn_prc = vector<double>(nrow);
>> txn_fee = vector<double>(nrow);
>> pos_qty = vector<double>(nrow);
>> close_prc = vector<double>(close);
>> PL = vector<double>(nrow);
>> }
>>
>> void SymPL::update(int idx,
>> double txnqty,
>> double txnprc) {
>> txn_qty[idx] = txnqty;
>> txn_prc[idx] = txnprc;
>> txn_fee[idx] = 0; //calfee(txnqty*txnprc); todo: write a function to
>> cal fee
>> if(idx == 0) { //index start with 0
>> pos_qty[idx] = txnqty;
>> PL[idx] = txnqty * (close_prc[idx] = txnprc) - txn_fee[idx];
>> }
>> else {
>> pos_qty[idx] = txnqty + pos_qty[idx-1];
>> PL[idx] = pos_qty[idx-1] * (close_prc[idx] - close_prc[idx-1]) +
>> txnqty * (close_prc[idx] = txnprc) - txn_fee[idx];
>> }
>> }
>>
>> DataFrame SymPL::toDF() {
>> DataFrame PLrecord = DataFrame::create(_["txn.qty"] = txn_qty,
>> _["txn.prc"] = txn_prc,
>> _["txn.fee"] = txn_fee,
>> _["pos.qty"] = pos_qty,
>> _["close.prc"] = close_prc,
>> _["PL"] = PL);
>> return PLrecord;
>> }
>>
>> class PortPL {
>> public:
>> CharacterVector symnames;
>> int sym_num;
>> double initMoney;
>> int period_num;
>> vector<double> total_eq;
>> vector<double> total_PL;
>> vector<double> period_return;
>> vector<double> cum_return;
>> DatetimeVector timeindex;
>>
>> PortPL(SEXP times,
>> SEXP CLprc, double initM);
>> void update(int idx, NumericVector txnqty_vec,
>> NumericVector txnprc_vec);
>> void exit(int idx, NumericVector txnprc_vec);
>> void hold(int idx);
>> NumericVector getpos(int idx);
>> List getSymPLs();
>>
>> private:
>> vector<SymPL> symbols;
>>
>> };
>>
>> PortPL::PortPL(SEXP times,
>> SEXP CL,
>> double initM):
>> timeindex(times) {
>> List CLprc(CL);
>> sym_num = CLprc.size();
>> symnames = CLprc.names();
>> initMoney = initM;
>> //timeindex = DatetimeVector(times);
>> period_num = timeindex.size();
>>
>> //initialize total_eq, total_PL, period_return, cum_return
>> total_eq = vector<double>(period_num);
>> total_PL = vector<double>(period_num);
>> period_return = vector<double>(period_num);
>> cum_return = vector<double>(period_num);
>>
>> //initialize each SymPL
>> for(int i = 0; i < sym_num; i++) {
>> vector<double> close = as<vector<double> >(CLprc[i]);
>> symbols[i] = SymPL(close);
>> }
>> }
>>
>> void PortPL::update(int idx, NumericVector txnqty_vec,
>> NumericVector txnprc_vec) {
>> double sumPL = 0;
>> for(int i = 0; i < sym_num; i++) {
>> symbols[i].update(idx, txnqty_vec[i], txnprc_vec[i]);
>> sumPL += symbols[i].PL[idx];
>> }
>>
>> total_PL[idx] = sumPL;
>> if(idx == 0) {// index starts with 0
>> total_eq[idx] = initMoney + total_PL[idx];
>> period_return[idx] = total_PL[idx] / initMoney;
>> cum_return[idx] = total_PL[idx] / initMoney;
>> }
>> else {
>> total_eq[idx] = total_eq[idx-1] + total_PL[idx];
>> period_return[idx] = total_PL[idx] / total_eq[idx];
>> cum_return[idx] = total_eq[idx] / initMoney - 1;
>> }
>> }
>>
>> void PortPL::hold(int idx) {
>> NumericVector tempv(sym_num, 0.0);
>> this->update(idx, tempv, tempv);
>> }
>>
>> void PortPL::exit(int idx, NumericVector txnprc_vec) {
>> NumericVector curr_pos(sym_num);
>> for(int i = 0; i < sym_num; i++) {
>> curr_pos[i] = symbols[i].pos_qty[idx-1];
>> }
>> this->update(idx, curr_pos, txnprc_vec);
>> }
>>
>> NumericVector PortPL::getpos(int idx) {
>> NumericVector curr_pos(sym_num);
>> for(int i = 0; i < sym_num; i++) {
>> curr_pos[i] = symbols[i].pos_qty[idx-1];
>> }
>> return curr_pos;
>> }
>>
>> List PortPL::getSymPLs() {
>> List allsym(sym_num);
>> for(int i = 0; i < sym_num; i++){
>> allsym[i] = symbols[i].toDF();
>> }
>> allsym.names() = symnames;
>> return allsym;
>> }
>>
>> RCPP_MODULE(PortPL_module) {
>> class_<PortPL>("PortPL")
>> .constructor<SEXP, SEXP, double>()
>> .field("total.eq", &PortPL::total_eq)
>> .field("total.PL", &PortPL::total_PL)
>> .field("symnames", &PortPL::symnames)
>> .field("cum.return", &PortPL::cum_return)
>> .field("period.return", &PortPL::period_return)
>> .field("initMoney", &PortPL::initMoney)
>>
>> .method("update", &PortPL::update)
>> .method("exit", &PortPL::exit)
>> .method("hold", &PortPL::hold)
>> .method("getpos", &PortPL::getpos)
>> .method("getSymPLs", &PortPL::getSymPLs)
>> ;
>> }
>>
>> #######################################################################
>>
>> ## R code
>> library(inline)
>> library(Rcpp)
>>
>> fx <- cxxfunction(signature(),
>> includes = paste(readLines("PnL module.cpp"),
>> collapse = "\n"),
>> plugin = "Rcpp")
>>
>> port <- Module("PortPL_module", getDynLib(fx))
>> PortPL <- port$PortPL
>>
>> datel <- as.POSIXct(Sys.Date()+1:10)
>> colse <- 1:10
>> initM <- 1e5
>>
>> testport <- new(PortPL, datel, list(hjs=colse), initM)
>>
>> Then the R crash with error message:
>>
>> *** caught segfault ***
>> address (nil), cause 'memory not mapped'
>>
>> Traceback:
>> 1: .External(class__newInstance, module, pointer, ...)
>> 2: new_CppObject_xp(fields$.module, fields$.pointer, ...)
>> 3: Rcpp:::cpp_object_initializer(.self, .refClassDef, ...)
>> 4: .Object$initialize(...)
>> 5: initialize(value, ...)
>> 6: initialize(value, ...)
>> 7: new(PortPL, datel, list(hjs = colse), initM)
>>
>> Possible actions:
>> 1: abort (with core dump, if enabled)
>> 2: normal R exit
>> 3: exit R without saving workspace
>> 4: exit R saving workspace
>> Selection:
>>
>> ######################################################################
>> I just can not figure out what is wrong, Is there anyone can help me
>> check out? Thanks in advance!
>>
>>
>>
>>
>>
>>
>>
>>
>> _______________________________________________
>> 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
>>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.r-forge.r-project.org/pipermail/rcpp-devel/attachments/20130122/de8c556d/attachment.html>
More information about the Rcpp-devel
mailing list