代码之家  ›  专栏  ›  技术社区  ›  R Yoda

如何使用QTCREATER代替GDB调试基于RCPP的R包中的C++代码

  •  0
  • R Yoda  · 技术社区  · 6 年前

    上下文:我在Ubuntu 18.04上使用了R演播室,用C++代码创建了一个hello World R包 Rcpp 如中所述 Rcpp Package Development :

    Writing R extensions 说明如何通过此shell命令在附加GDB进行调试的情况下启动R:

    $ R -d gdb --vanilla
    

    我想用QtCreator而不是gdb来调试GUI,但这不起作用(只打开一个十六进制转储窗口,我无法运行R):

    $ R -d qtcreator --vanilla
    

    如何使用QtCreator进行调试?

    编辑1:

    将QtCreator调试器附加到正在运行的R会话不起作用: 如果我启动R, get the process ID in R 通过 Sys.getpid() 然后选择 我得到一个错误:

    enter image description here

    编辑2: 这个 ptrace 错误是由 kernel hardening 它只允许调试子进程。我可以(暂时)通过

    sudo su -
    echo 0 > /proc/sys/kernel/yama/ptrace_scope
    exit
    

    仍然是一个开放的问题:QT创口调试器显示汇编代码(不是C/C++代码)

    0 回复  |  直到 6 年前
        1
  •  2
  •   Ralf Stubner    6 年前

    这里是我使用Emacs提供的gdb前端来实现这一点的步骤。例如,我正在调试一个使用Rcpp的包:

    1. M-x R .
    2. Sys.getpid() .
    3. 启动gdb前端 M-x gdb -p <pid> 到建议的命令行。
    4. 在gdb中,在要加载的包中添加一些断点。这将标记为“待定”。
    5. continue R过程。
    6. 在R中加载包 devtools::load_all() .
    7. 在R中调用一个将到达断点的函数。
    8. 在gdb中,您现在有了正常的接口,但是源代码显示在另一个缓冲区中。通常需要一个 next 显示源缓冲区的步骤。

    这是一张屏幕截图 *R* *gdb* 与源代码一起缓冲。不是红点指示的断点和指示处理位置的光标:

    enter image description here

    如果您以其他方式加载包,例如 library(..., lib.loc = "...") src 第一步中包的目录。这样Emacs就可以找到相应的源文件。我希望这也可以转移到QtCreator。

    推荐文章