我在最新版本的 Rstudio (1.3.959) 和 R (4.0.0) 下用 RcppArmadillo 制作一个包。
考虑以下最小示例,它创建包anRpackage:
library(Rcpp)
library(RcppArmadillo)
RcppArmadillo.package.skeleton()
在这个包中设置工作目录,我通过以下方式加载它:
library(devtools)
devtools::load_all()
然后可以执行基本函数rcpparma_hello_world():
rcpparma_hello_world()
[,1] [,2] [,3]
[1,] 7 0 0
[2,] 0 7 0
[3,] 0 0 7
- 我现在想通过终端命令使用 lldb 调试代码,以便在 通过命令执行期间检查变量值。
R -d lldb
frame variable
R -d lldb
(lldb) breakpoint set --name rcpparma_hello_world()
(lldb) run
> library(devtools)
> devtools::load_all()
> rcpparma_hello_world()
anRpackage.so was compiled with optimization - stepping may behave oddly; variables may not be available.
实际上,问题在于大多数变量不可用:
> next
> frame variable
(arma::mat) m1 = <no location, value may have been optimized out>
(arma::mat) m2 = <no location, value may have been optimized out>
- 我在上一个链接中阅读了以下建议:
在尝试调试此类问题时,您也可以考虑生成所谓的“调试”构建,并降低优化。对于构建 R 包,这实际上相当于
CXXFLAGS=-g -O0
您的~/.R/Makevars
文件中的内容)
- 我已经尝试过了,但是在使用的编译标志下似乎没有效果,因为我的包中有一个本地文件Makevars来指定使用 RcppArdimillo 编译的方式,其标志是:
CXX_STD = CXX11
PKG_CXXFLAGS = $(SHLIB_OPENMP_CXXFLAGS)
PKG_LIBS = $(SHLIB_OPENMP_CXXFLAGS) $(LAPACK_LIBS) $(BLAS_LIBS) $(FLIBS)
然后,该命令devtools::load_all()
生成下面给出的行命令编译,其中确实-g -O2
进行了一些代码优化:
clang++ -mmacosx-version-min=10.13 -std=gnu++11 -I"/Library/Frameworks/R.framework/Resources/include" -DNDEBUG -I'/Library/Frameworks/R.framework/Versions/4.0/Resources/library/Rcpp/include' -I'/Library/Frameworks/R.framework/Versions/4.0/Resources/library/RcppArmadillo/include' -I/usr/local/include -fPIC -Wall -g -O2 -c rcpparma_hello_world.cpp -o rcpparma_hello_world.o
问题:如何在调试模式下访问变量?
谢谢