Подтвердить что ты не робот

Каковы эффективные способы отладки скомпилированного кода Rcpp, загруженного в R (на OS X Mavericks)?

Каков наиболее продуктивный и быстрый способ отладки общих объектов, загружаемых в R, в частности в OS X Mavericks? Меня в первую очередь интересует отладка скомпилированного кода Rcpp.

Я прочитал R externals при отладке скомпилированного кода (http://cran.r-project.org/doc/manuals/R-exts.html#Debugging-compiled-code), который предпочитает использовать gdb, но gdb официально не поддерживается на Маверикс. Однако, похоже, что lldb является жизнеспособной альтернативой? Я нашел наиболее полезный ресурс для разработки способа отладки скомпилированного кода в R из ответа Dirk на этот пост (Спасибо Dirk!) (Отладка (строка за строкой) Rcpp-сгенерированной DLL в Windows,).

Я могу успешно отлаживать скомпилированный код Rcpp, следуя шагам, которые я излагаю ниже явно шаг за шагом, какие другие новички Rcpp могут найти это полезным (извинения за длину, но я считаю, что лучше быть ясным, чем опускать и быть расплывчатый). Но этот процесс разработки немного утомительный и требует много времени.

Вопросы:

  • существует ли более быстрый и/или более простой способ отладки скомпилированного кода Rcpp по сравнению с тем, что я делаю ниже?

  • Я большой поклонник Rstudio и хотел бы включить отладочные общие объекты, созданные из этой IDE, поэтому, если кто-нибудь знает, как это сделать, мне было бы интересно узнать? Rstudio, похоже, использует атрибуты, и кажется, что шаг 4 ниже нуждается в модификации, потому что во время создания компиляции во временном каталоге нет .cpp файла (в моем примере ниже отсутствует файл file5156292c0b48.cpp)

Этапы:

1) (Один раз) Перейдите в каталог ~/.R(скрытый каталог с.). Создайте новый файл под названием "Makevars" и в нем добавьте строку CXXFLAGS=-g -O0 -Wall.

2) В терминале введите R -d lldb, чтобы запустить R. lldb теперь начнется.

3) Введите run в командной строке lldb. Это запустит R.

4) Скомпилируйте код Rcpp и найдите местоположение скомпилированных объектов. Ответ Dirk на вышеупомянутый пост показывает один из способов сделать это. Вот пример, который я буду использовать здесь. Выполните следующие команды в R:

library(inline)

fun <- cxxfunction(signature(), plugin="Rcpp", verbose=TRUE, body='
int theAnswer = 1;
int theAnswer2 = 2;
int theAnswer3 = 3;
double theAnswer4 = 4.5;
return wrap(theAnswer4);
')

Это создает скомпилированный общий объект и другие файлы, которые можно найти, запустив sevd (tempdir()) и list.files() в R. Будет файл .cpp, например "file5156292c0b48.cpp" и .so файл типа "file5156292c0b48.so"

5) Загрузите общий объект в R, запустив dyn.load("file5156292c0b48.so") в командной строке R

6) Теперь мы хотим отладить код С++ в этом .so-объекте. Вернитесь к lldb, нажав ctrl + c. Теперь я хочу установить точку прерывания в определенной строке файла file5156292c0b48.cpp. Я нашел правильный номер строки, открыв другой терминал и посмотрев номер строки интереса в файле5156292c0b48.cpp. Скажем, строка 31, соответствующая строке int theAnswer = 1; выше в моем примере. Затем введите в командной строке lldb: breakpoint set -f file5156292c0b48.cpp -l 31. Отладчик отпечатывает назад, что точка останова была установлена, и некоторые другие вещи...

7) Вернитесь к R, запустив cont в lldb (подсказка R не появляется автоматически для меня, пока я не нажму кнопку enter) и вызовите функцию. Запустите fun() в командной строке R. Теперь я отлаживаю общий объект (нажмите n, чтобы перейти к следующей строке, p [имя объекта], чтобы печатать переменные и т.д.)....

4b9b3361

Ответ 1

Чтобы отлаживать простые сценарии Rcpp, подобные этому, вы можете создать приложение .cpp (с основным), которое вставляет R. Таким образом вы можете отлаживать его напрямую с помощью Xcode, который даст вам хорошую отладочную работу.

Это становится более сложным, когда вы начинаете отлаживать пакеты.