相关疑难解决方法(0)

在Windows下调试(逐行)Rcpp生成的DLL

最近我一直在尝试使用Rcpp(内联)来生成DLL,这些DLL在提供的R输入上执行各种任务.在给定一组特定的R输入的情况下,我希望能够逐行调试这些DLL中的代码.(我在Windows下工作.)

为了说明,让我们考虑一个任何人都应该能够运行的具体例子......

下面的代码是一个非常简单的cxx函数,它只是输入向量的两倍.但请注意,有一个额外的变量myvar可以更改值几次,但不会影响输出 - 这已添加,以便我们能够看到调试过程何时正确运行.

library(inline)
library(Rcpp)

f0 <- cxxfunction(signature(a="numeric"), plugin="Rcpp", body='
    Rcpp::NumericVector xa(a);
    int myvar = 19;
    int na = xa.size();
    myvar = 27;
    Rcpp::NumericVector out1(na);
    for(int i=0; i < na; i++) {
        out1[i] = 2*xa[i];
        myvar++;
    }
    myvar = 101;
    return(Rcpp::List::create( _["out1"] = out1));
')
Run Code Online (Sandbox Code Playgroud)

运行上面的命令之后,输入命令

getLoadedDLLs()
Run Code Online (Sandbox Code Playgroud)

在R会话中显示DLL列表.列出的最后一个应该是由上面的过程创建的DLL - 它有一个随机的临时名称,在我的情况下是

file7e61645c
Run Code Online (Sandbox Code Playgroud)

"Filename"列显示cxxfunction已将此DLL放在该位置tempdir(),这对我来说是当前的位置

C:/Users/TimP/AppData/Local/Temp/RtmpXuxtpa/file7e61645c.dll
Run Code Online (Sandbox Code Playgroud)

现在,调用DLL的明显方法是via f0,如下所示

> f0(c(-7,0.7,77))

$out1
[1] -14.0   1.4 154.0
Run Code Online (Sandbox Code Playgroud)

但我们当然也可以使用以下.Call命令直接通过名称调用DLL :

> .Call("file7e61645c",c(-7,0.7,77))

$out1
[1] -14.0 …
Run Code Online (Sandbox Code Playgroud)

debugging dll gdb r rcpp

20
推荐指数
1
解决办法
3246
查看次数

标签 统计

debugging ×1

dll ×1

gdb ×1

r ×1

rcpp ×1