web-dev-qa-db-ja.com

R(OS X Mavericks)にロードされたRcppコンパイル済みコードをデバッグするための生産的な方法は何ですか?

特にOSX Mavericksで、Rにロードされる共有オブジェクトをデバッグするための最も生産的で迅速な方法は何ですか?私は主にコンパイルされたRcppコードのデバッグに興味があります。

Gdbの使用を支持するコンパイル済みコードのデバッグに関するRの外部( http://cran.r-project.org/doc/manuals/R-exts.html#Debugging-compiled-code )を読みました。 、ただし、gdbはMavericksでは公式にはサポートされていません。しかし、lldbは実行可能な代替手段のようですか?この投稿に対するDirkの応答からRでコンパイルされたコードをデバッグする方法を理解するための最も有用なリソースを見つけました(ありがとうDirk!)( Rcppで生成されたDLLのデバッグ(行ごと) Windows )。

コンパイルされたRcppコードは、以下に概説する手順を1つずつ明示的に実行することで正常にデバッグできます。これは、他のRcpp初心者が役立つ場合があります(長さについてはお詫びしますが、省略して曖昧にするよりも明確にする方がよいと思います)。しかし、この開発プロセスは少し面倒で時間がかかります。

質問:

  1. 以下で行うことと比較して、コンパイルされたRcppコードをデバッグするためのより高速および/またはより簡単な方法はありますか?

  2. 私はRstudioの大ファンであり、そのIDEから作成されたデバッグ共有オブジェクトを組み込みたいので、誰かがこれを行う方法を知っているなら、私は知りたいですか? Rstudioは属性を使用しているようですが、コンパイル後に一時ディレクトリに.cppファイルがないように見えるため(以下の例では「file5156292c0b48.cpp」ファイルがないため)、以下の手順4を変更する必要があるようです。

手順:

1)(1回限り)ディレクトリ〜/ .R(。付きの隠しディレクトリ)に移動します。 「Makevars」という名前の新しいファイルを作成し、その中に_CXXFLAGS=-g -O0 -Wall_という行を追加します。

2)ターミナルで、_R -d lldb_と入力してRを起動します。lldbが起動します。

3)lldbコマンドラインでrunと入力します。これでRが起動します。

4)Rcppコードをコンパイルし、コンパイルされたオブジェクトの場所を見つけます。上記の投稿に対するDirkの応答は、これを行う1つの方法を示しています。ここで使用する例を次に示します。 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);
')
_

これにより、コンパイル済みの共有オブジェクトと、Rでsetwd(tempdir())およびlist.files()を実行して見つけることができるその他のファイルが作成されます。「file5156292c0b48.cpp」のような.cppファイルと「」のような.soファイルがあります。 file5156292c0b48.so "

5)Rコマンドラインでdyn.load("file5156292c0b48.so")を実行して、共有オブジェクトをRにロードします。

6)次に、この.soオブジェクトのC++コードをデバッグします。 _ctrl + c_を押してlldbに戻ります。ここで、file5156292c0b48.cppファイルの特定の行にブレークポイントを設定します。別の端末を開き、file5156292c0b48.cppで目的の行番号を調べることにより、正しい行番号を見つけます。行inttheAnswer = 1に対応する行31だとします。上記の私の例では。次に、lldbコマンドラインで_breakpoint set -f file5156292c0b48.cpp -l 31_と入力します。デバッガーは、ブレークポイントが設定されたことなどを出力します...

7)lldbでcontを実行してRに戻り(Enterキーを押すまでRプロンプトは自動的に表示されません)、関数を呼び出します。 Rコマンドラインでfun()を実行します。現在、共有オブジェクトをデバッグしています(nを押して次の行に移動し、p [オブジェクト名]を押して変数を出力するなど)。

29
FXQuantTrader

このような単純なRcppスクリプトをデバッグするには、Rを埋め込む.cppアプリケーション(メイン付き)を作成します。このようにして、Xcodeを使用して直接デバッグできるため、優れたデバッグエクスペリエンスが得られます。

パッケージをデバッグし始めると、さらに複雑になります。

11
Romain Francois

これは難しいです。スタンドアロンのC++アプリケーションでXcodeとEclipseを試しましたが、すべてのヘッダーとライブラリを機能させるのは非常に困難でした。さらに、RcppExportコードは、Xcodeを本当に混乱させているように見えるポインターを介して、実際のR関数を呼び出し、関数にステップインできませんでした。

最終的に(gdbまたはlldb)になりました:Rの場合:_R -d lldb_デバッガーの場合、ブレークポイントを設定します:_b functionName run_ Rの場合:.Call(etc) # or just call your R code which invokes compiled C/C++ codeブレークが発生したら、デバッガーに戻ります。 、フレームなどを調べます。

このlldb/gdb コマンドクイックリファレンス は大いに役立ちました。

この時点で、GUIでこれを実行しようとすることを忘れてください。うまくいけば、Rstudioはこれを実現するでしょう。

2
Jack Wasey