Как использовать QtCreator вместо gdb для отладки кода C ++ в пакете R на основе Rcpp - PullRequest
0 голосов
/ 01 ноября 2019

Контекст: я использовал RStudio в Ubuntu 18.04 для создания пакета hello world R с кодом C ++, используя Rcpp , как описано здесь в Разработка пакетов Rcpp :

Написание расширений R объясняет, как я могу запустить R с подключенным GDB для отладки с помощью этой команды оболочки:

$ R -d gdb --vanilla

Я хочу использовать QtCreator вместо gdb, чтобы иметь графический интерфейс отладки, но это не такне работает (просто открывается окно шестнадцатеричного дампа, и я не могу запустить R):

$ R -d qtcreator --vanilla

Как я могу использовать QtCreator для отладки?

Редактировать 1:

Присоединение отладчика QtCreator к запущенному сеансу R не работает: если я запускаю R, получает идентификатор процесса в R через Sys.getpid() и выбирает Отладка> Начать отладку> Присоединитьдля запуска приложения Я получаю сообщение об ошибке:

enter image description here

Редактировать 2: Ошибка ptrace вызвана укрепление ядра , что позволяет только отладку дочерних процессов. Я мог бы решить это (временно) с помощью

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

Все еще остается открытой проблемой: отладчик QtCreator показывает код сборки (не код C / C ++)

1 Ответ

2 голосов
/ 01 ноября 2019

Вот шаги, которые мне нужны, чтобы сделать это, используя внешний интерфейс GDB, предоставляемый Emacs. Например, я отлаживаю пакет, который использует Rcpp:

  1. Откройте корневой каталог пакета в Emacs.
  2. Запустите сеанс R с ESS через M-x R.
  3. Получить pid сеанса R с помощью Sys.getpid().
  4. Запустить интерфейс gdb с M-x gdb, добавив -p <pid> в предложенную командную строку.
  5. В добавлении gdbнекоторая точка останова в пакете для загрузки. Это будет помечено как «ожидающий».
  6. В GDB continue процесс R.
  7. В R загрузите пакет с devtools::load_all().
  8. В вызове R вызовитефункция, которая достигнет точки останова.
  9. В GDB у вас теперь есть нормальный интерфейс, но исходный код отображается в другом буфере. Обычно для отображения исходного буфера требуется один шаг next.

Здесь снимок экрана, на котором показаны буферы *R* и *gdb* вместе с исходным кодом. Не точка останова, обозначенная красной точкой, и курсор, указывающий, где стоит обработка:

enter image description here

Если вы загружаете пакет другим способом, например сlibrary(..., lib.loc = "..."), вы должны открыть каталог src пакета на первом шаге. Таким образом, Emacs может найти соответствующий исходный файл. Я ожидаю, что это также можно перенести в QtCreator.

...