2011-02-12 49 views
13

我目前正在編寫一個R包,並通過R中的Rcpp包使用編譯的C++代碼(Rcpp使像我這樣的非程序員更容易實現R和C++代碼的交互,恕我直言)。如何使用GDB在Emacs中調試R包(使用C代碼)?

我想使用gdb在我的C++程序中調試一些錯誤。我搜索了一下,主要發現了一些在emacs中調試R的資源,R-FAQ,一些郵件here,絕對是R的寫作R擴展手冊。

但是,我這樣做是第一次,我不能走得太遠。任何人都可以給我一些關於如何在emacs中調試R包(或帶有C++/C代碼的擴展)的指針。具體來說,我想利用ESS與R和gdb一起使用Emacs(就像R-FAQ談到的那樣)。

請注意,我確定如何使用gdb只使用 C或C++程序。但是我不能將這些知識轉化爲使用帶有R和擴展的gdb。

回答

1

不幸的是,這並不容易。您需要在ESS,gdb(即Emacs中的gud)和R之間跳轉。最好的描述可能仍然是贏得Writing R Extensions,然而ESS mailing list上有recent thread也討論過這個問題(並注意到一些回覆是在線程所以也請看郵件列表檔案)。

+1

謝謝。不幸的是,我是新手在你提到的主題(由貝茨教授提問並由Maechler教授回答)中提出這個問題。 :-(。 – suncoolsu 2011-02-12 23:14:51

+1

我的用法是從命令行輸入`R -d gdb`,然後用`r`告訴gdb(r)un R,`library(pkg)`,然後ctrl-c進入gdb,設置斷點等等,也就是說,沒有emacs。在我腦海中保留符號名稱和程序邏輯對我來說足夠具有挑戰性,而不必記住emacs/ESS層。 – 2011-02-12 23:24:11

6

您可以利用您現有的調試C++程序的知識,將問題轉化爲純粹的C++開發和調試任務,使用RInside(Rcpp的一個很好的伴侶)。

編寫一個main() C++函數,該函數使用RInside創建一個R實例,執行設置測試用例的R代碼(或源代碼R腳本),然後從main()中調用被測試的函數。

#include <Rcpp.h> 
#include <RInside.h> 
#include "function_under_test.h" 

int main(int argc, char *argv[]) 
{ 
    using namespace std; 
    using namespace Rcpp; 

    RInside R(argc, argv); 

    string evalstr = R"(
     a <- matrix(c(1,1,1, 1,1,1, 1,1,1), nrow = 3, ncol=3) 
    )"; 
    R.parseEvalQ(evalstr); 

    SEXP a = R["a"]; 

    R["b"] = function_under_test(a); 

    evalstr = R"(
     print(b) 
    )"; 
    R.parseEvalQ(evalstr); 

    return 0; 
} 

用gdb通過設置斷點在function_under_test()

這樣你避免R和C++開發環境之間進行切換調試C++程序,並且具有重新安裝將R包時然後繼續照常進行。