我正在尝试使用gdb来调试使用Rcpp功能的简单C ++子例程。我使用选项-O0 -g构建我的子程序foo.cpp。我使用R -d gdb启动R. 我使用dyn.load(“foo.so”)加载子程序,然后用.Call(“foo”,X)调用子程序。没有问题。当我在gdb中输入子程序时,我可以打印标准C ++类型,例如“print i”,其中i是int。但是,我无法打印Rcpp :: NumericMatrix xout的元素。我试过了
print xout(1,1)
以及
打印R_PV(xout(1,1))
有谁知道怎么做?
我的C ++代码是:
#include <iostream>
#include <Rcpp.h>
RcppExport SEXP foo(SEXP x){
using namespace Rcpp;
NumericMatrix xin = NumericMatrix(x);
int nrow = xin.nrow();
int ncol = xin.ncol();
NumericMatrix xout(nrow, ncol);
for(int j = 0; j<ncol; j++) {
xout(0,j) = xin(0,j);
for (int i=1; i<nrow; i++) {
if (ISNA(xin(i,j)))
xout(i,j) = xout(i-1,j);
else
xout(i,j) = xin(i,j);
}
}
return(xout);
}
从命令行,我运行:
R CMD SHLIB foo.cpp
然后我使用
启动R.R -d gdb
我在foo
添加一个断点b foo
然后我开始R:
R
在R中,我输入
dyn.load("foo.so")
X =matrix(rnorm(9),3)
.Call("foo",X)
从gdb命令行输入
print xin
并获得:
$1 = {<Rcpp::Vector<14>> = {<Rcpp::RObject> = {_vptr.RObject = 0x7fff8df4b410,
m_sexp = 0x2567f20}, <Rcpp::VectorBase<14, true, Rcpp::Vector<14> >> = {<Rcpp::traits::expands_to_logical__impl<14>> = {<No data fields>}, <No data fields>}, <Rcpp::internal::eval_methods<14>> = {<No data fields>}, cache = {
start = 0x31e03c39b0}}, <Rcpp::MatrixBase<14, true, Rcpp::Matrix<14> >> = {<Rcpp::traits::expands_to_logical__impl<14>> = {<No data fields>}, <No data fields>}, nrows = -537925942}
我希望能够从gdb访问xin(1,1),例如,
print xin(1,1)