r语言 - 使用调试符号中的行信息编译 Rcpp 包



我不知道如何为我的 R 包的共享库的调试符号提供源代码行信息。我错过了什么?

  1. 我创建以下src/Makevars文件:

    PKG_CXXFLAGS=-O0 -ggdb
    PKG_LIBS=-O0 -ggdb
    
  2. 我使用R CMD INSTALL --no-multiarch --with-keep.source编译包:

    * installing to library ‘~/.local/lib/R/3.6’
    * installing *source* package ‘reticulate’ ...
    ** using staged installation
    g++ -std=gnu++11 -I"/usr/include/R/" -DNDEBUG  -I"$HOME/.local/lib/R/3.6/Rcpp/include" -D_FORTIFY_SOURCE=2 -O0 -ggdb -fpic  -march=x86-64 -mtune=generic -O2 -pipe -fno-plt  -c RcppExports.cpp -o RcppExports.o
    ** libs
    g++ -std=gnu++11 -shared -L/usr/lib64/R/lib -Wl,-O1,--sort-common,--as-needed,-z,relro,-z,now -o reticulate.so RcppExports.o event_loop.o libpython.o output.o python.o readline.o -O0 -ggdb -L/usr/lib64/R/lib -lR
    

    安装到 ~/.local/lib/R/3.6/00LOCK-reticulate/00new/reticulate/libs

  3. 我像这样调试:

    R -d gdb --slave -e 'reticulate::py_eval("print")()'
    GNU gdb (GDB) 8.3
    [...]
    (No debugging symbols found in /usr/lib64/R/bin/exec/R)
    (gdb) break py_get_formals
    Function "py_get_formals" not defined.
    Make breakpoint pending on future shared library load? (y or [n]) y
    Breakpoint 1 (py_get_formals) pending.
    (gdb) run
    Starting program: /usr/lib/R/bin/exec/R --slave -e reticulate::py_eval("print")()
    [Thread debugging using libthread_db enabled]
    Using host libthread_db library "/usr/lib/libthread_db.so.1".
    [...]
    Thread 1 "R" hit Breakpoint 1, 0x00007fffeb6b79a0 in py_get_formals(PyObjectRef, bool) () from /home/angerer/.local/lib/R/3.6/reticulate/libs/reticulate.so
    (gdb) step
    Single stepping until exit from function _Z14py_get_formals11PyObjectRefb,
    which has no line number information.
    [...]
    

为什么我的函数没有行号,即使我在两个编译中都指定了-ggdb?我看到命令行中只提到了RcppExports.cpp,这是问题所在吗?如果是这样,我该如何更改?

更改 Makevars 不会提示重新编译。

我需要在重新编译目标文件之前rm -f src/*.o src/*.so

这是专门针对Windows的。最简单的方法是将R_MAKEVARS_USER环境设置为指向 Makevars.win 文件。这似乎有效。但是,调试断点已停止工作!!!

最新更新