Каков наиболее продуктивный и быстрый способ отладки общих объектов, загружаемых в 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 [имя объекта], чтобы печатать переменные и т.д.)....