के तहत आरसीपीपी जेनरेट डीएलएल के डीबगिंग (लाइन द्वारा लाइन) हाल ही में मैं डीएलएल उत्पन्न करने के लिए आरसीपीपी (इनलाइन) के साथ प्रयोग कर रहा हूं जो आपूर्ति किए गए आर इनपुट पर विभिन्न कार्यों को निष्पादित करता है। मैं आर इनपुट के एक विशिष्ट सेट के बाद, इन डीएलएल लाइन में कोड को डीबग करने में सक्षम होना चाहता हूं। (मैं Windows के तहत काम कर रहा हूँ।)विंडोज
समझने के लिए, एक विशिष्ट उदाहरण है कि किसी को भी चलाने के लिए सक्षम होना चाहिए पर विचार करते हैं ...
नीचे कोड एक बहुत सरल cxxfunction जो केवल इनपुट वेक्टर दोगुना हो जाता है है । ध्यान दें कि एक अतिरिक्त चर myvar
है जो कुछ बार मूल्य बदलता है लेकिन आउटपुट को प्रभावित नहीं करता है - यह जोड़ा गया है ताकि हम यह देखने में सक्षम होंगे कि डिबगिंग प्रक्रिया सही तरीके से चल रही है।
library(inline)
library(Rcpp)
f0 <- cxxfunction(signature(a="numeric"), plugin="Rcpp", body='
Rcpp::NumericVector xa(a);
int myvar = 19;
int na = xa.size();
myvar = 27;
Rcpp::NumericVector out1(na);
for(int i=0; i < na; i++) {
out1[i] = 2*xa[i];
myvar++;
}
myvar = 101;
return(Rcpp::List::create(_["out1"] = out1));
')
हम ऊपर चलाने के बाद, आदेश
getLoadedDLLs()
टाइपिंग आर सत्र में DLLs की एक सूची को लाता है। सूचीबद्ध उपरोक्त प्रक्रिया के द्वारा बनाई गई DLL होना चाहिए कि पिछले एक - यह एक यादृच्छिक अस्थायी नाम है, जो मेरे मामले में
file7e61645c
"फ़ाइल नाम" कॉलम पता चलता है कि cxxfunction स्थान tempdir()
में इस DLL डाल दिया है मेरे लिए जो वर्तमान में
C:/Users/TimP/AppData/Local/Temp/RtmpXuxtpa/file7e61645c.dll
अब, f0
के माध्यम से है DLL कॉल करने के लिए स्पष्ट तरीका है, के रूप में
> f0(c(-7,0.7,77))
$out1
[1] -14.0 1.4 154.0
इस प्रकार है लेकिन हम निश्चित रूप से कर सकते हैं है भी .Call
आदेश का उपयोग कर नाम से सीधे DLL फोन:
> .Call("file7e61645c",c(-7,0.7,77))
$out1
[1] -14.0 1.4 154.0
तो मैं बिंदु जहां मैं एक स्टैंडअलोन DLL सीधे फोन कर रहा हूँ आर इनपुट (यहाँ, वेक्टर c(-7,0.7,77)
) के साथ पहुँच गए हैं, और यह वापसी होने सही ढंग से आर
का जवाब क्या मैं सच में की जरूरत है, हालांकि, पंक्ति-दर-पंक्ति डिबगिंग के लिए एक सुविधा (gdb का उपयोग कर, मुझे लगता है) कि मुझे myvar
का मूल्य निरीक्षण करने के लिए 19 के लिए स्थापित किया जा रहा की अनुमति देगा, है 27, 28, 2 9, 30, और आखिरकार 101 कोड के रूप में प्रगति करता है। ऊपर दिया गया उदाहरण जानबूझकर स्थापित किया गया है ताकि डीएलएल को बुलाकर हमें माईवर के बारे में कुछ भी नहीं बताया जा सके।
स्पष्टीकरण के लिए, यहां "जीत स्थिति" कोड के शरीर में कुछ और जोड़ने के बिना myvar बदलने (मान myvar = 19 पहला कदम होगा!) को देखने में सक्षम है। स्पष्ट रूप से कोड को संकलित करने के तरीके में परिवर्तन की आवश्यकता हो सकती है (क्या डीबगिंग मोड सेटिंग्स चालू हैं?), या जिस तरह से आर कहा जाता है - लेकिन मुझे नहीं पता कि कहां से शुरू करना है। जैसा कि ऊपर बताया गया है, यह सब विंडोज आधारित है।
अंतिम नोट: मेरे प्रयोगों में, मैंने वास्तव में cxxfunction की एक प्रति में कुछ मामूली संशोधन किए ताकि आउटपुट डीएलएल - और उसके भीतर कोड - उपयोगकर्ता द्वारा परिभाषित नाम प्राप्त हो और उपयोगकर्ता द्वारा परिभाषित निर्देशिका में बैठे, बल्कि एक अस्थायी नाम और स्थान से। लेकिन यह सवाल के सार को प्रभावित नहीं करता है।मैं इस बात पर जोर देता हूं कि अगर कोई मुझे नजदीक देता है तो संकलन सेटिंग्स को बदलने के लिए काफी आसान होना चाहिए :)
पूर्णता के लिए, उपरोक्त मूल cxxfunction कॉल में verbose = TRUE को सेट करने से संकलन तर्क को दिखाया गया है निम्न प्रपत्र: सिवाय इसके कि स्ट्रिंग "file7e61645c" (उदाहरण के लिए "testdll") और संबंधित फाइलों पर कॉपी नाम के उपयोगकर्ता की पसंद से हर जगह बदल दिया जाता है
C:/R/R-2.13.2/bin/i386/R CMD SHLIB file7e61645c.cpp 2> file7e61645c.cpp.err.txt
g++ -I"C:/R/R-213~1.2/include" -I"C:/R/R-2.13.2/library/Rcpp/include" -O2 -Wall -c file7e61645c.cpp -o file7e61645c.o
g++ -shared -s -static-libgcc -o file7e61645c.dll tmp.def file7e61645c.o C:/R/R-2.13.2/library/Rcpp/lib/i386/libRcpp.a -LC:/R/R-213~1.2/bin/i386 -lR
मेरे रूपांतरित संस्करण, एक संकलन तर्क से ऊपर के समान है एक और स्थायी स्थान पर। आपकी मदद के लोगों के लिए अग्रिम में
धन्यवाद :)
मैं सीधे मदद नहीं कर सकता, लेकिन मुझे पता है कि Dirk आदि हमेशा सहायक होते हैं। हालांकि वे आम तौर पर [आरसीपीपी ईमेल सूची] पर व्यवसाय करते हैं (http://lists.r-forge.r-project.org/mailman/listinfo/rcpp-devel) –
इस पर कुछ हल्की प्रगति की है, इसलिए एक संक्षिप्त अपडेट । इनलाइन ::: संकलन कोड के साथ खेलना, जिसे cxxfunction के भीतर बुलाया जाता है, मैंने पाया कि 'आर सीएमडी एसएचआईएलबी' के अंत में '--debug' जोड़ने से मुझे डीडीएल के अंदर क्या चल रहा है यह जांचने की अनुमति दी गई है कि जीडीबी और आर। हाउवर , यह एक पूर्ण समाधान नहीं है क्योंकि कुछ चर पहुंच योग्य नहीं थे (जैसे 'i',' i' पर लूप के दौरान); संदेश आया कि उन्हें "अनुकूलित" किया गया था। मुझे लगता है कि इसलिए मुझे संकलन तर्क में "-O2" के साथ "-O2" को प्रतिस्थापित करने की आवश्यकता है ... लेकिन मुझे यह नहीं पता कि यह कैसे किया जाए ... –
मैंने सबूत इकट्ठा किए हैं मुझे बस इतना करना है कि आरएमडी SHLIB कंपाइलर झंडे -ओ 2 से कुछ -g -O0 ... जैसे https://stat.ethz.ch/pipermail/r-devel/2008-November/051390.html पर पोस्ट देखें - लेकिन मुझे निर्दिष्ट करने की आवश्यकता के बारे में एक सटीक बयान की कमी है और कैसे। कुछ ऑनलाइन स्रोतों में '/.R/Makevars.win' पर एक फ़ाइल बनाने का उल्लेख है, लेकिन वे फ़ाइल का वर्णन नहीं करते हैं, और यह पत्र आर से पहले बिंदु के कारण विंडोज में मान्य स्थान नहीं है ... –